jQuery и приложения наследования
Дата обновления перевода 2024-07-25
jQuery и приложения наследования
Внутри Webpack, когда вам нужен модуль, он (обычно) не устанавливает глобальную переменную. Вместо этого, оно просто возвращает значение:
1 2
// загружает jquery, но *не* устанавливает глобальную переменную $ или jQuery
const $ = require('jquery');
На практике, это вызовет проблемы с некоторыми внешними библиотеками, которые полагаются на то, чтобы jQuery был глобальным. Это будет проблемой, если часть вашего JavaScript не обрабатывается через Webpack (например, у вас есть некоторый JavaScript в ваших шаблонах).
1 2
Uncaught ReferenceError: $ is not defined at [...]
Uncaught ReferenceError: jQuery is not defined at [...]
Решение проблемы зависит от того, какой код ее вызывает.
Исправление плагинов jQuery, которые ожидают, чтобы jQuery был глобальным
Плагины jQuery часто ожидают, что jQuery уже будет доступен через глобальные
переменные $ или jQuery. Чтобы исправить это, вызовите autoProvidejQuery()
из вашего файла webpack.config.js:
1 2 3 4 5
// webpack.config.js
Encore
// ...
+ .autoProvidejQuery()
;
После перезапуска Encore, Webpack будет искать все неинициализированные переменные
$ и jQuery, и автоматически требовать jquery, а также устанавливать эти
переменные для вас.
Он "перезаписывает" "плохой" код, чтобы он был правильным.
Внутренне, этот метод autoProvidejQuery() вызывает метод autoProvideVariables()
из Encore. На практике, это эквивалентно следующему:
1 2 3 4 5 6 7 8 9 10
Encore
// вы можете использовать этот метод, чтобы предоставить другие общие глобальные переменные
// такие, как '_' для библиотеки 'underscore'
.autoProvideVariables({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery',
})
// ...
;
Получение доступа к jQuery вне файлов Webpack JavaScript
Если вашему коду также нужен доступ к $ и jQuery, и вы находитесь в файле,
который обрабатывается Webpack/Encore, вы должны убрать все ошибки "$ is not defined",
затребовав у jQuery следующее: var $ = require('jquery').
Но если вам также нужно предоставить доступ к переменным $ и jQuery вне
файлов JavaScript, обрабатываемых Webpack (к примеру, JavaScript, который все еще
живет в ваших шаблонах), вам нужно вручную установить их как глобальные переменные
в каком-то файле JavaScript, который загружается до вашего унаследованного кода.
Например, в вашем файле app.js, который обрабатывается Webpack, и загружается на
каждой странице, добавьте:
1 2 3 4 5 6 7
// app.js
// затребуйте jQuery нормально
const $ = require('jquery');
+ // создайте глобальные переменные $ м jQuery
+ global.$ = global.jQuery = $;
Переменная global - это особый способ установки вещей в переменной window.
В веб-контексте, использование global и window равнозначны, кроме того, что
window.jQuery не будет работать при использовании autoProvidejQuery().
Другими словами, используйте global.
Кроме того, не забудьте установить опцию script_attributes.defer как false
в вашем файле webpack_encore.yaml:
1 2 3 4 5
# config/packages/webpack_encore.yaml
webpack_encore:
# ...
script_attributes:
defer: false
Это гарантирует то, что атрибута defer в вашем теге script не будет.
Чтобы узнать больше, см, Перемещение <script> внутри <head> и атрибута "defer"