node:ReferenceError: XMLHttpRequest is not defined
1 前言
node执行如下代码:
javascript
new XMLHttpRequest()
报错提示:ReferenceError: XMLHttpRequest is not defined
2 解决
2.1 可能原因是没有安装xmlhttprequest
javascript
npm install xmlhttprequest
使用淘宝镜像源安装成功:
javascript
https://registry.npmmirror.com/
package-lock.json:
2.2 安装xmlhttprequest后需要引入
上述直接定义方式为如下:
javascript
new XMLHttpRequest()
安装后node执行依然报错提示:ReferenceError: XMLHttpRequest is not defined,是因为还需要引入使用。
使用node命令,那么需要使用CommonJS模块系统的require,引入如下:
javascript
let request = require('xmlhttprequest').XMLHttpRequest;
重新执行node xx.js不再报错。
2.3 如何使用模块Module的方式引入呢?
因为Node生态包含两个不同的模块系统,ESM(ECMAScript模块)和 CommonJS,两个模块系统彼此不兼容。如果我们希望使用module引入的方式来执行(ECMAScript),而不是上面的CommonJS的require引入,修改如下:
javascript
import * as request from "xmlhttprequest";
但是直接执行报错提示:SyntaxError: Cannot use import statement outside a module
解决方式是在执行的js文件所在目录下的package.json文件中,添加如下配置:
javascript
"type":"module",
但是因为这里是跑的demo项目,没有package.json文件,这里我在开启终端的文件目录下生成package.json文件:
生成package.json的命令:
javascript
npm init -y
或者npm init(需要多次回车确定以及输入yes)
生成 package-lock.json
javascript
npm install --package-lock-only
在首次安装依赖包时会创建package-lock.json文件,这里我们使用npm init生成package.json文件即可:
在es6目录下的终端输入npm init后,生成package.json文件:
新增如下配置:
javascript
"type":"module",
再次执行如下:
javascript
import * as request from "xmlhttprequest";
const req = new request.XMLHttpRequest();
console.log(req)
执行无误: