"module": "commonjs" in tsconfig.json 可以用于 Next.js 项目吗?在 Next.js Typescript 项目中使用 ts-node 到 运行 脚本
Is it ok to use "module": "commonjs" in tsconfig.json for a Next.js project? Using ts-node to run scripts in a Next.js Typescript project
这是由 Next.js
自动生成的默认 tsconfig.json
文件。
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext", // <=== THIS IS THE PROBLEM
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules"
]
}
我的问题是我在项目中 运行 一些脚本,我使用 ts-node
到 运行 它们。
我在尝试 运行 有一些导入的脚本时遇到了各种各样的错误。
例如:
import fs from "fs";
console.log("HERE");
我得到:Unexpected token export
而且我注意到如果对 tsconfig.json
进行以下更改
"module": "esnext", // DELETE THIS LINE
"module": "commonjs" // ADD THIS LINE
现在脚本 运行 没问题了。
问题
我不想弄乱 Next.js
自动生成的 tsconfig.json
。可以进行更改吗?我是在破坏还是有破坏某些东西的风险?我应该创建一个不同的 tsconfig.json
文件吗?这里最好的选择是什么?
我最终选择不破坏 tsconfig.json
文件的 Next.js
默认设置。
所以我创建了一个新的配置文件,并将其命名为 tsconfig_scripts.json
。
与tsconfig.json
内容基本相同。我刚刚更新了这些部分:
tsconfig_scripts.json
"module": "commonjs", // CHANGED TO THIS
"ts-node": { // ADDED THIS
"files": true
},
我还添加了一个 npm 脚本来以更简单的方式调用 ts-node
:
package.json
"scripts": {
"ts-node-script": "ts-node --project tsconfig_scripts.json -r tsconfig-paths/register"
}
备注:
--project tsconfig_scripts.json
设置新的自定义配置文件
-r tsconfig-paths/register
允许您在脚本文件上使用路径别名
要使用它,您只需从 CLI 运行 执行此操作:
npm run ts-node-script path/to/your/script.ts
将此 ts-node
字段添加到我的 tsconfig.json 成功了!
{
"compilerOptions": {
...
},
"include": [...],
"exclude": ["node_modules"],
"ts-node": {
"transpileOnly": true,
"compilerOptions": {
"module": "commonjs"
}
}
}
这是由 Next.js
自动生成的默认 tsconfig.json
文件。
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext", // <=== THIS IS THE PROBLEM
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules"
]
}
我的问题是我在项目中 运行 一些脚本,我使用 ts-node
到 运行 它们。
我在尝试 运行 有一些导入的脚本时遇到了各种各样的错误。
例如:
import fs from "fs";
console.log("HERE");
我得到:Unexpected token export
而且我注意到如果对 tsconfig.json
"module": "esnext", // DELETE THIS LINE
"module": "commonjs" // ADD THIS LINE
现在脚本 运行 没问题了。
问题
我不想弄乱 Next.js
自动生成的 tsconfig.json
。可以进行更改吗?我是在破坏还是有破坏某些东西的风险?我应该创建一个不同的 tsconfig.json
文件吗?这里最好的选择是什么?
我最终选择不破坏 tsconfig.json
文件的 Next.js
默认设置。
所以我创建了一个新的配置文件,并将其命名为 tsconfig_scripts.json
。
与tsconfig.json
内容基本相同。我刚刚更新了这些部分:
tsconfig_scripts.json
"module": "commonjs", // CHANGED TO THIS
"ts-node": { // ADDED THIS
"files": true
},
我还添加了一个 npm 脚本来以更简单的方式调用 ts-node
:
package.json
"scripts": {
"ts-node-script": "ts-node --project tsconfig_scripts.json -r tsconfig-paths/register"
}
备注:
--project tsconfig_scripts.json
设置新的自定义配置文件-r tsconfig-paths/register
允许您在脚本文件上使用路径别名
要使用它,您只需从 CLI 运行 执行此操作:
npm run ts-node-script path/to/your/script.ts
将此 ts-node
字段添加到我的 tsconfig.json 成功了!
{
"compilerOptions": {
...
},
"include": [...],
"exclude": ["node_modules"],
"ts-node": {
"transpileOnly": true,
"compilerOptions": {
"module": "commonjs"
}
}
}