Expose jQuery to real Window object with Webpack
我不会将jQuery对象公开给浏览器中开发人员控制台内部可访问的全局窗口对象。 现在在我的webpack配置中,有以下几行:
1 2 3 4 5 6
| plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
] |
这些行将jQuery定义添加到我的webpack模块中的每个文件中。
但是,当我构建项目并尝试在开发者控制台中访问jQuery时,如下所示:
1 2
| window.$;
window.jQuery; |
它说这些属性是不确定的...
有没有办法解决这个问题?
-
我也可以设置this: window吗? 由于许多库都假定this变量是Window对象
您需要使用暴露加载程序。
1
| npm install expose-loader --save-dev |
您可以在需要时执行以下操作:
1
| require("expose?$!jquery"); |
或者您可以在配置中执行以下操作:
1 2 3
| loaders: [
{ test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
] |
更新:从webpack 2开始,您需要使用暴露加载器而不是暴露:
1 2 3 4 5 6 7 8 9
| module: {
rules: [{
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: '$'
}]
}]
} |
-
ProvidePlugin应该主要用于第三方库依赖全局变量的情况。
-
我做出了错误的假设,问题是出于懒惰目的使用了Provide插件,我在网上已经看到了很多,但是您是正确的:)
-
@MattDerrick,谢谢,它在我的情况下有效。
-
这正是我一直在寻找的东西,只是为了进一步增加,对于装载机,您也可以在一行中完成它:{test: jquery\.js$, loader: expose?jQuery!expose?$}
-
只是对其他人的说明,当我遇到AMD错误时,require行对我不起作用,但是基于加载程序的解决方案确实起作用。也就是说,我按照此处的说明进行操作:github.com/webpack/expose-loader。
-
不能只添加第一个脚本$ = require(jquery); window.jQuery = $; window.$ = $;吗? (不需要expose-loader)
-
当我将{ test: require.resolve(jquery), loader: expose?jQuery!expose?$ }放在我的webpack配置中,然后尝试在我的代码中使用" $"时,webpack会抛出并且" $未定义"错误。如果我在代码中使用require("expose?$!jquery");,则webpack会引发错误,它无法解析jquery。但是,如果我使用jquery的import $,一切都会正常。
-
另外,请确保您已安装STABLE节点,而不是edge。暴露不像生活在边缘
-
我必须调整jquery URL才能在我的设置中工作(TypeScript 2.1.1和jQuery 1.9.1和Webpack 1.3.2){ test: require.resolve(jqueryjquery), loader: expose?jQuery!expose?$ }
-
根据Exposure-loader GitHub页面,webpack 2的语法如下:module: { rules: [{ test: require.resolve(jquery), use: [{ loader: expose-loader, options: jQuery },{ loader: expose-loader, options: $ }] }] }。这是我可以使用新的module.rules语法公开jQuery及其唯一方法。
-
@GavinSutherland我已经更新了答案。我没有编写Webpack 2编辑,但现在已更正它。
ProvidePlugin通过相应的导入替换了另一个源中的符号,但是没有在全局名称空间中公开该符号。
一个经典的例子是jQuery插件。他们中的大多数人只希望jQuery被全局定义。使用ProvidePlugin,您可以确保jQuery是一个依赖项(例如,之前已加载),并且代码中jQuery的出现将替换为require('jquery')的webpack原始等效项。
如果您有依赖于符号位于全局命名空间中的外部脚本(例如,假设是外部托管的JS,Selenium中的Javascript调用或只是在浏览器控制台中访问该符号),则您应该使用expose-loader。
简而言之:ProvidePlugin管理对全局符号的构建时依赖性,而expose-loader管理对全局符号的运行时依赖性。
-
感谢您的解释
-
官方文档中包含webpack的ProvidePlugin示例:webpack.js.org/plugins/provide-plugin/#usage-jquery
看起来window对象已在所有模块中公开。
为什么不只导入/要求jQuery并放入:
1
| window.$ = window.JQuery = JQuery; |
您需要确保在要求/导入要求模块中或正在使用它的模块中,在使用/导入任何使用window.JQuery的模块之前发生这种情况。
-
最简单的解决方案,无需添加新的依赖项。谢谢!
-
使用该变量(只是未定义)在其他嵌套模块中不起作用
-
很好,当使用require而不使用import时,
-
@aboutqx不确定您的意思。我的答案假设JQuery已被导入/需要,并已分配给名为JQuery的变量。
-
@mhes在使用import时可能会出错,因为import被排序到文件的顶部,并且require留在了它们所在的位置。因此,未设置窗口可变性时,运行顺序仅用import更改。
-
为此,请确保您没有添加与jquery相关的DefinePlugin
这一直对我有用。包括用于webpack 3 window.$ = window.jQuery = require("jquery");
以上都不对我有用。 (我真的不喜欢暴露加载器语法)。代替,
我添加到webpack.config.js:
1 2 3 4 5 6 7 8
| var webpack = require('webpack');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
})
]
} |
比所有模块都可以通过jQuery通过$访问。
通过将以下内容添加到webpack捆绑的任何模块中,可以将其公开给窗口:
1
| window.$ = window.jQuery = $ |
就我而言
1
| { test: require.resolve("jquery"), loader:"expose?$!expose?jQuery" } |
Webpack v2的更新
按照Matt Derrick的说明安装暴露加载程序:
1
| npm install expose-loader --save-dev |
然后在webpack.config.js中插入以下代码段:
1 2 3 4 5 6 7 8 9 10 11 12 13
| module.exports = {
entry: {
// ...
},
output: {
// ...
},
module: {
loaders: [
{ test: require.resolve("jquery"), loader:"expose-loader?$!expose-loader?jQuery" }
]
}
}; |
(来自暴露加载程序文档)
-
现在,我再也无法在任何版本的Webpack中使用它了。不知道发生了什么变化,但是我可以识别jQuery或$的唯一方法是执行window.jQuery = require(jquery);