zoukankan      html  css  js  c++  java
  • 【webpack学习笔记】a08-缓存

    一般要优化网站的加载速度可以从缓存入手,利用缓存可以降低网络流量,减少访问请求,从而可以达到加快访问速度的目的.
    但是,如果一旦将文件缓存,那么有更新的时候就不能及时更新,若要看到最新内容,那么就需要清除缓存重新加载,这样加载速度就会很慢,达不到优化网站加载的目的。
    解决的办法是添加版本号,也可以说是在文件名上加个hash值,如果有更改的文件,那么hash值就会有变化,没有更改的文件,文件名就不变。有更新的时候就会加载最新更改的文件,其他没变动的文件就利用缓存减少没必要的加载,这样就可以优化加载速度。

    webpack中可以在output的filename输出文件名中规定文件名带hash值打包:

    output:{
        filename: '[name]-[chunkhash:5].bundle.js',
        path: path.resolve(__dirname,'dist')
    }
    

    需要注意的是,这里可以选hashchunkhash,它们的使用范畴:

    • hash
      1. 使用 hash 对js和css进行签名时,每一次hash值都不一样,导致无法利用缓存
      2. 原因是因为, hash 字段是根据每次编译compilation的内容计算所得,也可以理解为项目总体文件的hash值,而不是针对每个具体文件的。(所以每一次编译都会有一个新的hash,并不适用)
      3. 解决:不用hash,而用 chunkhash (js和css要使用chunkhash), chunkhash 的话每一个js的模块对应的值是不同的(根据js里的不同内容进行生成)
    • chunkhash
      chunkhash只试用与js和css文件,在图片和字体资源中,chunkhash会报错。

    然后就是提取模板:大多数时候,我们如果要更新修改只会更新我们的业务逻辑文件,比如jq/bootstrap等库我们其实并不会修改。那么我们就可以把这些第三方库另外打包。


    完整例子:

    webpack.config.js

    const path = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const webpack = require('webpack');
    
    module.exports = {
        entry: {
            index: './src/index.js'
        },
        devtool:'source-map',
        plugins:[
            new CleanWebpackPlugin(['dist']),
            new HtmlWebpackPlugin({
                title:'Caching',
                template:'./src/index.html'
            })
        ],
        optimization:{
            splitChunks: {
                cacheGroups: {
                    commons: {
                        chunks: 'initial',
                        minChunks:2,
                        name: 'commons'
                    },
                    'vendor':{
                        test: /lodash/,
                        chunks: "initial",
                        name: "vendor",
                        enforce: true
                    }
                }
            }
        },
        output:{
            filename: '[name]-[chunkhash:5].bundle.js',
            path: path.resolve(__dirname,'dist')
        }
    }
    

    index.js

    import _ from 'lodash';
    import Print from './print';
    
    function component(){
        var element = document.createElement('div');
    
        element.innerHTML = _.join(['Hello','2019~'], '--');
        element.onclick = Print.bind(null, 'hello 25! come on!!')
    
        return element;
    }
    
    document.body.appendChild(component());
    

    print.js

    export default function print(text){
        console.log(text);
    }
    

    最后输出项目结构:


    这里有需要注意的是,提取模板和分离代码这块,在官方文档中用的是CommonsChunkPlugin插件,但这个插件在webpack4版本中已经被废弃,可用optimization.splitChunks代替。
    具体用法可参照官方文档中插件介绍,和网上的一篇资料有详细记载:
    https://juejin.im/post/5af1677c6fb9a07ab508dabb

  • 相关阅读:
    Autotools使用流程【转】
    Linux下GCC生成和使用静态库和动态库【转】
    Linux驱动模块的Makefile分析【转】
    GNU C 中零长度的数组【转】
    Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】
    程序(进程)内存分布解析【转】
    【转】用户空间使用i2c_dev--不错
    开源课堂网址
    【转】用Device tree overlay掌控Beaglebone Black的硬件资源
    【转】Device Tree(三):代码分析
  • 原文地址:https://www.cnblogs.com/mlcat/p/10242316.html
Copyright © 2011-2022 走看看