使用 Webpack 将 jQuery 暴露给真实的 Window 对象

IT技术 javascript jquery webpack
2021-01-13 05:07:19

我想将 jQuery 对象公开给可在浏览器中的开发人员控制台内访问的全局窗口对象。现在在我的 webpack 配置中,我有以下几行:

plugins: [
                new webpack.ProvidePlugin({
                    $: 'jquery',
                    jQuery: 'jquery'
                })
            ]

这些行将 jQuery 定义添加到我的 webpack module中的每个文件。但是当我构建项目并尝试在开发人员控制台中访问 jQuery 时,如下所示:

window.$;
window.jQuery;

它说这些属性是未定义的......

有没有办法解决这个问题?

6个回答

您需要使用Exposure-loader

npm install expose-loader --save-dev

您可以在需要时执行此操作:

require("expose?$!jquery");

或者您可以在配置中执行此操作:

loaders: [
    { test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]

更新:截至2的WebPack的,你需要使用暴露装载机,而不是揭露

module: {
    rules: [{
        test: require.resolve('jquery'),
        use: [{
            loader: 'expose-loader',
            options: '$'
        }]
    }]
}
ProvidePlugin应该在的情况下,主要用在第三方库依靠一个全局变量的存在。
2021-03-26 05:07:19
你不能只添加第一个脚本$ = require('jquery'); window.jQuery = $; window.$ = $;吗?(不需要expose-loader
2021-04-02 05:07:19
我做出了错误的假设,问题是将提供插件用于“懒惰”目的,我在网上看到了很多,但您是正确的:)
2021-04-03 05:07:19
根据该公开装载机的GitHub页面中的WebPack 2语法如下: module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }这是我可以公开 jQuery 的唯一方法,它使用新的module.rules语法。
2021-04-10 05:07:19
这正是我正在寻找的,只是为了进一步添加,对于装载机,您也可以在一行中完成: {test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
2021-04-11 05:07:19

ProvidePlugin 通过相应的导入替换另一个源中的符号,但不会在全局命名空间中公开该符号。一个经典的例子是 jQuery 插件。他们中的大多数只是希望jQuery在全球范围内进行定义。使用 ,ProvidePlugin您将确保 jQuery 是一个依赖项(例如,之前加载),并且jQuery在其代码中出现的 将替换为 webpack 原始等效项require('jquery').

如果您有依赖于全局命名空间中的符号的外部脚本(比如外部托管的 JS、Selenium 中的 Javascript 调用或只是访问浏览器控制台中的符号),则您希望使用expose-loader代替。

简而言之:ProvidePlugin 管理对全局符号的构建时依赖关系,而expose-loader管理对全局符号的运行时依赖关系。

谢谢解释
2021-03-20 05:07:19
来自官方文档的带有 webpack 的 ProvidePlugin 示例:webpack.js.org/plugins/provide-plugin/#usage-jquery
2021-03-30 05:07:19

看起来该window对象在所有module中都公开了。

为什么不直接导入/要求JQuery并放置:

window.$ = window.JQuery = JQuery;

您需要确保在要求/导入任何使用 的module之前发生这种情况window.JQuery,无论是在需要的module中还是在使用它的module中。

@mhess 当你使用时import,你可能会得到错误,因为imports 被排序到文件的顶部,并且requires 留在它们被放置的地方。因此,运行顺序仅import在未设置窗口变量时发生变化
2021-03-15 05:07:19
好吧,它在使用require而没有时有效import
2021-03-17 05:07:19
当其他嵌套module使用该变量时,这将不起作用,只是“未定义”
2021-03-20 05:07:19
@aboutqx 不确定你的意思。我的回答假设 JQuery 已经被导入/需要并分配给一个名为JQuery.
2021-03-29 05:07:19
最简单的解决方案,无需添加新的依赖项。谢谢!
2021-04-05 05:07:19

这总是对我有用。包括webpack 3 window.$ = window.jQuery = require("jquery");

最佳解决方案!2018年
2021-04-06 05:07:19

以上都不适合我。(而且我真的不喜欢expose-loader 语法)。反而,

我添加到 webpack.config.js:

var webpack = require('webpack');
module.exports = {
   plugins: [
       new webpack.ProvidePlugin({
           $: 'jquery',
       })     
   ]
}

比所有module都可以通过 $.jQuery 访问。

您可以通过将以下内容添加到 webpack 捆绑的任何module来将其公开给窗口:

window.$ = window.jQuery = $
这对我在幕后使用 webpack-stream 有用
2021-03-24 05:07:19