我正在尝试在项目中实现webpack,但似乎无法在他们的文档中找到这个问题的明确答案。我需要能够从JS文件全局访问某个变量,例如:
toProps.js:
var myProp = "test";
在我的切入点中,我执行以下操作:
entry.js:
require('./toProps.js');
console.log(myProp);
但变量myProp
未定义。这是一个非常简化的示例,而不是我的实际用例,但重点是我正在使用现有的代码库,其中存在这些类型的全局引用,但我想实现一些模块和延迟加载与webpack。
如何访问myProp
变量?
答案 0 :(得分:1)
内部toProps.js
:
var myProp = "test";
export default myProp;
内部entry.js
:
import myProp from './toProps.js';
从我看到的,你还没有导出变量。因此,它不能是entry.js
内的“导入”。
修改1:了解有关导出here的详情。
编辑2:
好的,为了使它成为一个全局变量,这就是我所做的:
将props.js
移至/dist
并在index.html
内,bundle.js
之前或您为输出文件命名的任何内容中将其链接。
现在它是一个全局变量,因此您实际上不需要在任何地方导出或导入它。
为了测试这个,我制作了一个名为test.js
的文件,将其导入entry.js
。内部test.js
是:
const logTest = () => {
console.log(myProp)
}
export default logTest;
现在在entry.js
内,我调用了该函数。它按预期工作,并且“测试”出现在控制台中。
正如您所提到的,您的示例已经过简化,因此这可能不适合您。也许,您可以将所有全局变量移动到对象内的/dist
内的一个文件中,因为最好不要污染全局对象。
编辑3:回答Jonas W.的回答。完全忘了你能做到的。
答案 1 :(得分:1)
如果你真的需要一个全局变量(不,你不要!),请使用window
:
window.myProp = "test";
否则只需从您的文件中导出它并将其导入到您需要的任何位置。这可能会给你的代码增加一些开销,但实际上你总是知道值的来源,这使得调试变得非常简单。
答案 2 :(得分:0)
如果要导入的源文件属于维护者,则最好先导出然后再导入。就像@Ibrahim的答案一样。
我还遇到一种情况,就是不使用导出语法导入第三方源文件。因此,我认为以下是使用 webpack 的解决方案。
首先,为您的项目安装 exports-loader 。
npm install exports-loader --save-dev
然后,在您的JS源文件中,按如下所示导入和使用:
const WEBGL = require("exports-loader?WEBGL!three/examples/js/WebGL.js");
WEBGL.isWebGL2Available()
在我的情况下, WEBGL 是我要导入的内部变量, three / examples / js / WebGL.js 是第三方源文件。
希望这很有用。
答案 3 :(得分:-1)
要为任何可以阅读该文章的人更新此帖子,可以使用 webpack.config.js 中的插件解析另一个.js文件中使用的名称。
以https://webpack.js.org/plugins/provide-plugin/示例为例:
要自动加载jquery,我们只需将它公开的两个变量都指向相应的节点模块即可:
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
});
然后使用我们的任何源代码:
// in a module
$('#item'); // <= just works
jQuery('#item'); // <= just works
// $ is automatically set to the exports of module "jquery"