无需配置!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秘密花园