Изменение в Webpack является очень новым, и документация не совсем догнала.
Генерация файлов активов при запуске генератора выполнялась только со старым конвейером активов и даже тогда была не очень хорошей идеей. Он опирался на специальную директиву Sprockets require_tree
, которая отбрасывает все файлы в каталоге и добавляет их в манифест. В алфавитном порядке, так что вы не имели никакого контроля над порядком исполнения.
Это также обмануло начинающих думать, что js, которые они вставили в users.js
, выполнялись только в их контроллере пользователя, когда на самом деле все это просто было скоплено в один манифест.
С помощью Webpack вы явно импортируете ресурсы.
Куда мне поместить весь код JS?
Рекомендуется поместить фактические логи приложения c в соответствующую структуру в пределах app/javascript
.
Как получить изоляцию для кода JS каждого представления?
Хотя вы можете использовать javascript_pack_tag
в самом представлении, чтобы требовать указания c файлов, это не действительно хорошая идиома, поскольку она создает ненужные HTTP-запросы и логи c, за которыми трудно следовать.
Если вы хотите, чтобы код выполнялся при загрузке определенного представления, вы можете добавить атрибуты данных в тег body и создайте специальные события:
# app/layouts/application.html.erb
<body data-action="<%= action_name >" data-controller="<%= controller_name %>">
// fired when turbolinks changes pages.
$(document).on('turbolinks:load', ()=>{
let data = $(body).data();
// replace myns with whatever you want
$(this).trigger(`myns:${data.controller}`, data)
.trigger(`myns:${data.controller}#${data.action}`, data)
.trigger(`myns:#${data.action}`, data)
});
Затем вы можете обернуть функциональность, которая должна происходить при загрузке специальной страницы, прослушивая ваши пользовательские события.
$(document).on('myns:users#show', ()=>{
console.log("We are on users#show");
});