You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typescript+Node配置循环:如何无妥协支持ES模块与import.meta

可直接落地的无妥协配置方案

完整支持ES Modules、import.meta等所有ES特性,无需修改TS文件后缀,兼容Node+Express开发场景。

第一步:配置package.json

  1. 先添加ESM标识:
{
  "type": "module"
}
  1. 安装必要开发依赖:
npm install typescript @types/node @types/express tsx -D
  1. 添加运行/编译脚本:
{
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

第二步:配置tsconfig.json

核心是module和moduleResolution字段使用NodeNext,匹配Node原生ESM规范,完整配置参考:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "strict": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "resolveJsonModule": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

注意事项

  • 本地文件导入需要补全.js后缀:例如导入src/utils.ts时,代码中需要写import { xxx } from './utils.js',TS会自动匹配对应的.ts源文件,该规则是Node ESM的强制要求,不属于额外妥协项。
  • 原CommonJS下的__dirname/__filename变量在ESM中可通过import.meta实现:
import path from 'path';
const __filename = new URL(import.meta.url).pathname;
const __dirname = path.dirname(__filename);

过往问题原因说明

  • 添加"type": "module"后报.ts后缀未知,是因为直接使用node或旧版ts-node运行TS文件导致,tsx基于esbuild实现,自动处理TS转译和ESM加载逻辑,可直接运行.ts文件。
  • import.meta在module: NodeNext配置下默认支持,不会触发编译报错,安装最新版@types/node即可获得完整类型提示。

内容的提问来源于stack exchange,提问作者Peter S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:15:02