VueRouter не желает заменять тег `router-view` - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь интегрировать VueRouter в свое небольшое приложение, но в итоге тег router-view заменяется комментарием.

Возможно, это из-за HtmlWebpackPlugin.

Извините за огромные списки, но я думаю, что каждая деталь важна.

main. js:

import Vue from "vue";
import VueRouter from "vue-router";

import PumpView from "./PumpView.vue";

Vue.use(VueRouter);

const router = new VueRouter({
    routes: [
        { path: "/", component: PumpView },
    ],
});

new Vue({
    router,
}).$mount("#app");

index. html:

<!doctype html>
<html lang="en">

<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
    <div id="app">
        <router-view></router-view>
    </div>
</body>

</html>

PumpView. vue:

<template>
    <div class="pump-view">
        <chart-mini-grid></chart-mini-grid>
    </div>
</template>

<style>
.pump-view {
    height: inherit;
}
</style>

<script>
import ChartMiniGrid from "./ChartMiniGrid.vue";

export default {
    components: {
        ChartMiniGrid,
    },
};
</script>

webpack.config. js:

const path = require("path");
const webpack = require("webpack");

const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const VueLoaderPlugin = require("vue-loader/lib/plugin");

module.exports = function () {
    return {
        target: "web",
        mode: "production",
        entry: {
            main: "./src/main.js",
        },
        module: {
            rules: [
                {
                    test: /\.js$/,
                    loader: "babel-loader"
                },
                {
                    test: /\.vue$/,
                    loader: "vue-loader"
                },
                {
                    test: /\.tsx?$/,
                    use: "ts-loader",
                    exclude: /node_modules/,
                },
                {
                    test: /\.css$/,
                    use: [
                        "vue-style-loader",
                        "css-loader"
                    ]
                },
            ]
        },
        resolve: {
            extensions: [".js", ".ts"]
        },
        optimization: {
            runtimeChunk: "single",
            splitChunks: {
                chunks: "all",
                maxInitialRequests: Infinity,
                minSize: 0,
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        name (module) {
                            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
                            return `npm.${packageName.replace('@', '')}`;
                        },
                    },
                },
            },
        },
        plugins: [
            new CleanWebpackPlugin({
                cleanAfterEveryBuildPatterns: [
                    path.join(__dirname, "src/lightweight-charts/dist"),
                ],
            }),
            new webpack.DefinePlugin({
                PRODUCTION: true,
            }),
            new webpack.HashedModuleIdsPlugin(),
            new HtmlWebpackPlugin({
                title: "Geralt",
                filename: "index.html",
                template: "src/index.html",
                favicon: "src/assets/favicon.png",
            }),
            new VueLoaderPlugin(),
        ],
        output: {
            path: path.join(__dirname, "dist"),
            filename: "[contentHash].js",
            chunkFilename: "[name].[contentHash].js",
            publicPath: "/",
        },
    };
};

Я несколько часов пытался возиться с этим материалом, включая удаление HtmlWebpackPlugin и поместив шаблон HTML в конструктор объекта Vue:

new Vue({
    router,
    template: `<html>...</html>`,
}).$mount("#app");

Теперь я не знаю, что еще я могу попробовать.

Я подозреваю, что некоторые вещи в моей конфигурации Webpack конфликтует с конфигурацией idiomati c VueRouter.

Мой PumpView компонент не сломан, поскольку все работает как шарм, если я добавляю функцию рендеринга рядом с полем маршрутизатора:

new Vue({
    router,
    render: h => h(PumpView),
}).$mount("#app");

PS Я не использую webpack-dev-server, а собираю с производственной конфигурацией, s o это не так.

1 Ответ

1 голос
/ 11 июля 2020

Во-первых, вам нужно приложение. vue, контейнер, который включает маршрутизатор

<!-- App.vue -->
<template>
  <div>
    <router-view/>
  </div>
</template>

, затем используйте его при инициализации Vue

import App from './App.vue'
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

Поскольку router-view является компонентом Vue, вы не должны использовать его во внешнем html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...