Производственная сборка Vue-cli без статических изображений

Я пытаюсь сделать так, чтобы наш логотип отображался в сборке Vue-Cli.

Если я сделаю vue-cli-service serve (запустить webpack dev server), изображения разрешаются (я вижу их в веб-браузере). Однако, если я обслуживаю связанные файлы (используя узел или что-то еще), изображения не разрешаются, несмотря на то, что они находятся в правильной папке. Я вижу на своей вкладке сеть запрос 200 OK для http://localhost:8888/img/logo.fdcc9ca9.png, что означает, что правильный объект с именем файла виден в правильном месте. Я также могу видеть это там, где правильно на моей вкладке источников.

Кроме того, если я проверяю элемент, он выглядит так, что также выглядит правильно:

<img data-v-0242e324="" src="/img/logo.fdcc9ca9.png" alt="logo">

Несмотря на все это, на производственной сборке изображение показывает миниатюру класса HTML "неработающее изображение".

Что не так? Как я могу не показывать миниатюру "испорченного изображения" при сборке? Почему он работает на webpack-dev-server, а не на производстве?

Logo.vue

<template>
  <img src="../img/logo.png" alt="logo">
</template>
<script>
  ...
</script>

vue.config.js

const path = require('path');
const webpack = require('webpack');
module.exports = {
    chainWebpack: config => {
        config.resolve.alias
            .set('@', path.resolve(__dirname, 'client/src'));
        config
            .plugin('provide')
            .use(webpack.ProvidePlugin, [{
                $: 'jquery',
                jquery: 'jquery',
                jQuery: 'jquery',
                'window.jQuery': 'jquery'
            }]);
        config.plugin("html")
            .tap(args => {
                args[0].template = "./client/index.html"
                return args
            })
    },
    runtimeCompiler: true,
    devServer: {
        proxy: 'http://localhost:8888'
    }
}

package.json

...
    "serve:ui": "vue-cli-service serve client/src/main.js",
    "build:ui": "vue-cli-service build --dest build/public/ client/src/main.js",
...

структура папок, разработка

client/
  src/
    img/
      logo.png
    components/
      Logo.vue

структура папок, выходная сборка

build/
  public/
    css/
    fonts/
    img/
      logo.fcdd9ca9.png
    js/
    index.html

1 ответ

Ответ - наш API был неверно настроен.

Короче говоря, не было никакого обработчика для изображений (или шрифтов). Как указал @aBiscuit, при попытке запроса прямо в моем браузере для любых URL-адресов моего изображения был возвращен index.html, который является резервным API для запросов стекового файла, который он не понимает.

Без нашего кода это бесполезно, но добавление следующего к нашей обработке маршрута решило проблему:

routes.ts

router.get('/img/:file', async (ctx, next) => {
    await next();
    await send(ctx, `build/public/img/${ctx.params.file}`);
});
Другие вопросы по тегам