The way of Webpack learning (VI.) -- 长缓存优化

使用commonChunkPlugin的都是基于webpack3.10.0,在webpack4中直接配置optimization就可以了。

一:什么是长缓存?

浏览器在用户访问页面的时候,为了加快加载速度,对用户请求的静态资源都会进行存储,但是每次代码更新或者升级的时候,我们都需要浏览器去加载新的代码。最方便的方法就是引入新的文件名称,只下载新的代码块,不加载旧的代码块,这就是长缓存。

二:场景实现

1、业务代码+第三方库代码

解决方法:

  • 提取vendor,hash -> chunkhash
  • 每次打包的时候在输出的界面上输出hash值,代表打包的哈希,而不是每个代码块的哈希,因此把哈希变成代码块的哈希
  • 提取 webpack runtime
// foo.js
import react from ‘react‘
console.lg(‘hello world‘)

//webpack.config.js
const path = require(‘path‘)
const webpack = require(‘webpack‘)
module.exports = {
    entry: {
        main: ‘./src/foo‘,
        // 如果要把vendor和业务代码区分开
        // 独立的给vendor建一个entry就可以了
        vendor: [‘react‘]
    },

    output: {
        path: path.resolve(__dirname, ‘dist‘),
        filename: ‘[name].[chunkHash].js‘
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: ‘vendor‘,
            minChunks: Infinity
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: ‘manifest‘
        })
    ]
}    

这时会有三个文件,vendor、main、manifest,这时再修改代码,再加一个!此时manifest和main发生变化,但是vendor没有发生变化,manifest发生变化是因为代码发生改变,要重新编译,这就达到了改变业务代码,但不改变vendor。

如果不用这种方法,就算vendor的代码不修改,打包出来的文件名的hash值也会发生改变。

2、引入新模块,模块顺序变化,vendor hash变化

问题:这时候进行打包,发现vendor的hash发生变化了,即便没有修改它,说明引入新模块的时候,又打破了原来的内容。

原因:之所以发生变化,在于给打包的同时,会给每个chunk给一个ID,当ID发生变化的时候,hash值也会发生变化。

// foo.js
import react from ‘react‘
import module from ‘./module‘
console.log(‘hello world foo!!‘)

// module.js
export default ‘this is module‘

解决方案:此时打包,原来的chunks是0 1 2,现在的chunks改为main、manifest、vendor

这次再次修改foo.js的代码并进行打包,这时vendor的hash值没有发生变化,而manifest和vendor都发生变化了

//插件数组添加上这个插件new webpack.NamedChunksPlugin(),new webpack.NamedModulesPlugin(),

3、在老版本中,动态引入模块时,vendor hash也会发生变化。(webpack3x已经解决这个问题)

问题:这时只改变了业务代码,这时打包,vendor的哈希没有发生变化,但是冬天引入的模块还是给了一个为0的id,而且没有chunkName,老版本会跟着chunk的变化而变化。

// async.js
export default {
    name: ‘async‘
}

// foo.js
import react from ‘react‘
import module from ‘./module‘
import(‘./async‘).then(function (a) {
    console.log(a)
})
console.log(‘hello world foo!!‘)

解决方案:

import(/* webpackChunkName: ‘async‘ */‘./async‘).then(function (a) {
    console.log(a)
})

三:在webpack4中怎么实现长缓存优化?

在webpack4中已经移除了commonChunkPlugin,直接配置即可。

optimization: {
    splitChunks: {      // 打包 node_modules里的代码
        chunks: ‘all‘
     },
     runtimeChunk: true,  // 打包 runtime 代码
}

vendor的hash值并没有发生改变。

原文地址:https://www.cnblogs.com/weihuan/p/9643095.html

时间: 2024-08-29 12:59:22

The way of Webpack learning (VI.) -- 长缓存优化的相关文章

在线时长缓存

/**     * @desc 在线时长缓存     * @var string     * @access public     */    const KEY_ONLINE_CACHE = 'hd:online:cache';        /**     * @desc 插入  hd_online_data表     * @access public     * @param array $data 数据     * @return boolean     */    public fun

WebPack实例与前端性能优化

[前端构建]WebPack实例与前端性能优化 计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提

LAMP与LNMP加速与缓存优化(二)

开始配置软件,具体软件安装,可以看 LAMP与LNMP加速与缓存优化(一) vi     /application/php/lib/php.ini lamp extension_dir = "/application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/" extension = memcache.so                                                            

PHP服务缓存优化之ZendOpcache、xcache、eAccelerator

PHP服务缓存优化原理 Nginx 根据扩展名或者过滤规则将PHP程序请求传递给解析PHP的FCGI,也就是php-fpm进程 缓存操作码(opcode) Opcode,PHP编译后的中间文件,缓存给用户访问 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件,该文件是执行PHP代码后的一种二进制文件表现形式.默认情况下,这个编译好的操作码文件由PHP引擎执行后丢弃:而操作码缓存的原理就是将编译后的操作码保存下来,并放入到共享内存里,以便再下一次调用

gem5验证数组的缓存优化

陆续写些关于新书<自己动手写CPU>的博客,本篇主要是讲解 gem5验证数组的缓存优化 软件优化是提高cache命中率的十分有效的手段,cache的基本原理是利用程序局部性,而软件优化可以通过提高程序局部性,从而提高cache命中率.举一个例子如下: 程序A: #include <stdio.h> int main() { int i=0,j=0; long count=0; long temp[51200][8]; for(i=0;i<51200;i++) for(j=0;

django缓存优化中caches参数如何配置?

在python开发中,如果运营django进行编写,为了提升效率,常常需要优化缓存,缓存优化中必须掌握的caches参数相关知识: CACHES 配置参数概述 - 格式 CACHES 字典配置格式如下 {'default': {‘BACKEND’:'django.core.cache.backends.locmem.LocMemCache’,}} 配置 CACHES 字典时必须配置 default 缓存 CACHES 配置参数概述 - BACKEND 支持的 BACKEND: 1)'django

hdu - 4920 - Matrix multiplication(缓存优化+开挂)

题意:求两个n x n的矩阵相乘后模3的结果,n <= 800. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920 -->>呀呀.. 1.3层计算的for进行缓存优化,根据CPU的L1级缓存的实现原理,减少缓存的变更.如果每次都计算完一个单元格的结果再计算下一个单元格的结果,那么被乘矩阵的访问就会频繁地更新缓存,使效率很低.. 2.输入开挂,G++提效500ms+.. 3.对乘法进行剪枝.. 没有第1个操作,后果是严重的.. n^3的

LDAP索引及缓存优化

一.设置索引 索引将查找信息和 Directory Server 条目关联起来. Directory Server支持以下几种索引: 1出现索引 (pres) - 列出了具有特定属性的条目,与属性的值无关. 2等式索引 (eq) - 使您能够高效地搜索包含特定属性值的条目. 3近似索引 (approx) - 通过使用 ~= 过滤运算符提供了高效的"音似"搜索功能. 例如,近似索引对于搜索部分名称或拼错的名称很有用.Directory Server 使用 变音位语音算法的一个变体来执行近

LAMP与LNMP加速与缓存优化(一)1

php web引擎缓存加速优化 lamp基础  web环境准备 centos 6.5_64   Apache/2.2.27 (Unix)  mysql5.1.72   php5.3.27 /application/apache/bin/apachectl -V Server version: Apache/2.2.27 (Unix) cat /application/apache/build/config.nice  查看编译的参数 grep  CONFIGURE  /application/m