【问题标题】:Expose jQuery to real Window object with Webpack使用 Webpack 将 jQuery 公开给真实的 Window 对象
【发布时间】:2015-05-18 18:19:23
【问题描述】:

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

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

这些行将 jQuery 定义添加到我的 webpack 模块中的每个文件中。 但是当我构建项目并尝试像这样在开发者控制台中访问 jQuery 时:

window.$;
window.jQuery;

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

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

【问题讨论】:

  • 我也可以设置this: 'window'吗?由于许多库假定 this 变量是 Window 对象

标签: javascript jquery webpack


【解决方案1】:

您需要使用expose-loader

npm install expose-loader --save-dev

您可以在需要时这样做:

require("expose?$!jquery");

或者你可以在你的配置中这样做:

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

UPDATE:从 webpack 2 开始,您需要使用 expose-loader 而不是 expose

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
  • 根据expose-loader GitHub page,webpack 2 的语法如下:module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }。这是我可以暴露 jQuery 的唯一方法,它使用新的 module.rules 语法。
【解决方案2】:

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

如果您有依赖符号位于全局命名空间中的外部脚本(例如,外部托管的 JS、在 Selenium 中调用 Javascript 或只是在浏览器控制台中访问符号),您想改用 expose-loader .

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

【讨论】:

【解决方案3】:

看起来window 对象已在所有模块中公开。

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

window.$ = window.JQuery = JQuery;

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

【讨论】:

  • 最简单的解决方案,无需添加新的依赖项。谢谢!
  • 当其他嵌套模块使用该变量时,这将不起作用,只是“未定义”
  • 在使用require而不是import时它可以工作
  • @aboutqx 不确定你的意思。我的回答假设 JQuery 已经被导入/需要并分配给名为 JQuery 的变量。
  • @mhess 当你使用import 时,你可能会得到错误,因为imports 被排序到文件的顶部,而requires 留在它们被放置的地方。因此,只有在未设置窗口变量时,运行顺序才会随着import 而变化。
【解决方案4】:

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

【讨论】:

  • 最佳解决方案! 2018
【解决方案5】:

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

我添加到 webpack.config.js 中:

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

比所有模块都可以通过 jQuery 通过 $ 访问。

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

window.$ = window.jQuery = $

【讨论】:

  • 这对我在幕后使用 webpack-stream 有效
【解决方案6】:

Webpack v2 更新

按照 Matt Derrick 的描述安装 expose-loader

npm install expose-loader --save-dev

然后在您的webpack.config.js 中插入以下sn-p:

module.exports = {
    entry: {
        // ...
    },
    output: {
        // ...
    },
    module: {
        loaders: [
                { test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" }
        ]
    }
};

(来自expose-loader docs

【讨论】:

  • 我现在不能再让它在任何版本的 Webpack 中工作。不知道发生了什么变化,但我可以让 jQuery 或 $ 被识别的唯一方法是 window.jQuery = require('jquery');
【解决方案7】:

在我的情况下有效

{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" } 

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2015-02-15
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多