Как получить доступ к ресурсам с помощью webpacker gem

Не могли бы вы объяснить мне, как получить доступ к ресурсам из gem-пакета webpacker в компонентах vue.js? Например - как создать div с фоновым изображением. Я пробовал использовать папки / app / assets / images и / app / javascripts / assets, но изображения доступны только в разделе шаблонов, но не в разделе стилей :(

в моем случае

<template>
    <div id="home">
        <div id="intro">
            <img src="assets/cover-image-medium.png" alt="">
        </div>
    </div>
</template>

работает нормально, но

<style scoped>
    #intro {
        height: 200px;
        background: url("assets/cover-image-medium.png");
    }
</style>

не работает :(

Что случилось?


person Alexey Poimtsev    schedule 07.08.2017    source источник
comment
Вы настроили vue-loader на использование css-loader для обработки стилей шаблонов?   -  person bzeaman    schedule 13.08.2017
comment
@bzeaman вы имеете в виду github.com/rails/webpacker#css-modules?   -  person Alexey Poimtsev    schedule 14.08.2017


Ответы (5)


Материал нового веб-пакера Rails довольно сырой, так что эта конфигурация мне подходит:

config / webpacker.yml (для webpacker 3):

resolved_paths: ['app/javascript/images', 'app/javascript/src']
compile: false
# ...

JS файлы:

/app
  /javascript
    /packs
      # only entry point files
      vue_application.js
    /src
      some_component.vue
    /images
      logo.svg

в компоненте:

<script>
import 'images/logo.svg'
</script>

в шаблоне:

<img src='~images/logo.svg' />

укажите здесь тильду - это означает, что изображение является зависимостью модуля

в CSS:

<style lang='sass'>
#app
  background: url('../images/logo.svg')
</style>

По какой-то причине тильда здесь не работает, поэтому используется относительный путь.

person sandrew    schedule 05.09.2017
comment
Спасибо @sandrew, ваш ответ был действительно полезен - person hedin; 20.11.2017
comment
Если я использую <img :src="pathFromComputedProp" /> и pathFromComputedProp(){ return '~images/logo.svg' } - это не сработает. Также не сработает, если вместо тильды я буду использовать относительный путь: pathFromComputedProp(){ return '../images/logo.svg' }. Может тоже есть способ исправить? - person hedin; 21.11.2017
comment
Спасибо! (Почему этого НЕТ в документации веб-упаковщика !?) - person tgf; 28.03.2018

Если я правильно понял ваш вопрос, вам нужно будет найти файл webpack.base.conf.js в папке build, а затем найти код, который выглядит следующим образом:

resolve: {
  extensions: ['.js', '.vue', '.json'],
  alias: {
    'vue$': 'vue/dist/vue.esm.js',
    '@': resolve('src')
  }
}

Затем добавьте к объекту alias следующую строку: 'assets': resolve('src/assets/'), которая будет работать для папки assets, находящейся прямо под папкой src. Вы также можете изменить ключевую строку с assets на любое желаемое имя псевдонима.

РЕДАКТИРОВАТЬ:

Я забыл упомянуть, чтобы получить доступ к псевдонимам в коде стиля, вы должны добавить к нему префикс ~ (telda), чтобы assets превратилось в ~assets.

person Rashad Saleh    schedule 18.08.2017

Поскольку он помечен тегом Vue.js, я отвечу за это. Ни один из других ответов не работал с Vue 2.x.

Для атрибутов

Оператор webpacker require возвращает полный URL-адрес необходимого ресурса (разрешенный на основе вашего resolved_paths внутри webpacker.yml). Исходя из этого, вы можете сделать что-то вроде этого:

<img :src="require('images/what-a-pain.png')" alt="Finally working" />

Обратите внимание на двоеточие, обуславливающее привязку атрибута src к результату выражения javascript.

Вы также можете использовать якоря идентификатора, добавив их, например, с помощью SVG:

<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
    <use :href="require('images/icons.svg') + '#copy'" />
</svg>

Шаблоны Vue обычно предварительно скомпилированы в эквиваленты javascript, поэтому для извлечения ресурсов во время компиляции, а не во время выполнения необходим оператор require.

Для CSS urls, с ограничением или без

Просто используйте тильду ~ и путь. Путь должен быть относительным либо к файлу, который его включает, либо к resolved_paths из webpacker.yml.

.relative-pathed {
    background: url(~../../../assets/images/quitethepath.svg) center center no-repeat;
}
.works-after-editing-webpackeryml {
    background: url(~images/quitethepath.svg) center center no-repeat;
}

Для этого использования нет необходимости require() актив.

Обратите внимание: существует разница в путях разработки и производства, особенно если также используются звездочки. Простое выполнение src="/assets/image.png" иногда работает при разработке, но не в производстве.

person adc    schedule 22.02.2019

Ты можешь попробовать

background: url("/assets/cover-image-medium.png");  

Вместо того

background: url("assets/cover-image-medium.png");
person artgb    schedule 14.08.2017
comment
Не работает - не удалось загрузить ресурс: сервер ответил статусом 404 (не найден) - person Alexey Poimtsev; 14.08.2017
comment
Я внес изменения в development.rb, связанные со статическими активами по этой ссылке, но все еще не работают. Вот журнал - pastebin.com/W1v73fLj Как видите, webpack не компилируется - person Alexey Poimtsev; 14.08.2017

Если вы установили sass-rails gem, попробуйте следующее:

<style scoped>
#intro {
    height: 200px;
    background: image-url("cover-image-medium.png");
}
</style>
person Cong Chen    schedule 14.08.2017
comment
да - он у меня установлен, но ваш код тоже не работает :( - person Alexey Poimtsev; 14.08.2017