webpack 块和 vue.js 组件的浏览器缓存问题

Browser cache problems with webpack chunks and vue.js components

问题

我的缓存 Vue.js 组件有问题,我无法在我的设备上重现这个问题,但我们收到的每次客户端更新都会让用户抱怨界面损坏,只有清除浏览器缓存才有帮助。

我使用 Laravel + Vue.js 并且它是多页应用程序。

策略

包含在 app.js 中的一个文件中描述的所有组件,它看起来像这样:

Vue.component('task-feed', () => import('./components/task/task-feed'/* webpackChunkName: "/js/components/task-feed" */));
Vue.component('task-item', () => import('./components/task/task-item'/* webpackChunkName: "/js/components/task-item" */));

有 vue.js 个异步组件。

然后我这样配置 webpack.mix:

let mix = require('laravel-mix');
const webpack = require('webpack');
const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin');
const WebpackChunkHash = require('webpack-chunk-hash');
mix.disableNotifications();
let config = {
    watchOptions: {
        ignored: /node_modules/
    },
    resolve: {
        alias: {
            'vue$': mix.inProduction() ? 'vue/dist/vue.runtime.min.js' : 'vue/dist/vue.runtime.js',
        }
    },
    output: {
        chunkFilename: mix.inProduction() ? '[name].[chunkhash].js' : '[name].js',
    },
    plugins: [
        new webpack.HashedModuleIdsPlugin(),
        new WebpackChunkHash(),
        new ChunkManifestPlugin({
            filename: '/js/chunk-manifest.json',
            manifestVariable: 'webpackManifest',
            inlineManifest: true,
        }),
    ],
};

mix.webpackConfig(config);

我在这里使用 ChunkManifestPlugin,该插件创建块-manifest.json 并且我将它加载到主布局中,如下所示:

window.webpackManifest = JSON.parse(@json(file_get_contents(public_path('/js/chunk-manifest.json'))));

问题

这里可能出了什么问题?任何人都可以建议解决这个问题的方法吗?

webpack.mix.js 中将其更改为:

mix.config.webpackConfig.output = {
    chunkFilename: 'scripts/[name].[chunkhash].js',
    publicPath: '/',
};

有关详细信息,请参阅 this article

配置 webpack.mix.js 以对文件进行版本控制

let version = 0;

mix.config.webpackConfig.output = {
    chunkFilename: 'v/' + version + '/scripts/[name].js',
    publicPath: '/',
};

mix.js('resources/js/app.js', 'public/v/'+version+'/js')
    .sass('resources/sass/app.scss', 'public/v/'+version+'/css');