15

你能解释一下如何从 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>

不工作:(

怎么了?

4

5 回答 5

14

New 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>

由于某种原因,波浪号在这里不起作用,因此使用了相对路径。

于 2017-09-05T15:35:50.787 回答
5

如果我正确理解您的问题,您将必须在文件夹中找到该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.

于 2017-08-18T17:48:32.733 回答
3

因为这是用 Vue.js 标记的,所以我会回答这个问题。其他答案均不适用于 Vue 2.x。

对于属性

webpackerrequire语句返回所需资产的完整 URL(根据您的resolved_paths内部解析webpacker.yml)。基于此,您可以执行以下操作:

<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,范围与否

只需使用波浪号~和路径。路径必须对于包含它的文件或resolved_pathsfrom 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()资产。

请注意:开发和生产之间的路径有所不同,特别是如果同时使用 Sprockets。简单地做src="/assets/image.png"有时会在开发中起作用,但在生产中不起作用

于 2019-02-22T01:55:52.660 回答
1

你可以试试

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

代替

background: url("assets/cover-image-medium.png");
于 2017-08-14T01:42:31.990 回答
0

如果你已经安装了sass-railsgem,试试这个:

<style scoped>
#intro {
    height: 200px;
    background: image-url("cover-image-medium.png");
}
</style>
于 2017-08-14T03:06:51.557 回答