Когда я переписываю основное приложение Nomcre для обновления до Rails 6, я пытаюсь сделать что-то «The Rails Way», но оно немного изменилось со времен Rails 5.1… до того, как веб-пакет был включен по умолчанию.
Согласно документации, все, что вам нужно сделать, чтобы включить какой-нибудь классный пакет node.js, - это использовать команду yarn add.
пряжа добавить имя_пакета
После jQuery и jQuery UI у меня было ощущение, что он не будет таким прямым, как документация.
С jQuery мне пришлось перепрыгнуть через несколько обручей, установив глобальную переменную:
require («jquery»)
// jquery
import $ from «jquery»;
global. $ = $
global.jQuery = $
В jQuery UI есть дополнительный этап включения css, который должен поставляться в комплекте с jQueryUI.
require ('jquery-ui');
require.context ('file-loader? name = [путь] [имя]. [ext] & context = node_modules / jquery-ui-dist! jquery-ui-dist' , правда, /jquery-ui\.css/);
require.context ('file-loader? name = [путь] [имя]. [ext] & context = node_modules / jquery-ui-dist! jquery-ui-dist', true, /jquery-ui\.theme\.css /);
Это было довольно интересное исправление. Кроме того, я думал, что большинство других пакетов JS не потребуют…, но, конечно, следующий пакет, который я попробовал, натолкнулся на некоторые из тех же проблем. Итак, для моего рассудка, вот краткое изложение того, что происходит, и как я решил это.
В новом приложении Rails 6 я хочу использовать webpacker для объединения необходимых мне ресурсов JS в конвейер.
Проблема:
Использование пряжи не является автоматическим волшебством.
Когда мы даем команде yarn имя пакета для добавления, менеджер пакетов обращается к его репозиторию пакетов и в основном говорит
«Привет, PackageManager, ты знаешь, где я могу найти этот пакет?»
Если вы это сделаете, назовите мне URL-адрес репо для загрузки, и я возьму его.
Если нет… ¯ \ _ (ツ) _ / ¯ ”
Если диспетчер пакетов действительно находит пакет, он загружает всю ветку репозитория в вашу локальную папку.
my_app_name / node_modules / package_name
иначе:
nomcre / node_modules / jquery-шаги
Затем вы переходите к своему файлу регистрации пакета javascript по адресу
мое_имя_приложения / приложение / javascripts / packs / application.js
и вы добавляете имя js-пакета, который хотите включить в свое приложение Rails
требовать («jquery-steps»);
И вы ожидаете, что сможете начать писать JS между тегами
‹script› ‹/script›
, которые вызывают методы из jquery-steps.
Но когда я перезагружаю страницу, это занимает секунду или две, поскольку webpacker пытается скомпилировать файлы JS, за исключением того, что вы получите ошибку, которая в основном гласит:
«Уоу, уоу, уоу, я понятия не имею, о чем ты говоришь. WTF - это jquery-steps? »
Решение:
Когда мы добавляем пакет с помощью пряжи, нет гарантии, что в пакете будет какой-либо конкретный макет папки. Кроме того, нельзя сказать, использовали ли разработчики дефисы (-) или точки (.) В имени файла.
Поэтому нам просто нужно убедиться, что, когда нам требуется js-файл из нашего файла application.js, этот веб-пакетер знает, где находится фактический файл распространения в папке загруженного пакета.
Когда я открыл папку node_modules и прокрутил ее до jquery-steps, я заметил, что в корне папки пакета нет файлов .js. В этом случае структура файлов была:
node_modules / jquery-шаги / сборка / jquery.steps.js
Поэтому вам просто нужно вернуться к вашему файлу application.js и обновить путь к файлу, который webpacker будет использовать для поиска библиотеки. Используя в качестве примера jquery-steps, требуемый вызов изменяется с
требовать («jquery-steps»);
to
требуется (‘jquery-steps / build / jquery.steps.js’);
БУМ! Перезагрузите страницу, посмотрите, как ваш webpacker скомпилирует сборку, и все получится!
Но что тогда произойдет, если вы захотите использовать стиль по умолчанию? Что ж, правильный путь - это другой пост. Но самый простой способ - перейти в пакет (в папке node_modules), найти их файлы CSS и скопировать / вставить содержимое в одну из таблиц стилей в вашем app / assets / таблицы стилей.
Теперь вы можете с легкостью использовать все волшебные пакеты JS. Я надеюсь, что это поможет кому-то другому… даже если я просто пытаюсь вспомнить, что я сделал 😊.