如何在Vue JavaScript中引用静态资产


90

我正在寻找引用静态资产的正确网址,例如Vue javascript中的图像。

例如,我正在使用自定义图标图像创建传单标记,并且尝试了多个网址,但它们都返回了404 (Not Found)

Main.vue:

var icon = L.icon({
    iconUrl: './assets/img.png',
    iconSize:     [25, 25],
    iconAnchor:   [12, 12]
});

我试过将图像放在资产文件夹和静态文件夹中没有任何运气。我是否必须告诉Vue以某种方式加载这些图像?


webpack?通常,我们想知道是否包含图像,以便将其放入包中。只要将映像部署到您的服务器,其他的捆绑系统可能就不在乎
akatakritos

Answers:


158

对于希望从模板中引用图像的任何人,您都可以使用'@'直接引用图像

例:

<img src="@/assets/images/home.png"/>

2
...如果您有一个文件夹src / assets / images。开箱即用,vue-loader将资源从src / .. / ...复制到build /../ ..或自动将较小的图片内嵌为data.image / png..。
约翰内斯

9
不适用于我: This dependency was not found:* @/assets/more-ico.svg. To install it, you can run: npm install --save @/assets/more-ico.svg...
Jakub Strebeyko

2
也没有为我工作,但是.....然后我看到我使用了错误的文件名; p完美!
拉赞(Larzan)

6
它可以工作,但是在上template,如果您想在css background-img属性中使用,请尝试类似的操作../../assets/bg/login.svg,并将图像放入资产文件夹
calebeaires

5
谢谢。有关静态资产的vue文档不必要地冗长,几乎在页面底部的一个小项目中就隐藏了这个主要用例。
Our_Benefactors

65

在Vue常规设置中,/assets不提供服务。

图像变成src="data:image/png;base64,iVBORw0K...YII="字符串。


在JavaScript中使用: require()

要从JS代码获取图像,请使用require('../assets.myImage.png')。路径必须是相对的(请参见下文)。

因此您的代码将是:

var icon = L.icon({
    iconUrl: require('./assets/img.png'),   // was iconUrl: './assets/img.png',
//  iconUrl: require('@/assets/img.png'), // use @ as alternative, depending on the path
    // ...
});

使用相对路径

例如,假设您具有以下文件夹结构:

- src
  +- assets
     - myImage.png
  +- components
     - MyComponent.vue

如果您要引用中的图片MyComponent.vue,则该路径为../assets/myImage.png


是演示其动作的DEMO CODESANDBOX


2
在用vue-cli搭建我的应用后,这项技术对我有用。代码沙箱非常有帮助。答案并不像代码沙箱那么清晰。
revdrjrr

require('./assets/img.png')在组件的选项中对我不起作用,我不得不替换了。用@: require('@/assets/img.png')
迈克尔

22

为了使Webpack返回正确的资产路径,您需要使用require('./ relative / path / to / file.jpg'),它将由文件加载器处理并返回解析的URL。

computed: {
  iconUrl () {
    return require('./assets/img.png')
    // The path could be '../assets/img.png', etc., which depends on where your vue file is
  }
}

请参阅VueJS模板-处理静态资产


21

更好的解决方案是

在@acdcjunior的答案中添加一些好的做法和安全性,以@代替./

在JavaScript中

require("@/assets/images/user-img-placeholder.png")

在JSX模板中

<img src="@/assets/images/user-img-placeholder.png"/>

使用@指向src目录。

使用~指向项目根目录的点,这样可以更轻松地访问node_modules和其他根目录级资源


如果不是图像而是文本文件或csv,该怎么办?并且只想获取路径/ URL?
火车

7

在添加脚本标签后,只需添加import someImage from '../assets/someImage.png' 并用于图标网址iconUrl: someImage


在导入中加入“ @”时,这对我来说效果很好。
vab2048,

2

您正在使用什么系统?Webpack?Vue加载器?

我只会在这里集思广益...

由于.png不是JavaScript文件,因此您需要将Webpack配置为使用文件加载器或url加载器来处理它们。装有vue-cli的项目也为您配置了此项目。

您可以看一下webpack.conf.js以查看是否配置正确,例如

...
    {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
...

/assets 用于捆绑期间由webpack处理的文件-为此,必须在您的JavaScript代码中的某处引用它们。

可以放置其他资产/static,此文件夹的内容将按/dist原样复制到。

我建议您尝试更改:

iconUrl: './assets/img.png'

iconUrl: './dist/img.png'

您可以在此处阅读官方文档:https : //vue-loader.vuejs.org/en/configurations/asset-url.html

希望对您有帮助!


我不确定我正在使用哪个系统,或者是否必须手动添加它。我尝试了./dist网址,但没有运气
JBaczuk

0

具有由Vue CLI生成的默认文件夹结构,例如,src/assets您可以将图像放置在此处,并按以下方式从HTML引用它<img src="../src/assets/img/logo.png">(也可以自动运行,部署时也无需任何更改)。


0

我在vue中使用打字稿,但这就是我的处理方式

<template><div><img :src="MyImage" /></div></template>
<script lang="ts">
    import { Vue } from 'vue-property-decorator';
    export default class MyPage extends Vue {
            MyImage = "../assets/images/myImage.png";
        }
</script>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.