【发布时间】:2018-09-25 06:32:04
【问题描述】:
项目中使用axios,然后使用rollup打包。
在浏览器端,这是正常的。但是nodejs端报错。
错误信息:
node test\test.js
error
ReferenceError: XMLHttpRequest is not defined
at dispatchXhrRequest (D:\Project\NodeJs\rollup-axios-error-demo\dist\demo.js:684:21)
at new Promise (<anonymous>)
at xhrAdapter (D:\Project\NodeJs\rollup-axios-error-demo\dist\demo.js:676:12)
at dispatchRequest (D:\Project\NodeJs\rollup-axios-error-demo\dist\demo.js:1082:12)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
我创建了一个演示供您查看:rollup-axios-error-demo
axios源码区分运行环境的代码为:
function getDefaultAdapter() {
var adapter;
if (typeof XMLHttpRequest !== 'undefined') {
// For browsers use XHR adapter
adapter = require('./adapters/xhr');
} else if (typeof process !== 'undefined') {
// For node use HTTP adapter
adapter = require('./adapters/http');
}
return adapter;
}
但是打包之后就变成了:
function getDefaultAdapter() {
var adapter;
if (typeof XMLHttpRequest !== 'undefined') {
// For browsers use XHR adapter
adapter = xhr;
} else if (typeof process !== 'undefined') {
// For node use HTTP adapter
adapter = xhr;
}
return adapter;
}
导致 XMLHttpRequest 在 nodejs 端被实例化
【问题讨论】:
-
你找到解决办法了吗?...
-
不,我写了一个兼容浏览器和nodejs的http请求代码。使用require来引入http和http。解决打包失败的问题
-
这个问题,即使换了webpack也不行。
-
在测试一个基于 dom 的实用程序时,我遇到了类似的问题。我最终为基于 dom 的缺失函数添加了模拟。在这种情况下,您可以使用 npmjs.com/package/mock-xmlhttprequest 模拟 XMLHttpRequest