【发布时间】:2021-09-29 19:07:49
【问题描述】:
最近将一个项目升级到 Gatsby 3,其依赖项是 Webpack 5。在其中一个 .tsx 类中,完成了对库 countdown 的导入。 import 每次都会返回一个空对象,{}。
查看“倒计时”库中的代码,我看到他们像这样导出模块:
/*global window */
var module;
var countdown = (
function(module) {
'use strict';
...
if (module && module.exports) {
module.exports = countdown;
} else if (typeof window.define === 'function' && typeof window.define.amd !== 'undefined') {
window.define('countdown', [], function() {
return countdown;
});
}
return countdown;
})(module);
在库中使用 console.log 我看到 module.exports 实际上是未定义的,似乎 var module; 覆盖了任何东西当调用 import 时,节点使值可用。为了验证假设,我删除了 var 模块; 并将其作为函数的参数删除,一切正常。当然,这不是我的问题的答案,因为这是一个依赖库,我无权触摸它的代码。
我不知道升级到 Webpack 5 可能会破坏什么,即使 module.exports 对 countdown.js 可用,即使他们声明了变量。
我查看了webpack updates 并试图告诉它在countdown.js 上使用commonjs 或import-loader 并将它传递给“模块”(不同的测试用例已被注释掉):
module: {
rules: [
{
test: /\countdown.js?$/,
use: {
loader: 'babel-loader',
},
// loader: "imports-loader",
// options: {
// syntax: "default",
// type: "commonjs"
// },
// use: [
// {
// loader: "imports-loader",
// options: {
// thisArg: "module"
// },
// },
// ],
},
],
}
这些都不起作用。我不太清楚 Webpack 5 中发生了什么变化导致 countdown 导出库的方式中断。
有什么想法吗?
明确一点:库 countdown 不是我的,在使用以前的 webpack 版本时,它在导入和使用时效果很好。
【问题讨论】:
-
这并不能解决您的问题,但
Of course, that's not the answer to my problem since this is a dependency library, I have no right to touch its code.并非如此,您总是可以为开源项目创建问题和/或拉取请求。 -
webpack 5 现在似乎以不同的方式对待
module。更像是一个关键字而不是一个全局变量。因此,拥有var module将影响 "global"module。但我可以找到任何能对此提供更多见解的东西。 -
你在@t.niese 上是对的,我可以提出拉取请求。
-
我在调查问题时检查了
countdownjs库,但它似乎没有得到维护。最后一次提交是 6 年前。
标签: javascript reactjs webpack webpack-5