使用 vue-router 实现嵌套路由,在二级路由下刷新页面无法加载打包的bundle文件

新手上路,请多包涵

问题描述

在 vue+webpack 项目中使用 vue-router 的 history 模式实现嵌套路由,在二级路由下刷新页面后无法加载打包后的 bundle 文件。

clipboard.png

报的错误如上图。查看 network 可以看到获取 app.bundle.js 文件的路径不对

clipboard.png

正确的请求应该是 localhost:8080/app.bundle.js

相关代码

贴一下配置文件。

这是 webpack.common.js,webpack 的基本配置文件。

module.exports = {
    entry: {
        app: [ './src/main.js' ]
    },
    output: {
        filename: '[name].bundle.js',
        chunkFilename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    resolve: {
        alias: {
            '@': path.resolve(__dirname, 'src'),
            vue$: 'vue/dist/vue.runtime.esm.js'
        },
        extensions: [
            '.js',
            '.jsx',
            '.vue',
            '.json'
        ],
        modules: [ 'node_modules' ]
    },
    plugins: [
        new webpack.DefinePlugin({
            'process.env.BASE_URL': '"/"'
        }),
        new CleanWebpackPlugin([ 'dist' ]),
        new HtmlWebpackPlugin({
            template: path.resolve(__dirname, 'public/index.html'),
            favicon: path.resolve(__dirname, 'public/favicon.ico')
        }),
        // 将定义的其它规则复制并应用到 .vue 文件里相应语言块
        new VueLoaderPlugin(),
        new ManifestPlugin()
    ],
    module: {
        noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/,
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
                loader: 'file-loader'
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,
                loader: 'file-loader'
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader'
            },
            {
                test: /\.css$/,
                use: [
                    'vue-style-loader',
                    'css-loader'
                ]
            },
            {
                test: /\.scss$/,
                loader: 'vue-style-loader!css-loader!sass-loader'
            }
        ]
    }
};

这是定义的路由:

export default new Router({
    mode: 'history',
    routes: [
        {
            path: '/',
            redirect: to => {
                return 'login'
            }
        },
        {
            path: '/login',
            name: 'login',
            component: Login
        },
        {
            path: '/main',
            name: 'main',
            component: Layout,
            children: [
                {
                    path: 'companys',
                    name: 'companys',
                    component: Companys
                },
                {
                    path: 'users',
                    name: 'users',
                    component: Users
                }
            ]
        }
    ]
})

你期待的结果是什么?实际看到的错误信息又是什么?

因为我不是直接在 index.html 里引用 app.bundle.js 文件的,而是用 HtmlWebpackPlugin 将 index.html 作为模板,在输出的时候添加引用 app.bundle.js 文件的标签,我感觉是这个引用资源的路径出错了, src="app.bundle.js 应该是相对路径,所以这个时候会找不到文件,有没有办法改变这个路径呢?如果我的想法是错得话,那有什么方法能让嵌套路由页面刷新后仍然能够正常显示呢?

阅读 3.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题