ts 运行时和打包问题
esm问题
两个关于模块配置项
compilerOptions.module 决定tsc打包模块后的输出,如esm或cjs
compilerOptions.moduleResolution 影响的是在执行node xxx.ts
时候 模块解析过程,用在运行时
import cjs包冲突怎么办
当通过 esm 使用到node 内置模块的时候,import path from "node:path";
可能会报错类似于 :
模块 ""node:path"" 只能在使用 "esModuleInterop" 标志时进行默认导入ts(1259)
path.d.ts(191, 5): 此模块是使用 “export =” 声明的,只能在使用“esModuleInterop”标志时用于默认导入
只需要打开此项即可 compilerOptions.esModuleInterop,作用就是处理cjs于esm冲突
esm和tsc要求冲突
esm要求导入文件必学携带后缀,但是 tsc 要求你在 ts 文件中不能携带后缀。
临时的解决方案是 “源码虽然是 esm+ts,但是导入的时候不写后缀,并将打包后的输出 compilerOptions.module 配置为 cjs (既默认值)”
或者你使用 webpack 或者 vite 或者 esbuild 更完整的搭建工具链,从而生成你需要的构建结果
直接运行ts
在node v23的时候已经直接支持直接运行ts文件 node test.ts
,但是再此版本之前:
- 你需要借助tsc
- 如果你不想显式编译,而是直接运行 可以借助于 ts-node、tsx,
- 如果你还需要热更新 可以考虑 ts-node-dev 或者 nodemon+tsx等方案
推荐 tsx,因为现阶段 ts-node已经摆烂了
短路径(别名)
推荐此包 tsc-alias