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

posted @ 2025-03-24 14:32  丁少华  阅读(51)  评论(0)    收藏  举报