如何让 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
       }
相关推荐
iDao技术魔方20 分钟前
Bun v1.4.4 实战:用 bun fmt 替掉 prettier 的 5 个步骤
typescript·1024程序员节
梅雅达编程笔记32 分钟前
Day 17 | uni-app 小程序:前端从零搭建
微信小程序·typescript·uni-app·vue3·pinia·前端开发·全栈
编程的一拳超人35 分钟前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
lucas_AI42 分钟前
今年 2 月就修好的漏洞,10 月才炸:HTTP2Shell 把 Node、Python 一锅端
node.js
康小旺14 小时前
TypeScript 编译器开始卷 Rust 了:Cloudflare 的 tsrs 到底想干嘛?
rust·typescript
nyaomaru1 天前
is-kit 达成 100 Stars ⭐🎉 从 50 到 100,发生了什么?
前端·typescript
SEO_juper1 天前
Node.js 全站死链检测工具:从 sitemap 出发一次找全 404
开发语言·人工智能·python·node.js·seo·外贸独立站
ZoeLandia2 天前
React6:组件通信
前端·react.js·typescript
孟陬2 天前
解决动态 import 类型 Any 痼癖
typescript·node.js·bun
Dumbness2 天前
后台管理员把自己锁在门外:RBAC 里「自己的权限只能由别人来减」
安全·node.js