Ответ 1
Вам нужно импортировать JS файлы через Gem. Может быть, это поможет вам:
import jQuery from 'jquery'
<%= File.read(File.join(Gem.loaded_specs['bla_bla_gem'].full_gem_path, 'lib', 'assets', 'javascripts', 'bla_bla.js')) %>
Так что я уже давно пользуюсь рельсами. Но с Rails 6 я действительно изо всех сил пытался двигаться. У меня есть несколько пользовательских гемов, которые я использую для активов и вещей, и я не могу понять, как загрузить файлы js.
К чему я привык
application.js
//= require activestorage
//= require jquery-3.3.1.min
//= require popper.min
//= require bootstrap
//= require mdb
//= require wysiwyg
//= require addons/pickr.min
//= require modules/buttons
//= require modules/cards
//= require modules/waves
//= require activestorage
//= require turbolinks
//= require_tree .
Но это не загружается в Rails 6 с Webpacker. Мне не удалось найти в Интернете базового решения, которое бы не включало добавление нескольких js файлов и строк кода в приложение для совместного исправления решения. Я попробовал
приложение /JavaScript/пакеты/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require ("jquery-3.3.1.min").start()
require ("popper.min").start()
require ("bootstrap").start()
require ("mdb").start()
require ("wysiwyg").start()
require ("addons/pickr.min").start()
require ("modules/buttons").start()
require ("modules/cards").start()
require ("modules/waves").start()
require("@rails/activestorage").start()
require("channels")
Ресурсы находятся в правильном месте внутри драгоценного камня (поэтому первая версия в приложении rails 5 загружает все как положено). Я могу добавить некоторые из них с помощью пряжи, но я хочу использовать реальные файлы из гема, а не просто запустить загрузчик, есть ли прямое решение для этого? Я также попытался отрегулировать путь в require
, но это тоже не сработало.
Спасибо за любую помощь!
Вам нужно импортировать JS файлы через Gem. Может быть, это поможет вам:
import jQuery from 'jquery'
<%= File.read(File.join(Gem.loaded_specs['bla_bla_gem'].full_gem_path, 'lib', 'assets', 'javascripts', 'bla_bla.js')) %>
Таким образом, чтобы ответить в rails 6, вы заметите использование папки javascript app/javascript, это означает, что все, что вы делаете с JS, должно быть сделано оттуда. Опора на драгоценные камни для них теперь минимальна и заменена пряжей.
Я приведу пример моего процесса использования библиотек js. для примера я буду называть бутстрап с использованием пряжи. Я включил пользовательские файлы, чтобы помочь вам вызвать каждую библиотеку.
Мне нравится использовать этот процесс, который я изменил по сравнению с тем, что я читал на носителе некоторое время назад
# app/javascript/packs/application.js
import '../stylesheets/application'
# app/views/layouts/application.html.erb
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
in the console run
yarn add [email protected] jquery popper.js
затем
# config/webpack/environment.js
...
const webpack = require('webpack')
environment.plugins.append(
'Provide',
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
Popper: ['popper.js', 'default']
})
)
... затем
# app/javascript/packs/bootstrap_custom.js
import 'bootstrap/js/dist/alert'
import 'bootstrap/js/dist/button'
import 'bootstrap/js/dist/carousel'
import 'bootstrap/js/dist/collapse'
import 'bootstrap/js/dist/dropdown'
import 'bootstrap/js/dist/index'
import 'bootstrap/js/dist/modal'
import 'bootstrap/js/dist/popover'
import 'bootstrap/js/dist/scrollspy'
import 'bootstrap/js/dist/tab'
import 'bootstrap/js/dist/toast'
import 'bootstrap/js/dist/tooltip'
import 'bootstrap/js/dist/util'
И свяжите его в файле app/javascript/packs/application.js.
# app/javascript/packs/application.js
import './bootstrap_custom.js'
then
# app/javascript/stylesheets/application.scss
@import './bootstrap_custom.scss'
then
# app/javascript/stylesheets/bootstrap_custom.scss
@import '~bootstrap/scss/_functions.scss';
@import '~bootstrap/scss/_variables.scss';
@import '~bootstrap/scss/_mixins.scss';
@import '~bootstrap/scss/_root.scss';
@import '~bootstrap/scss/_reboot.scss';
@import '~bootstrap/scss/_type.scss';
@import '~bootstrap/scss/_alert.scss';
@import '~bootstrap/scss/_badge';
@import '~bootstrap/scss/_breadcrumb';
@import '~bootstrap/scss/_button-group';
@import '~bootstrap/scss/_buttons';
@import '~bootstrap/scss/_buttons.scss';
@import '~bootstrap/scss/_card.scss';
@import '~bootstrap/scss/_carousel.scss';
@import '~bootstrap/scss/_close.scss';
@import '~bootstrap/scss/_code.scss';
@import '~bootstrap/scss/_custom-forms.scss';
@import '~bootstrap/scss/_dropdown.scss';
@import '~bootstrap/scss/_forms.scss';
@import '~bootstrap/scss/_grid.scss';
@import '~bootstrap/scss/_images.scss';
@import '~bootstrap/scss/_input-group.scss';
@import '~bootstrap/scss/_jumbotron.scss';
@import '~bootstrap/scss/_list-group.scss';
@import '~bootstrap/scss/_media.scss';
@import '~bootstrap/scss/_modal.scss';
@import '~bootstrap/scss/_nav.scss';
@import '~bootstrap/scss/_navbar.scss';
@import '~bootstrap/scss/_pagination.scss';
@import '~bootstrap/scss/_popover.scss';
@import '~bootstrap/scss/_print.scss';
@import '~bootstrap/scss/_progress.scss';
@import '~bootstrap/scss/_spinners.scss';
@import '~bootstrap/scss/_tables.scss';
@import '~bootstrap/scss/_toasts.scss';
@import '~bootstrap/scss/_tooltip.scss';
@import '~bootstrap/scss/_transitions.scss';
@import '~bootstrap/scss/_utilities.scss';
Если вы решите следовать этому, следуйте ему точно, не меняйте строки scss и т.д., это испортит это
Вам нужно будет получить их непосредственно из файлов гемов.
Измените application.js
на application.js.erb
и следуйте за демир-решением. Вы также можете использовать next для импорта более одного файла.
<% ['file_1', 'file_2'].each do |file| %>
import "<%= File.join(Gem.loaded_specs['my_gem'].full_gem_path, 'app', 'assets', 'javascripts', file) %>";
<% end %>
Я думаю, что местоположение файла может создать проблему для вашего случая:
Файл должен быть в app/assets/javascripts/application.js
, пока ваш файл находится в
app/javascript/packs/application.js
Надеюсь, что это поможет вам.