【问题标题】:How to reference static assets within vue javascript如何在 vue javascript 中引用静态资产
【发布时间】:2020-10-01 19:23:26
【问题描述】:

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

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

Main.vue:

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

我尝试将图像放在资产文件夹和静态文件夹中,但没有成功。我是否必须告诉 vue 以某种方式加载这些图像?

【问题讨论】:

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

标签: javascript vue.js leaflet


【解决方案1】:

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

例子:

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

【讨论】:

  • ...假设您有一个文件夹 src/assets/images。开箱即用,vue-loader 将资产从 src/../... 复制到 build/../.. 或自动将较小的图片内联为 data.image/png..。
  • 对我不起作用:This dependency was not found:* @/assets/more-ico.svg. To install it, you can run: npm install --save @/assets/more-ico.svg...
  • 对我也不起作用,但是.....我看到我使用了错误的文件名;p 完美!
  • 它可以,但是在template 上,如果你想在css background-img 属性中使用,试试../../assets/bg/login.svg 之类的东西,将图像放入assets 文件夹中
  • 谢谢。关于静态资产的 vue 文档过于冗长,几乎将这个主要用例埋在页面底部,用一个小要点。
【解决方案2】:

在 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


这是a DEMO CODESANDBOX 展示它的实际效果。

【讨论】:

  • 在使用 vue-cli 搭建了我的应用程序之后,这种技术对我有用。代码沙箱非常有用。答案不如​​代码沙箱那么清楚。
  • require('./assets/img.png') 在我的组件选项中对我不起作用,我不得不更换 .带有@:require('@/assets/img.png')
【解决方案3】:

更好的解决方案是

在@acdcjunior 的回答中添加一些好的做法和安全性,使用@ 而不是./

在 JavaScript 中

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

在 JSX 模板中

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

使用@ 指向src 目录。

使用~ 指向项目根目录,这样更容易访问node_modules 和其他根级资源

【讨论】:

  • 如果不是图像而是文本文件或 csv 怎么办?只想获取路径/网址?
【解决方案4】:

为了让 Webpack 返回正确的资源路径,你需要使用 require('./relative/path/to/file.jpg'),它会被 file-loader 处理并返回解析后的 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 templates - Handling Static Assets

【讨论】:

    【解决方案5】:

    在打开脚本标签后添加import someImage from '../assets/someImage.png' 并将其用于图标 url iconUrl: someImage

    【讨论】:

    • 在导入中加入“@”时,这对我来说效果很好。
    • 动态图片呢?
    【解决方案6】:

    这终于对我有用,图像作为道具传递:

    <img :src="require(`../../assets/${image}.svg`)">
    

    【讨论】:

    • 或使用“@”:&lt;img :src="require(`@/assets/${image}.svg`)"&gt;
    • 就我而言,我使用了 require(../assets/country-flags-main/...svg)
    【解决方案7】:

    你用的是什么系统?网络包? Vue加载器?

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

    因为 .png 不是 JavaScript 文件,你需要配置 Webpack 使用 file-loader 或 url-loader 来处理它们。用 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 网址,但没有运气
    【解决方案8】:

    使用这样的 require 语法对我有用:

    $('.eventSlick').slick({
        dots: true,
        slidesToShow: 3,
        slidesToScroll: 1,
        autoplay: false,
        autoplaySpeed: 2000,
        arrows: true,
        draggable: false,
        prevArrow: '<button type="button" data-role="none" class="slick-prev"><img src="' + require("@/assets/img/icon/Arrow_Left.svg")+'"></button>',
    

    【讨论】:

      【解决方案9】:

      拥有由 Vue CLI 生成的文件夹的默认结构,例如 src/assets,您可以将图像放在那里并从 HTML 引用它,如下所示 &lt;img src="../src/assets/img/logo.png"&gt;(自动运行,无需对部署进行任何更改)。

      【讨论】:

        【解决方案10】:

        我正在使用带有 vue 的 typescript,但这就是我的做法

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

        【讨论】:

          【解决方案11】:

          您可以根据您的环境定义资产路径

          const dev = process.env.NODE_ENV != 'production';
          const url = 'https://your-site.com';
          const assets = dev ? '' : url;
          
          <template>
              <img :src="`${assets}/logo.png`"/>
              <p>path: {{assets}}</p>
          </template>
          <script>
              export default {
                  data: () => ({
                      assets
                  })
              }
          </script>
          

          理想情况下,这将位于 utils js 文件中,或作为扩展应用程序定义属性,例如:

          const app = createApp(component);
          app.config.globalProperties.$assets = assets;
          app.mount(element);
          

          并且将作为:

          <template>
              <img :src="`${$assets}/logo.png`"/>
              <p>path: {{$assets}}</p>
          </template>
          <script>
              export default {
                  mounted() {
                      console.log(this.$assets);
                  }
              }
          </script>
          

          【讨论】:

            【解决方案12】:

            当然src="@/assets/images/x.jpg 有效, 但更好的方法是: src="~assets/images/x.jpg

            【讨论】:

            • 你能解释一下吗?
            猜你喜欢
            • 2017-07-08
            • 2019-09-09
            • 2022-12-12
            • 2017-09-16
            • 2020-04-30
            • 2018-05-24
            • 2019-05-23
            • 1970-01-01
            相关资源
            最近更新 更多