webpack优化-缓存

解决方案

生成manifest文件

module.exports = {
    entry: {
        app: './js/app.js',
        vendor: ['./js/moduleA', './js/moduleB']
    },
    output: {
        path: path.resolve(__dirname, './dist/js'), //编译到当前目录,这个目录要求要绝对路径
        filename: '[name].[chunkhash].js', //编译后的文件名字
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            names: ['vendor', 'manifest']     
        })
    ]
};

每次构建时,webpack 生成了一些 webpack runtime 代码,用来帮助 webpack 完成其工作。当只有一个 bundle 的时候,runtime 代码驻留在其中。但是当生成多个 bundle 的时候,运行时代码被提取到了公共模块中,在这里就是 vendor 文件。这些runtime代码会影响vendor的hash。因此:

我们将运行时代码( webpack runtime)提取到一个单独的 manifest 文件中,使得这些代码不会影响vendor的hash。
※ output的filename要用chunkhash,如果用hash是不会有效果的
※ 不一定命名为manifest,取名任意

问题:打包后的文件带有hash,如何在html中正确引用?

1、使用webpack-manifest-plugin从webpack编译统计中获取文件名

var ManifestPlugin = require('webpack-manifest-plugin');
module.exports = {
    entry: {
        app: './js/app.js',
        vendor: ['./js/moduleA', './js/moduleB']
    },
    output: {
        path: path.resolve(__dirname, './dist/js'), //编译到当前目录,这个目录要求要绝对路径
        filename: '[name].[chunkhash].js', //编译后的文件名字
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            names: ['vendor', 'manifest']     //将公共模块提取,生成名为‘verdors’的chunk
        }),
        new ManifestPlugin({
            fileName: 'my-manifest.json'
        })
    ]
};

生成my-manifest.json

{
  "app.js": "app.155567618f4367cd1cb8.js",
  "vendor.js": "vendor.c2330c22cd2decb5da5a.js"
}

最后怎么在html中用到还不清楚

2、使用html-webpack-plugin

var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    entry: {
        app: './js/app.js',
        vendor: ['./js/moduleA', './js/moduleB']
    },
    output: {
        path: path.resolve(__dirname, './dist/js'), //编译到当前目录,这个目录要求要绝对路径
        filename: '[name].[chunkhash].js', //编译后的文件名字
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            names: ['vendor', 'manifest']     //将公共模块提取,生成名为‘verdors’的chunk
        }),
        new HtmlWebpackPlugin({ 
            filename: 'index.html',
            template: './index.html'
        })
    ],
    resolve: {
        extensions: ['.js', '.jsx', '.less', '.scss', '.css'], //后缀名自动补全
    }
};

会在output指定的目录中生成html,并自动引用对应的模块

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容