如何在Node.js中规范导入文件以适配tsc构建与ts-node-dev运行?
解决方案
你遇到的是TS不同模块规范下开发、构建场景的路径后缀匹配差异问题,不需要手动修改导入路径,按照你使用的模块规范调整配置即可:
注:如果你的项目使用CommonJS规范(package.json中没有
"type": "module"字段),不需要做下述ESM适配,只需要将tsconfig.json的module和moduleResolution都设为CommonJS,导入路径不需要写后缀,开发和构建阶段都可以自动识别文件。
如果你用的是ES模块规范,统一使用.js后缀写导入路径,按以下步骤配置:
1. 升级依赖版本
你当前使用的ts-node 9.1.1、ts-node-dev 1.1.8版本较低,默认不支持将.js后缀的导入映射到同名.ts源文件,先执行更新:
npm install ts-node@latest ts-node-dev@latest --save-dev
2. 修改tsconfig.json配置
在配置文件中新增/修改以下字段:
{ "compilerOptions": { // 其他原有配置保持不变 "module": "NodeNext", "moduleResolution": "NodeNext", "esModuleInterop": true, // 若你的TS版本低于5.0,可删除下一行配置 "allowImportingTsExtensions": true }, "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } }
3. 调整启动命令
给ts-node-dev的启动命令添加--esm参数,示例:
ts-node-dev --esm src/main.ts
配置完成后,所有导入路径统一写.js后缀即可:开发环境ts-node-dev会自动将.js后缀的导入匹配到同名.ts源文件,tsc构建后的JS文件也可以直接在Node环境正常运行,不需要任何路径修改。
常见问题排查
- 若仍提示模块不存在,检查导入路径的大小写是否和实际文件完全一致,ESM模式下Node的模块解析严格区分大小写,和Windows系统默认的文件名大小写不敏感逻辑不同。
- 不要给ts-node-dev添加
--no-file-extension这类禁用后缀识别的启动参数。
内容的提问来源于stack exchange,提问作者Crapaud
相关产品推荐
相关产品推荐

