如何编译包含import导入语句的TypeScript代码且不修改原有导入写法
解决方案
你当前配置的核心冲突是package.json设置了"type": "module"(Node会将项目内的.js文件识别为ES模块,要求使用import/export语法),但tsconfig.json配置输出CommonJS规范的代码,同时build脚本写法错误导致tsconfig配置不生效。按以下步骤修改即可实现编译后保留import导入写法,无需手动调整:
1. 修改tsconfig.json配置
把compilerOptions下的module和moduleResolution参数调整为适配ES模块的配置,修改后完整配置如下:
{ "compilerOptions": { "lib": ["ESNext"], "module": "ESNext", // 输出ES模块规范代码,保留import写法 "moduleResolution": "nodenext", // 适配Node.js的ES模块解析规则 "target": "ESNext", "outDir": "dist", "sourceMap": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true, "skipDefaultLibCheck": true, "declaration": true, "resolveJsonModule": true }, "include": ["src", "Citation"], "exclude": ["node_modules"] }
2. 修改package.json的scripts配置
- 原有build命令直接指定入口文件会导致tsconfig.json配置完全失效,需去掉入口文件参数
- ts-node-dev运行ES模块代码需要新增
--esm参数
修改后scripts部分如下:
{ "scripts": { "start": "ts-node-dev --respawn --transpile-only --poll --esm ./src", "build": "tsc -w", // 直接调用tsc会自动读取当前目录tsconfig.json配置 "test": "node dist/index.js --experimental-specifier-resolution=node" } }
3. 代码导入写法适配
ES模块规范要求相对路径导入必须携带完整后缀,你在TS源码中写本地文件导入时,需要补全.js后缀,示例:
// 正确写法,编译后JS会保留该路径无需修改 import { util } from './utils.js' // 错误写法,缺少后缀会导致编译后JS运行报错 import { util } from './utils'
TS会自动识别对应.ts文件的类型定义,不需要担心后缀写错的问题。
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

