使用Webpack将jQuery暴露给真正的Window对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Webpack将jQuery暴露给真正的Window对象相关的知识,希望对你有一定的参考价值。
我不想将jQuery对象公开给可在浏览器中的开发人员控制台中访问的全局窗口对象。现在在我的webpack配置中,我有以下几行:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
这些行将jQuery定义添加到我的webpack模块中的每个文件中。但是,当我构建项目并尝试在开发人员控制台中访问jQuery时,如下所示:
window.$;
window.jQuery;
它说这些属性是未定义的......
有没有办法来解决这个问题?
你需要使用expose-loader。
npm install expose-loader --save-dev
您可以在需要时执行此操作:
require("expose?$!jquery");
或者您可以在配置中执行此操作:
loaders: [
{ test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]
更新:从webpack 2开始,您需要使用expose-loader而不是公开:
module: {
rules: [{
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: '$'
}]
}]
}
ProvidePlugin通过相应的导入替换另一个源中的符号,但不会在全局命名空间中公开该符号。一个经典的例子是jQuery插件。他们中的大多数人只希望在全球范围内定义jQuery
。使用ProvidePlugin
,您将确保jQuery是一个依赖项(例如之前加载),并且jQuery
在其代码中的出现将被替换为webpack raw等效的require('jquery')
。
如果你有依赖于符号的外部脚本在全局命名空间中(比如让我们说一个外部托管的JS,在Selenium中调用javascript或者只是在浏览器的控制台中访问这个符号)你想要使用expose-loader
。
简而言之:ProvidePlugin管理对全局符号的构建时依赖性,而expose-loader
管理运行时对全局符号的依赖性。
看起来window
对象在所有模块中都公开了。
为什么不直接导入/需要JQuery
并放:
window.$ = window.JQuery = JQuery;
您需要确保在需要/导入任何使用window.JQuery
的模块之前发生这种情况,无论是在需求模块中还是在使用它的模块中。
这总对我有用。包括webpack 3 window.$ = window.jQuery = require("jquery");
在我的情况下工作
{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" }
Webpack v2的更新
按照Matt Derrick的描述安装expose-loader:
npm install expose-loader --save-dev
然后在webpack.config.js
中插入以下代码段:
module.exports = {
entry: {
// ...
},
output: {
// ...
},
module: {
loaders: [
{ test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" }
]
}
};
以上是关于使用Webpack将jQuery暴露给真正的Window对象的主要内容,如果未能解决你的问题,请参考以下文章