"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"
    }
  }
}