使用npx调用Deno脚本时出现__DENO_NODE_GLOBAL_THIS_未定义错误
解决npx调用Deno脚本的报错问题
问题原因
npm的bin机制在生成可执行脚本时,会自动创建Node.js兼容的包装器,直接尝试用Node解析你的.ts文件,而非交给Deno处理,导致Deno专属全局变量未定义,抛出__DENO_NODE_GLOBAL_THIS_xxx__ is not defined错误。
解决方案:添加Node桥接脚本
通过一个Node.js脚本作为中间层,调用Deno执行TypeScript代码,具体步骤如下:
- 在
my-lib目录下创建my-lib.js文件,内容如下:
const { spawnSync } = require('child_process'); const path = require('path'); // 优先使用环境变量中的Deno路径,默认用系统全局deno const denoExecutable = process.env.DENO_PATH || 'deno'; // 定位到你的Deno脚本文件 const denoScript = path.resolve(__dirname, 'my-lib.ts'); // 调用Deno执行脚本,继承当前进程的输入输出 const runResult = spawnSync(denoExecutable, ['run', '-A', denoScript], { stdio: 'inherit' }); // 传递Deno脚本的退出码给当前进程 process.exit(runResult.status);
- 修改
package.json的bin配置,指向这个Node桥接脚本:
{ "name": "my-lib", "bin": { "my-lib": "./my-lib.js" } }
- 重新执行
npm link(若之前已link,先执行npm unlink再重新link),之后在客户端包中执行npx my-lib即可正常调用Deno脚本。
可选优化:跨平台支持
如果需要兼容Windows系统,可使用cross-spawn替代原生child_process.spawnSync,避免路径和参数的跨平台问题:
- 安装依赖:
npm install cross-spawn --save
- 修改
my-lib.js:
const spawnSync = require('cross-spawn').sync; const path = require('path'); const denoExecutable = process.env.DENO_PATH || 'deno'; const denoScript = path.resolve(__dirname, 'my-lib.ts'); const runResult = spawnSync(denoExecutable, ['run', '-A', denoScript], { stdio: 'inherit' }); process.exit(runResult.status);
内容的提问来源于stack exchange,提问作者RobertAKARobin
相关产品推荐
相关产品推荐

