Открыть jQuery для реального объекта Window с помощью Webpack

Я не буду подвергать объект jQuery глобальному объекту окна, доступному внутри консоли разработчика в браузере. Теперь в моей конфигурации webpack у меня есть следующие строки:

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

Эти строки добавляют определения jQuery к каждому файлу в моих модулях webpack. Но когда я создаю проект и пытаюсь получить доступ к jQuery в консоли разработчика, как это:

window.$;
window.jQuery;

он говорит, что эти свойства undefined...

Есть ли способ исправить это?

Ответ 1

Вам нужно использовать expose-loader.

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: '$'
        }]
    }]
}

Ответ 2

ProvidePlugin заменяет символ в другом источнике посредством соответствующего импорта, но не предоставляет символ в глобальном пространстве имен. Классическим примером являются плагины jQuery. Большинство из них просто ожидают, что jQuery будет определен глобально. Используя ProvidePlugin вы должны убедиться, что jQuery является зависимостью (например, загружен ранее), и вхождение jQuery в их коде будет заменено на веб-пакет необработанного эквивалента require('jquery').

Если у вас есть внешние скрипты, основанные на том, что символ находится в глобальном пространстве имен (например, пусть, например, JS, размещенный извне, Javascript вызывает в Selenium или просто обращается к символу в консоли браузера), вы хотите использовать вместо этого expose-loader.

Вкратце: ProvidePlugin управляет зависимостями времени сборки от глобальных символов, тогда как expose-loader управляет зависимостями времени выполнения от глобальных символов.

Ответ 3

Похоже, объект window выставлен во всех модулях.

Почему бы просто не импортировать/требовать JQuery и поместить:

window.$ = window.JQuery = JQuery;

Вам нужно убедиться, что это происходит, прежде чем запрашивать/импортировать любой модуль, использующий window.JQuery, либо в window.JQuery модуле, либо в модуле, где он используется.

Ответ 4

Это всегда срабатывало для меня. в том числе для webpack 3 window.$ = window.jQuery = require("jquery");

Ответ 5

В моем случае работает

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

Ответ 6

Обновление для Webpack v2

Установите 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" }
        ]
    }
};

(из документы-экспоненты-загрузчики)

Ответ 7

Ничто из вышеперечисленного не помогло мне. (и мне действительно не нравится синтаксис expose-loader). Вместо

Я добавил в webpack.config.js:

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

Чем все модули имеют доступ через jQuery через $.

Вы можете открыть его в этом окне, добавив следующее в любой из ваших модулей, входящих в пакет webpack:

window.$ = window.jQuery = $