背景
假如我们的包有个脚本 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
。
有几种解决办法:
- 【不编译】 重写成 mjs,能最小改动,因为可以保留
import / export
只需将类型改成 tsdoc。 - 【不编译】 将需要直接加载的
.ts
文件移出node_modules
目录,因为 Node.js 对node_modules
目录下的文件有特殊的处理逻辑,不支持直接加载 TypeScript 文件[1]。这个很巧妙,但是需要再写一个脚本。 - 【编译】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
}