如何让 vite 编译含有 Node.js 模块的 TS 文件 ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING

背景

假如我们的包有个脚本 scripts/check-authorization-update.ts 使用 ts 写的,但是目前(2025-4-10 v23)Node.js 并不支持也不打算支持运行 node_modules 内的 ts 文件(deno 可以),否则会报错 Error [ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING]: Stripping types is currently unsupported for files under node_modules

有几种解决办法:

  1. 【不编译】 重写成 mjs,能最小改动,因为可以保留 import / export 只需将类型改成 tsdoc。
  2. 【不编译】 将需要直接加载的 .ts 文件移出 node_modules 目录,因为 Node.js 对 node_modules 目录下的文件有特殊的处理逻辑,不支持直接加载 TypeScript 文件[1]。这个很巧妙,但是需要再写一个脚本。
  3. 【编译】vite。

本文列举一个通过 vite 编译的方式,将脚本编译为 js。设置如下:

diff 复制代码
index f23ccf7..b3fdc86 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -30,12 +30,18 @@ export default defineConfig({
     sourcemap: true,
 
     lib: {
-      entry: resolve(__dirname, 'src/index.ts'),
+      entry: [
+        resolve(__dirname, 'src/index.ts'),
+        resolve(__dirname, 'scripts/check-authorization-update.ts'),
+      ],
       formats: ['es'],
       fileName: (_format, entryName) => `${entryName}.js`,
     },
 
     rollupOptions: {
+      // 外部化处理 Node.js 原生模块和不想打包在内 node 三方模块(tar)
+      external: ['node:fs', 'node:fs/promises', 'node:path', 'node:https', 'tar'],
+
       output: {
         preserveModules: true, // 保留模块结构,便于 Tree Shaking
       }
相关推荐
A-Kamen8 小时前
Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
前端·webpack·node.js
OpenTiny社区14 小时前
Node.js技术原理分析系列7——Node.js模块加载方式分析
前端·node.js
程序员小续15 小时前
TypeScript中any、unknown、never的区别
前端·面试·typescript
云草桑15 小时前
C# net CMS相关开源软件 技术选型 可行性分析
typescript·c#·cms
y_y15 小时前
TypeScript不要背,炸至两面金黄,隔壁小孩都学哭了...
typescript
Chaoran16 小时前
vue 插槽的使用和插槽的本质
前端·vue.js·typescript
kovlistudio16 小时前
红宝书第三十六讲:持续集成(CI)配置入门指南
开发语言·前端·javascript·ci/cd·npm·node.js
小鱼计算机18 小时前
【6】深入学习http模块(万字)-Nodejs开发入门
前端·javascript·http·node.js·http请求
evamango19 小时前
TypeScript 写 gulp 任务
typescript·gulp
橘右溪21 小时前
Node.js中URL模块详解
node.js