【问题标题】:Vue.js 2: Vue cannot find files from /assets folder (v-for)Vue.js 2:Vue 无法从 /assets 文件夹中找到文件 (v-for)
【发布时间】:2018-08-29 17:18:06
【问题描述】:

我正在使用带有 Webpack 的 Vue-cli 3,我的文件夹结构如下所示:

/public
/src
   /assets
      p1.jpg
      p2.jpg
App.vue
main.js

我在几个地方读到,为了让 Webpack 知道你的 /assets 在哪里,如果你在 Javascript 领域,你应该使用 require()。

我已确定此代码有效:

<template>
    <div>
        <ul>
            <li v-for="photo in photos" :key="photo.id">
                <img :src="photo.imageUrls.default" />
            </li>
        </ul>
    </div>
</template>


<script>
    /* For webpack to resolve URLs in javascript during the build, you need the require() function */
    export default {
        data() {
            return {
                photos: [
                    {
                        id: 1,
                        caption: 'P1',
                        series: '',
                        notes: '',
                        imageUrls: {
                            default: require('./assets/p1.jpg')
                        }
                    },
                    {
                        id: 2,
                        caption: 'P2',
                        series: '',
                        notes: '',
                        imageUrls: {
                            default: require('./assets/p2.jpg')
                        }
                    }
                ]
            }
        }
    }
</script>

但是,这不起作用。我在控制台中看到一个错误: “错误:找不到模块'./assets/p1.jpg'”

<template>
        <div>
            <ul>
                <li v-for="photo in photos" :key="photo.id">
                    <img :src="imagePath(photo)" />
                </li>
            </ul>
        </div>
</template>


<script>
    /* For webpack to resolve URLs in javascript during the build, you need the require() function */
    export default {
        data() {
            return {
                photos: [
                    {
                        id: 1,
                        caption: 'P1',
                        series: '',
                        notes: '',
                        imageUrls: {
                            default: './assets/p1.jpg'
                        }
                    },
                    {
                        id: 2,
                        caption: 'P2',
                        series: '',
                        notes: '',
                        imageUrls: {
                            default: './assets/p2.jpg'
                        }
                    }
                ]
            }
        },
        methods: {
            imagePath(photo) {
                return require(photo.imageUrls.default);
            }
        }
    }
</script>

是否有人可以帮助解释第二个示例中的问题?我希望避免将 require() 调用放入数据中,因为该数据可能来自服务器,并且在数据中放入 require() 调用对我来说似乎很奇怪。谢谢。

编辑:根据 Edgar 在下面的建议,由于我的图像是服务器的一部分而不是应用程序的一部分,我可以将它们放入 /public 文件夹中的文件夹中,根本不处理 require()。

【问题讨论】:

    标签: javascript vue.js webpack vuejs2


    【解决方案1】:

    Vue.js 有一个公用文件夹。如果您使用的是 Vue CLI,它应该已经为您创建了一个公用文件夹,您必须将所有资产放在此文件夹中。在官方Vue.js documentation.了解更多信息

    示例文件夹结构:

    /api
    /public
    /public/assets
    /public/favicon.ico
    /public/index.html
    /src
    index.js
    app.json
    

    等等……

    您可以公开放置静态资源,例如图片、字体、favicon、robots.txt、sitemap.xml 等。

    然后链接到您将使用的这些静态资产:

    在您的模板 HTML 中:

    <img src="/assets/some-image.svg" alt="Example" />
    

    或者在你的组件 JS 中:

    array: [
            {
              iconUrl: '/assets/some-image-1.svg',
              label: 'Some Label'
            }
          ]
    

    否则您必须使用require,因为它是从src 文件夹中提取的,正如其他人已经说过的那样。但可能没有真正的理由将它们放在那里,因此建议使用 /public/ 文件夹。

    【讨论】:

    • 埃德加:感谢您的意见。这些图像将在服务器上,而不是应用程序本身的一部分。我没有意识到 /public 文件夹的用途。我将图像移到那里,并且能够避免使用 require()
    • 酷 - 很高兴我能帮上忙 :)
    • 嘿伙计!非常感谢。如果可能的话,我会给 50 票,对于这些问题有一堆愚蠢的答案。您是唯一一个解释其工作原理的人。
    【解决方案2】:

    您需要require,因为您的资源捆绑在客户端上。

    如果您想在服务器上使用资源,请将其放在 public folder 中。

    我们经常看到的另一个问题是当你的组件在 components 文件夹中时。如果是这样,请尝试:

    default: require('../assets/p1.jpg')
    

    【讨论】:

    • Steven:这些图像在服务器上,所以我可以将它们移动到 /public 文件夹中的某个文件夹中。我可以完全删除 require() 调用。谢谢!
    【解决方案3】:

    我认为这个问题是您可以搜索的常见问题。解决方法是将资源文件放在静态目录下。资产文件夹中的文件会被webpack处理,所以html模块没有问题,购买代码模块有问题。

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2014-06-17
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多