使用esbuild打包TS代码时Couchbase Node SDK报CN_ROOT未定义错误
解决esbuild打包couchbase v4.4.0时出现的CN_ROOT未定义错误
问题根源
couchbase v4.4.0的scripts/prebuilds.js文件中存在未声明变量就赋值的代码:
CN_ROOT = path.resolve(path.dirname(__filename), "..");
在Node.js常规模块加载模式下,未声明的变量会被自动挂载到全局作用域,所以仅转译TS代码时不会报错。但esbuild打包后会将所有模块合并并封装在独立作用域中,这个未声明的变量无法被找到,从而抛出ReferenceError: CN_ROOT is not defined。
解决方案
1. 用esbuild的external选项排除couchbase
修改打包命令,将couchbase标记为外部依赖,不让esbuild打包它,运行时直接从node_modules加载原模块:
esbuild --tsconfig=./tsconfig.build.json --bundle --platform=node --external:couchbase --outfile=dist/index.js ./src/index.ts
这是最简便且推荐的方案,既保留esbuild的打包速度,又避开了couchbase的代码问题。
2. 修复couchbase源码并持久化补丁
如果必须打包couchbase,可以临时修复其源码,并用patch-package持久化修改:
- 安装patch-package:
npm install patch-package --save-dev - 找到
node_modules/couchbase/scripts/prebuilds.js,将未声明的变量赋值修改为:var CN_ROOT = path.resolve(path.dirname(__filename), ".."); - 生成补丁文件:
后续执行npx patch-package couchbasenpm install时,补丁会自动应用,无需重复修改。
3. 升级couchbase版本
检查couchbase的更新日志,升级到v4.4.0之后的版本(如v4.5.0及以上),新版本大概率已经修复了这个变量未声明的代码问题,打包时即可正常运行。
内容的提问来源于stack exchange,提问作者João Casarin
相关产品推荐
相关产品推荐

