如何让 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
       }
相关推荐
西部森林牧歌3 小时前
Arbess零基础学习 - 使用Arbess+GitLab实现Node.js项目自动化构建/主机部署
ci/cd·node.js·gitlab·arbess·tiklab devops
Smile_2542204187 小时前
nodered 下载 excel 文件
node.js·excel
二进制星轨8 小时前
在 Ubuntu 上快速配置 Node.js 环境(附问题说明)
linux·ubuntu·node.js
黄毛火烧雪下8 小时前
Node.js 自动替换脚本工具:一键完成多项目批量修改与资源替换
node.js·ci
kuxku9 小时前
使用 SSE 与 Streamdown 实现 Markdown 流式渲染
前端·javascript·node.js
披萨心肠10 小时前
Typescript数组与元组类型
typescript·编程语言
一点七加一11 小时前
Harmony鸿蒙开发0基础入门到精通Day11--TypeScript篇
前端·javascript·typescript
BLOOM11 小时前
一款注解驱动的axios工具
javascript·typescript
冴羽1 天前
今日苹果 App Store 前端源码泄露,赶紧 fork 一份看看
前端·javascript·typescript
书中自有妍如玉1 天前
Node.Js Express Sqlite3 接口开发
node.js·express