如何使用 webpacker 访问资产 gem
How to access assets with webpacker gem
你能解释一下如何从 vue.js 组件中的 webpacker gem 访问资源吗?例如 - 如何创建带有背景图像的 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>
不工作:(
怎么了?
你可以试试
background: url("/assets/cover-image-medium.png");
而不是
background: url("assets/cover-image-medium.png");
如果您已经安装了 sass-rails
gem,试试这个:
<style scoped>
#intro {
height: 200px;
background: image-url("cover-image-medium.png");
}
</style>
如果我对你的问题的理解正确,你必须在 build
文件夹中找到 webpack.base.conf.js
文件,然后找到如下所示的代码:
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src')
}
}
然后将以下行添加到 alias
对象:'assets': resolve('src/assets/')
,这将适用于 src
文件夹正下方的 assets
文件夹。您还可以将密钥字符串从 assets
更改为您想要的任何别名。
编辑:
我忘了说,要访问样式代码中的别名,您必须在它前面加上 ~
(telda),这样 assets
就变成了 ~assets
.
新 Rails' webpacker 的东西非常原始,所以这是适合我的配置:
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>
由于某些原因波浪号在这里不起作用,因此使用相对路径。
因为这是用 Vue.js 标记的,所以我会回答这个问题。 None 的其他答案适用于 Vue 2.x。
对于属性
A webpacker require
声明 returns 所需资产的完整 URL(根据 webpacker.yml
内的 resolved_paths
解决)。基于此,您可以执行以下操作:
<img :src="require('images/what-a-pain.png')" alt="Finally working" />
请注意导致 src
属性绑定到 javascript 表达式结果的冒号。
您还可以通过附加 ID 锚点来使用它们,例如使用 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
,是否有范围
只需使用波浪号 ~
和路径。路径必须 相对于 包含它的文件或来自 webpacker.yml
的 resolved_paths
。
.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()
资产。
请注意:开发和生产之间的路径存在差异,尤其是在同时使用 Sprockets 的情况下。简单地做 src="/assets/image.png"
有时会在开发中起作用,但在生产中不起作用。
你能解释一下如何从 vue.js 组件中的 webpacker gem 访问资源吗?例如 - 如何创建带有背景图像的 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>
不工作:(
怎么了?
你可以试试
background: url("/assets/cover-image-medium.png");
而不是
background: url("assets/cover-image-medium.png");
如果您已经安装了 sass-rails
gem,试试这个:
<style scoped>
#intro {
height: 200px;
background: image-url("cover-image-medium.png");
}
</style>
如果我对你的问题的理解正确,你必须在 build
文件夹中找到 webpack.base.conf.js
文件,然后找到如下所示的代码:
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src')
}
}
然后将以下行添加到 alias
对象:'assets': resolve('src/assets/')
,这将适用于 src
文件夹正下方的 assets
文件夹。您还可以将密钥字符串从 assets
更改为您想要的任何别名。
编辑:
我忘了说,要访问样式代码中的别名,您必须在它前面加上 ~
(telda),这样 assets
就变成了 ~assets
.
新 Rails' webpacker 的东西非常原始,所以这是适合我的配置:
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>
由于某些原因波浪号在这里不起作用,因此使用相对路径。
因为这是用 Vue.js 标记的,所以我会回答这个问题。 None 的其他答案适用于 Vue 2.x。
对于属性
A webpacker require
声明 returns 所需资产的完整 URL(根据 webpacker.yml
内的 resolved_paths
解决)。基于此,您可以执行以下操作:
<img :src="require('images/what-a-pain.png')" alt="Finally working" />
请注意导致 src
属性绑定到 javascript 表达式结果的冒号。
您还可以通过附加 ID 锚点来使用它们,例如使用 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
,是否有范围
只需使用波浪号 ~
和路径。路径必须 相对于 包含它的文件或来自 webpacker.yml
的 resolved_paths
。
.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()
资产。
请注意:开发和生产之间的路径存在差异,尤其是在同时使用 Sprockets 的情况下。简单地做 src="/assets/image.png"
有时会在开发中起作用,但在生产中不起作用。