Pourriez-vous m'expliquer comment accéder aux actifs à partir de Webpacker gem dans les composants vue.js? Par exemple, comment créer un div avec une image d’arrière-plan. J'ai essayé d'utiliser les dossiers/app/assets/images et/app/javascripts/assets, mais les images ne sont disponibles que dans la section modèle, mais pas dans la section style :(
dans mon cas
<template>
<div id="home">
<div id="intro">
<img src="assets/cover-image-medium.png" alt="">
</div>
</div>
</template>
fonctionne bien, mais
<style scoped>
#intro {
height: 200px;
background: url("assets/cover-image-medium.png");
}
</style>
ne fonctionne pas :(
Qu'est-ce qui ne va pas?
Le contenu de Webpacker de New Rails est plutôt brut, c'est donc la configuration qui fonctionne pour moi:
config/webpacker.yml (pour Webpacker 3):
resolved_paths: ['app/javascript/images', 'app/javascript/src']
compile: false
# ...
Fichiers JS:
/app
/javascript
/packs
# only entry point files
vue_application.js
/src
some_component.vue
/images
logo.svg
en composant:
<script>
import 'images/logo.svg'
</script>
dans le modèle:
<img src='~images/logo.svg' />
pointez le tilde ici - cela signifie que l'image est une dépendance de module
en CSS:
<style lang='sass'>
#app
background: url('../images/logo.svg')
</style>
Pour une raison quelconque, le tilde ne fonctionne pas ici, donc le chemin relatif est utilisé.
Si je comprends bien votre question, vous devrez trouver le fichier webpack.base.conf.js
dans votre dossier build
, puis trouver le code qui ressemble à ceci:
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src')
}
}
Ajoutez ensuite la ligne suivante à l’objet alias
: 'assets': resolve('src/assets/')
, qui fonctionnera pour le dossier assets
situé juste en dessous du dossier src
. Vous pouvez également changer la chaîne de clé de assets
à n'importe quel nom d'alias de votre choix.
MODIFIER:
J'ai oublié de mentionner, pour accéder aux alias en code de style, vous devez le préfixer avec un ~
(telda) afin que assets
devienne ~assets
.
Tu peux essayer
background: url("/assets/cover-image-medium.png");
Au lieu de
background: url("assets/cover-image-medium.png");
Si vous avez installé sass-Rails
gem, essayez ceci:
<style scoped>
#intro {
height: 200px;
background: image-url("cover-image-medium.png");
}
</style>
Puisque ceci est étiqueté avec Vue.js, je vais répondre pour cela. Aucune des autres réponses ne fonctionnait avec Vue 2.x.
Une instruction webpacker require
renvoie l'URL complète de l'actif requis (résolu en fonction de votre resolved_paths
dans webpacker.yml
). Sur cette base, vous pouvez faire quelque chose comme ceci:
<img :src="require('images/what-a-pain.png')" alt="Finally working" />
Veuillez noter que les deux points qui lient l'attribut src
sont liés au résultat de l'expression javascript.
Vous pouvez également utiliser des ancres d'ID en les ajoutant, par exemple avec SVG:
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<use :href="require('images/icons.svg') + '#copy'" />
</svg>
Les modèles Vue sont généralement précompilés en équivalents javascript. Par conséquent, une instruction require
est nécessaire pour extraire les actifs au moment de la compilation et non à l'exécution.
urls
, porté ou nonUtilisez simplement un tilde ~
et un chemin. Le chemin doit être relatif pour le fichier le contenant ou le resolved_paths
à partir de 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;
}
Pour cette utilisation, il n'est pas nécessaire de require()
de l'actif.
Veuillez noter: il existe une différence entre le développement et la production, en particulier si vous utilisez également des pignons. Faire simplement src="/assets/image.png"
fonctionnera parfois en développement, mais pas en production .