无需package.json与tsconfig.json,如何编译运行TypeScript ES模块?
你的操作是正确的,这里有更简洁的优化方案
一、先确认:你的操作是正确的
你用.mts作为TypeScript ES模块的源文件扩展名、编译后导入.mjs文件的方式完全符合规范:
.mts是TypeScript官方定义的ES模块专用扩展名,tsc编译后会生成对应的.mjs文件;- Node.js对ES模块的导入路径要求严格,必须指定完整扩展名(
.mjs),所以你写import {test} from './test.mjs'是符合Node.js ES模块规则的。
二、更优的简化方案(不用每次写长命令+更规范的项目结构)
通过tsconfig.json和package.json的配置,可以不用依赖.mts/.mjs扩展名,同时简化编译命令,步骤如下:
1. 初始化项目配置
创建package.json并添加ES模块标识:
{ "type": "module" }
创建tsconfig.json,配置TypeScript的模块规则和输出目录:
{ "compilerOptions": { "module": "NodeNext", // 遵循Node.js的模块系统规则 "moduleResolution": "NodeNext", // 用Node.js的模块解析逻辑 "target": "ES2020", // 适配Node.js的ES版本 "outDir": "./dist", // 编译产物输出到dist目录 "rootDir": "./src", // 源码放在src目录 "strict": true // 开启严格类型检查(可选但推荐) } }
2. 整理源码文件
在项目根目录创建src文件夹,里面放常规.ts扩展名的文件:
// src/test.ts export function test(s: string) { console.log('test, s:' + s); }
// src/main.ts import { test } from './test.js'; // 注意这里写.js,TS会自动映射到src/test.ts test('a'); console.log('done');
3. 编译运行
现在只需要两条简单命令(甚至可以把命令写到package.json的scripts里):
tsc && node dist/main.js
三、方案说明
package.json里的"type": "module"告诉Node.js:项目中所有.js文件默认都是ES模块,不用靠.mjs扩展名区分;tsconfig.json的module: NodeNext让TypeScript完全对齐Node.js的模块规则,编译时会自动把src里的.ts文件转成dist里的.js,同时处理导入路径的扩展名映射;- 用
src和dist分离源码和产物,项目结构更清晰,也方便后续扩展。
如果只是临时测试,你原来的方式完全没问题;但如果是长期项目,上面的配置方案更规范、更易维护。
内容的提问来源于stack exchange,提问作者relent95
相关产品推荐
相关产品推荐

