无需配置!Node.js 23 支持原生 TypeScript 执行!

Node.js 23 即将能够直接运行 TypeScript 文件而无需额外配置。

这一功能的背后推动者是 Marco Ippolito。他为 Node.js 23 提交了一项重要的修改,成功取消了 --experimental-strip-types 标志。

图片

这意味着我们可以直接编写包含类型注释的 index.ts 文件,并直接使用 node index.ts 命令执行。这时,Node.js 会借助某个版本的 swc 移除类型注释,然后运行生成的 JavaScript 代码。

目前,该功能已在 Node Nightly 版本中可用。预计在几天后,它将会在 Node 23 的正式版本中发布。

另外值得注意的是,Node.js 并不会为我们进行自动的类型检查。

Node.js 只负责执行,不进行类型检查。这样设计的好处是,类型检查可以独立于应用程序的执行过程进行。如果需要类型检查,你需要在本地运行 tsc --watch

以下是优化后的 tsconfig.json 配置建议:

{
  "compilerOptions": {
    "esModuleInterop": true, // 允许与 ES 模块互通
    "skipLibCheck": true, // 跳过库文件的类型检查
    "target": "es2022", // 指定 ECMAScript 目标版本
    "allowJs": true, // 允许编译 JavaScript 文件
    "resolveJsonModule": true, // 允许导入 JSON 文件
    "moduleDetection": "force", // 强制模块检测
    "isolatedModules": true, // 启用单独模块编译
    "verbatimModuleSyntax": true, // 保留模块语法
    "strict": true, // 启用严格模式
    "noUncheckedIndexedAccess": true, // 禁止未检查的索引访问
    "noImplicitOverride": true, // 禁止隐式的 override 行为
    "allowImportingTsExtensions": true, // 允许导入 TypeScript 扩展名
    "module": "NodeNext", // 使用 Node 特有的模块系统
    "noEmit": true, // 禁止输出文件
    "lib": ["es2022"] // 使用 ES2022 标准库
  }
}

另外目前 Node.js 默认还不支持 Enums 和 Namespaces。如果需要使用这些特性,可以添加 --experimental-transform-types 标志进行实验性支持。尽管如此,支持仅限于类型上的 declare namespace,而运行时不支持。

那 TypeScript 项目还需要转译为 JavaScript 吗?

对 Node 应用而言: 如果你将应用程序部署到 Serverless 平台,答案是是的,转译优化能缩短冷启动时间。如果冷启动时间不重要,而应用程序一旦运行后影响不大,则可以不必转译。但如果你的应用程序在运行时动态加载 TypeScript 文件,需要慎重考虑。

对于库: 依旧推荐转译 TypeScript 到 JavaScript,原因有二:保证 JavaScript 用户可以使用你的库,以及提升 TypeScript 用户的使用体验。

对于 MonoRepo 结构: 即使只在此结构中使用自身的库,仍然建议转译 TypeScript 文件以提高性能。

图片

另外,TypeScript 支持还将会覆盖至 Node 22,但不会涉及 Node 20。开发者 Marco 已在社交平台(X)上确认了这一消息。

来源:code秘密花园

THE END