使用Webpack将jQuery暴露给真正的Window对象
我不想将jQuery对象暴露给在浏览器中的开发者控制台中可访问的全局窗口对象。 现在在我的webpackconfiguration我有以下几行:
plugins: [ new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' }) ]
这些行将jQuery定义添加到我的webpack模块中的每个文件。 但是当我构build项目并尝试像这样访问开发者控制台中的jQuery:
window.$; window.jQuery;
它说这些属性是未定义的…
有没有办法来解决这个问题?
你需要使用expose-loader 。
npm install expose-loader --save-dev
您可以在需要时执行此操作:
require("expose?$!jquery");
或者你可以在你的configuration中做到这一点:
loaders: [ { test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' } ]
更新 :从webpack 2开始,你需要使用expose-loader而不是expose :
module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: '$' }] }] }
ProvidePlugin通过相应的导入replace另一个源中的符号,但不公开全局名称空间上的符号。 一个经典的例子是jQuery插件。 他们大多只是期望全球定义jQuery
。 使用ProvidePlugin
可以确保jQuery是一个依赖项(例如之前加载的),并且在代码中出现的jQuery
将被replace为require('jquery')
的webpack原始等价物。
如果你有依赖于符号的外部脚本在全局命名空间(比如让我们说一个外部托pipe的JS,在Selenium中调用Javascript,或者只是在浏览器的控制台中访问这个符号),你想使用expose-loader
。
简而言之:ProvidePluginpipe理全局符号的构build时依赖关系,而expose-loader
pipe理全局符号的运行时依赖关系。
看起来window
对象是暴露在所有模块中。
为什么不只是导入/需要JQuery
并把:
window.$ = window.JQuery = 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" } ] } };
(来自Expos-loader文档 )
这一直对我有用。 包括webpack 3 window.$ = window.jQuery = require("jquery");