如何让Node中的TypeScript导入ES6模块无需.js扩展名?
Node + TypeScript ESM 实现无扩展名导入配置方案
已搭建可正常运行的Node + TypeScript API,但使用ES6模块导入时,即便源文件为.ts格式,仍必须添加.js扩展名。若使用.ts扩展名或省略扩展名,会报错:CustomError: Cannot find module 'C:\.....\src\models'
配置修改步骤
步骤1:更新package.json,声明ES模块类型
在package.json根节点添加"type": "module",告诉Node.js当前项目遵循ES模块规范:{ "type": "module", "scripts": { "dev": "nodemon" } }步骤2:调整tsconfig.json的模块解析策略
修改compilerOptions中的moduleResolution为"bundler",该策略支持无扩展名导入逻辑,同时补充必要配置:{ "compilerOptions": { "target": "ES6", "module": "ESNext", "moduleResolution": "bundler", // 核心配置:允许省略导入扩展名 "allowSyntheticDefaultImports": true, "esModuleInterop": true, "outDir": "./build", "strict": true, "skipLibCheck": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }步骤3:修正nodemon.json的监听范围
将watch字段指定为源码目录["src"],避免无效文件触发服务重启:{ "watch": ["src"], "ext": "ts", "exec": "ts-node-esm src/server.ts" }步骤4:修改导入语句,移除.js扩展名
现在可直接使用无扩展名的导入方式:
server.ts:import express from 'express'; import dotenv from 'dotenv'; import { user } from './models'; dotenv.config(); const app = express(); const PORT = process.env.PORT || 3049; app.get('/', (req: express.Request, res: express.Response) => { res.send(user); }); app.listen(PORT, () => { console.log(`listening on port http://localhost:${PORT}`); });models.ts:
import { IUser } from './interfaces'; export const user: IUser = { firstName: "Hendrick", lastName: "Denzmann", accessGroups: ['loggedInUsers', 'members'] };
原理说明
Node.js原生ES模块要求导入必须指定完整扩展名,而moduleResolution: "bundler"是TypeScript为ES模块运行时设计的解析策略,允许省略扩展名,ts-node-esm会自动识别并解析.ts文件。
内容的提问来源于stack exchange,提问作者Edward Tanguay
相关产品推荐
相关产品推荐

