Я хочу предоставить объект jQuery глобальному объекту окна, который доступен внутри консоли разработчика в браузере. Теперь в моей конфигурации веб-пакета есть следующие строки:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Эти строки добавляют определения jQuery к каждому файлу в моих модулях webpack. Но когда я создаю проект и пытаюсь получить доступ к jQuery в консоли разработчика, например, так:
window.$;
window.jQuery;
он говорит, что эти свойства не определены ...
Есть способ исправить это?
javascript
jquery
webpack
Ферболг
источник
источник
this: 'window'
тоже установить ? Поскольку многие библиотеки принимаютthis
переменную за объект WindowОтветы:
Вам нужно использовать экспо-загрузчик .
Вы можете сделать это, когда вам это нужно:
или вы можете сделать это в своей конфигурации:
ОБНОВЛЕНИЕ : Начиная с webpack 2, вам нужно использовать expose -loader вместо expose :
источник
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
в их коде будет заменено необработанным эквивалентом веб-пакетаrequire('jquery')
.Если у вас есть внешние сценарии, полагающиеся на то, что символ находится в глобальном пространстве имен (например, например, JS, размещенный на внешнем сервере, вызовы Javascript в Selenium или просто доступ к символу в консоли браузера), вы хотите использовать
expose-loader
вместо этого.Вкратце: ProvidePlugin управляет зависимостями времени сборки от глобальных символов, тогда как
expose-loader
управление зависимостями времени выполнения от глобальных символов.источник
Похоже,
window
объект представлен во всех модулях.Почему бы просто не импортировать / потребовать
JQuery
и не поставить:Вам нужно будет убедиться, что это произойдет, прежде чем запрашивать / импортировать какой-либо модуль, который используется
window.JQuery
, либо в требуемом модуле, либо в модуле, в котором он используется.источник
require
пока нетimport
JQuery
.import
, вы можете получить ошибку, потому чтоimport
они сортируются в начало файла иrequire
остаются там, где они были помещены. Таким образом, порядок выполнения изменяется толькоimport
тогда, когда переменная окна не установлена.У меня это всегда срабатывало. в том числе для webpack 3
window.$ = window.jQuery = require("jquery");
источник
У меня ничего из вышеперечисленного не сработало. (и мне действительно не нравится синтаксис expose-loader). Вместо,
Я добавил в webpack.config.js:
Чем все модули имеют доступ через jQuery через $.
Вы можете открыть его в окне, добавив следующее в любой из ваших модулей, связанных с webpack:
источник
Обновление для Webpack v2
Установите expose-loader, как описано Мэттом Дерриком:
Затем вставьте следующий фрагмент в свой
webpack.config.js
:(из документов expose-loader )
источник
window.jQuery = require('jquery');
В моем случае работает
источник