Vue.js 2:Vue无法从/ assets文件夹中找到文件(v-for)

Ste*_*hen 3 javascript webpack vue.js vuejs2

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

/public
/src
   /assets
      p1.jpg
      p2.jpg
App.vue
main.js
Run Code Online (Sandbox Code Playgroud)

为了使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>
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用。我在控制台中看到错误:“错误:找不到模块'./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>
Run Code Online (Sandbox Code Playgroud)

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

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

Edg*_*ero 7

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

文件夹结构示例:

/api
/public
/public/assets
/public/favicon.ico
/public/index.html
/src
index.js
app.json
Run Code Online (Sandbox Code Playgroud)

等等...

在公共场合,您可以放置​​静态资产,例如图像,字体,图标,robots.txt,sitemap.xml等。

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

在模板HTML中:

<img src="/assets/some-image.svg" alt="Example" />
Run Code Online (Sandbox Code Playgroud)

或在您的组件JS中:

array: [
        {
          iconUrl: '/assets/some-image-1.svg',
          label: 'Some Label'
        }
      ]
Run Code Online (Sandbox Code Playgroud)

否则,您将不得不使用require它,因为它是从src文件夹中拉出的,就像其他人已经说过的那样。但是,将它们放在其中可能不是真正的原因,因此/public/建议使用文件夹。