Cordova入门第二步创建项目失败,报ReferenceError: globalThis is not defined问题求助
Cordova create命令报错ReferenceError: globalThis is not defined(Node.js v11.15.0环境下无需升级版本的解决办法)
问题描述
我正在遵循Cordova的《快速入门指南》,但在第二步就遇到了阻碍。当我执行cordova create myApp命令创建项目时,操作失败并抛出以下错误信息:
C:\Users\foobar\AppData\Roaming\npm\node_modules\cordova\node_modules\queue-microtask\index.js:5 ? queueMicrotask.bind(globalThis) ^ ReferenceError: globalThis is not defined at Object.<anonymous> (C:\Users\foobar\AppData\Roaming\npm\node_modules\cordova\node_modules\queue-microtask\index.js:5:25) at Module._compile (internal/modules/cjs/loader.js:816:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:827:10) at Module.load (internal/modules/cjs/loader.js:685:32) at Function.Module._load (internal/modules/cjs/loader.js:620:12) at Module.require (internal/modules/cjs/loader.js:723:19) at require (internal/modules/cjs/helpers.js:14:16) at Object.<anonymous> (C:\Users\foobar\AppData\Roaming\npm\node_modules\cordova\node_modules\run-parallel\index.js:4:24) at Module._compile (internal/modules/cjs/loader.js:816:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:827:10)
我猜测这可能是Node.js或npm版本问题,但由于担心破坏其他项目,我不想更换Node.js/npm版本。当前我的版本信息如下:
node --version:v11.15.0npm --version:6.7.0
希望能获取无需更换Node.js/npm版本的解决办法。
解决方案
这个问题的根源是:你当前安装的Cordova版本依赖的queue-microtask包使用了globalThis对象,而globalThis是Node.js v12.0.0及以上版本才支持的特性,你的Node.js v11.15.0不兼容这个API。下面是两个无需升级Node.js的解决办法:
方法1:降级Cordova CLI到兼容版本
最稳妥的方式是安装一个兼容Node.js v11的Cordova版本,比如v9.x系列(该版本明确支持Node.js v10+):
# 先卸载全局的Cordova npm uninstall -g cordova # 安装指定的旧版本 npm install -g cordova@9.0.0
安装完成后,重新执行cordova create myApp,就能正常创建项目了。
方法2:手动修改依赖包代码(临时修复)
如果你不想降级Cordova,可以手动修改报错的queue-microtask模块代码,替换不兼容的globalThis:
- 找到报错文件路径:
C:\Users\foobar\AppData\Roaming\npm\node_modules\cordova\node_modules\queue-microtask\index.js - 打开文件后,将第5行的代码:
替换为兼容旧Node.js的写法:queueMicrotask.bind(globalThis)
(在Node.js环境下,直接写queueMicrotask.bind(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : {})queueMicrotask.bind(global)也能正常工作) - 保存文件后,重新运行
cordova create myApp命令即可。
注意:这种方法是临时修复,后续如果更新Cordova或其依赖包,修改的代码会被覆盖,所以更推荐方法1。
内容的提问来源于stack exchange,提问作者user3700562
相关产品推荐
相关产品推荐

