tsup在Node项目中比tsc+webpack更轻,因其底层用esbuild,编译速度快10–20倍、体积更小,不模拟CommonJS解析、不AST摇树,直出bundling;但不支持动态require路径、__dirname等运行时细节,需显式配置platform:'node'、format:'cjs'或'esm',且默认不生成.d.ts,须加--dts。

直接用 tsup 替代 tsc + webpack 是可行的,但必须改掉 Node 项目默认的构建假设——它不生成 outDir 下的多文件结构,而是输出单个入口文件(或多个入口对应多个产物),且默认不处理 require 动态路径、__dirname、process.env 注入等 Node 运行时细节。
为什么 tsup 在 Node 项目里比 tsc + webpack 更轻?
tsup 底层用 esbuild,编译速度通常是 tsc 的 10–20 倍,打包体积也更小;它不模拟 CommonJS 模块解析逻辑,也不做 AST 分析式摇树,而是靠 esbuild 的原生 bundling 能力直出。但代价是:不支持 require('./config/' + env) 这类运行时拼接路径,也不自动替换 process.env.NODE_ENV。
- 如果你的项目只用静态
import/require,无动态加载、无__dirname依赖,tsup开箱即用 - 如果用了
dotenv或需要注入环境变量,得加--env参数或手动在入口文件里require('dotenv').config() -
tsup默认不生成.d.ts,要发布类型需显式加--dts
tsup 配置 Node 入口和输出格式的关键参数
Node 项目打包必须明确指定 platform: 'node' 和 format: 'cjs'(或 'esm'),否则生成的代码可能在 require() 时失败。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 入口文件必须是 CommonJS 风格(含
module.exports或exports.xxx),ESM 入口需设"type": "module"并用--format esm - 命令行示例:
tsup src/index.ts --platform node --format cjs --out-dir dist --minify - 若项目依赖 native addon(如
sqlite3),tsup不会打包二进制,需保留node_modules并用--external sqlite3 -
--sourcemap可开启,但调试时注意 VSCode 的launch.json中outFiles要指向dist/**/*.js,而非src/**/*
本地热编译:tsup --watch 不等于 nodemon
tsup --watch 只监听源码变化并重新打包,不会重启进程;它不感知 package.json 里 type: "module" 的变更,也不自动杀掉上一个 node 进程。
- 正确组合是:
tsup --watch+nodemon --watch dist --exec node dist/index.js - 或者用
tsx watch(需安装tsx)替代,它支持 TS + 热重载 +require钩子,但不是打包工具 - 如果用了路径别名(如
@/utils),tsup不解析tsconfig.json的paths,得靠tsup.config.ts手动配置resolveOptions.alias -
tsup --watch期间修改tsconfig.json不会触发重载,必须 Ctrl+C 再重跑
常见报错与绕过方式
遇到 Error: Cannot find module 'xxx' 或 ReferenceError: __dirname is not defined 是最常卡住的地方。
-
__dirname/__filename报错:加--define __dirname=\"'./'\"(仅限字符串字面量场景),或改用fileURLToPath(import.meta.url)+path.dirname() -
Cannot find module 'fs/promises':Node 14+ 才原生支持,确保target设为ES2020或更高,并在tsup.config.ts中设shims: true -
TS2307: Cannot find module './config.json':JSON 导入需在tsconfig.json中启用"resolveJsonModule": true,且tsup要加--loader '.json=js' - 使用了
node-fetch或got等 HTTP 客户端:它们内部可能用globalThis或AbortController,需确认目标 Node 版本是否支持,否则加--no-tree-shaking保底
真正麻烦的不是打包本身,而是你原来靠 tsc 生成的 outDir 结构被扁平化后,所有 require('../lib/utils') 都得重写成相对路径,且 node_modules 里的 CJS 包若用了 exports 字段,esbuild 可能解析失败——这时候就得退回到 webpack,或者手动 --external 掉它们。

















