Answers:
您需要使用暴露加载器。
npm install expose-loader --save-dev
您可以在需要时执行以下操作:
require("expose?$!jquery");
或者您可以在配置中执行以下操作:
loaders: [
{ test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]
更新:从webpack 2开始,您需要使用暴露加载器而不是暴露:
module: {
rules: [{
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: '$'
}]
}]
}
ProvidePlugin
应该在的情况下,主要用在第三方库依靠一个全局变量的存在。
{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
吗?(不需要expose-loader
)
module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
。这是我可以公开jQuery的唯一方法,并且使用了新的module.rules语法。
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
模块或使用该模块的模块中,需要/导入使用的任何模块之前发生这种情况。
require
,而不是import
JQuery
。
import
,可能会出错,因为import
s被排序到了文件的顶部,并require
停留在放置它们的位置。因此,运行顺序仅import
在未设置窗口可变性的情况下才会发生变化。
Webpack v2的更新
按照Matt Derrick的说明安装暴露加载程序:
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" }
]
}
};
(来自暴露加载程序文档)
window.jQuery = require('jquery');
this: 'window'
也可以设置吗?由于许多库都假定this
变量为Window对象