node.js - Script Typescript, ERR_MODULE_NOT_FOUND, chạy một script với ts-node mà nhập khẩu các tệp khác
Tôi đang rối tung lên vì một trường hợp sử dụng rất đơn giản. Tôi có một monorepo và bên trong monorepo tôi có một package chứa một số tiện ích cho cơ sở dữ liệu và các schema của tôi. Tôi muốn viết một script để seed cơ sở dữ liệu và tôi đã quyết định sử dụng ts-node để chạy script này. Giờ đây điều này có vẻ đơn giản một cách đủ, tôi chỉ muốn chạy một file, nhưng tôi không thể làm nó hoạt động. Tôi đã gặp lỗi module not found, unknown file type .ts và nhiều biến thể của những lỗi này.
Cấu trúc tệp của tôi
src/ <- db helpers
scripts/ <- here's the script file I want to run
tsconfig.json
Tệp tsconfig.json của tôi
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": ".",
"paths": { <- I tried using relative paths and absolute
"@company/db/*": [
"src/*"
]
}
},
"include": [ <- make sure everything is included
"index.ts",
"src/**/*",
"scripts/**/*"
],
"ts-node": {
"esm": true, <- make sure esm is set
"require": [ <- I tried using relative paths and absolute
"tsconfig-paths/register"
]
}
}
// tsconfig.base.json
{
"compilerOptions": {
"target": "es2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"checkJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"noUncheckedIndexedAccess": true
}
}
{
"name": "@company/db",
"version": "0.1.0",
"main": "./index.ts",
"type": "module", <- this is also set
"types": "./index.ts",
"license": "MIT",
"scripts": {
"seed": "pnpm with-env ts-node ./scripts/seed.ts",
Cũng đã thử thêm NODE_PATH=./ để khớp với đường dẫn gốc
Đoạn kịch bản mà tôi đang cố chạy
import { randomUUID } from "crypto";
import { db, connectDB } from "../src/db"; <- tried absolute paths as well with aliases
import { employees } from "../src/schemas";
../src/db cũng nhập khẩu các tệp .ts khác và các gói khác từ monorepo
> @company/[email with-env /app/packages/db
> dotenv -e ../../.env -- "ts-node" "./scripts/seed.ts"
/app/node_modules/ts-node/dist-raw/node-internal-modules-esm-resolve.js:366
throw new ERR_MODULE_NOT_FOUND(
^
CustomError: Cannot find module '/app/packages/db/src/db' imported from /app/packages/db/scripts/seed.ts
Ví dụ về lỗi mà tôi đang gặp phải, tôi cũng đã thấy những trường hợp khác. Tôi đã thử tất cả các giải pháp từ các vấn đề trên GitHub, tôi đã thử sử dụng esrun và các lựa chọn thay thế khác. Điều này dường như là một trường hợp sử dụng phổ biến nhưng tôi không hiểu tại sao lại khó thiết lập như vậy.
Câu trả lời #1
Sử dụng tsx cho các tập lệnh như vậy.
Hy vọng, bun.sh sẽ sớm là một lựa chọn thay thế tốt hơn. Nó chưa có trên Windows nhưng hoạt động ở mọi nơi khác.