webpack代码分片的实现

目录
  • 背景
  • CommonsChunkPlugin
  • splitChunks
  • 配置
  • 异步加载资源
  • 总结

背景

实现高性能应用其中最重要的一点就是尽可能地让用户每次只加载必要的资源,优先级不要太高的资源则采用延迟加载等技术渐进式地获取,这样可以保证页面的首屏速度。代码分片是webpck打包工具所特有的一项技术,通过这项功能可以把代码按照特定的形式进行拆分,使用户不必一次全部加载,而是按需加载。

CommonsChunkPlugin

虽然这个插件在webpack4当中已经不推荐使用,但是我们还是要了解一下。这个插件可以将多个Chunk中的公共的部分提取出来。公共模块提取可以为几个项目带来几个收益:

  • 开发过程中减少了重复模块打包,可以提升开发速度;
  • 减小整体资源体积;
  • 合理分片后的代码可以更有效的利用客户端缓存。

该插件的默认规则是只要一个模块被两个入口chunk所使用就会被提取出来,比如只要a和b用了react,react就会被提取出来。但是它仍有些不足之处:

  • 一个CommonChunkPlugin只能提取一个vendor,假如我们想提取多个vendor,则需要配置多个插件,这回增加很多重复的配置代码。
  • 前面我们提到的mainfest实际上使浏览器多加载一个资源,这对于页面渲染速度不是友好的。
  • 由于内部设计上的一些缺陷,CommonChunkPlugin在提取公共模块的时候会破坏掉原有的chunk中模块的依赖关系,导致难以进行更多的优化。

splitChunks

这是webpack新增的一个功能,改进了CommonChunkPlugin而重新设计和实现的代码分片特性,不仅比CommonChunkPlugin功能更加强大,还更简单易用。代码如下

module.exports = {
    entry: './foo.js',
    output: {
        filename: 'foo.js',
        publicPath: '/dist/'
    },
    mode: 'development',
    optimization: {
        splitChunks: {
            chunks: 'all',
        }
    }
}

// foo.js
import React from 'react';
import('./bar.js');
document.write('foo.js', React.version);

// bar.js
import react from 'react';
console.log('bar.js', React.version);

splitChunk默认情形下的提取条件:

  • 提取后的chunk可被共享或者来自node_modules目录。这一条很容易理解,被多次引用或处于node_modules中的模块更倾向于是通用模块,比较适合被提取出来。
  • 提取后的js chunk会有相应的体积,比如大于30KB,Css Chunk体积假如大于50KB,这个也比较容易理解,如果提取后的资源体积太小,那么带来的优化效果也一般。
  • 在按需加载的过程,并行请求的资源最大值小于等于5,按需加载指的是,通过动态插入script标签的方式加载脚本。我们一般不希望同时加载过多的资源,因为每一个请求都要花费建立链接和释放链接的成本,因此提取的规则只在并行请求不多的时候生效。
  • 在首次加载时,并行请求的资源数最大值小于等于3,和上一条类似,只不过在页面首次加载时往往对性能要求更高,因此这里的默认阀值也更低。

配置

splitChunk:{
    chunks: 'async',
    minSize: {
        javascript: 30000,
        style: 50000,
    },
    maxSize: 0,
    minChunks: 1,
    maxAsyncRequests: 5,
    maxInitialRequests: 3,
    automaticNameDelimiter: '~',
    name: true,
    cacheGroups:{
        vendor: {
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
        },
        default: {
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true
        }
    }
}

匹配模式
chunks的值有三个,async(默认)、initial、all。async只提取异步chunks,initial只对入口chunk生效,all两种模式同时开启(推荐使用)

匹配条件
minSize、minChunks、maxAsyncRequests、maxInitialRequests

命名
默认为true,它意味着可以根据不能cacheGroups和作用范围自动为新生成的chunk命名,并以automaticNameDelimiter分隔。

cacheGroup
可以理解为分离chunks时 的规则,默认情况下两种规则:vendors和default。vendors
用于提取所有node_modules中符合条件的模块,default则作用于被多次引用的模块。可以对这些规则进行增加或者修改,如果要禁用某种规则,也可以直接将其设置为false。当一个模块同时符合多个cacheGroups时,则更具其中的priority配置项确定优先级。

异步加载资源

资源异步加载主要解决的问题是,当模块数量过多,资源体积过大时,可以把一些暂时使用不到的模块延迟加载。这样使页面初次渲染的时候用户下载的资源尽可能小,后续的模块等到需要的时候在再去触发加载,因此这种一般都叫做按需加载。
webpack中有两种异步加载的方式,import(webapck2开始)和require.ensure(webapck1),import和es6 module的区别就是,不需要顶层加载,即用即加载。因为只是简单的函数调用,这里不做其他阐述。

总结

代码分片有几种方式---CommonChunkPlugin或SplitChunks,以及异步资源加载。借助这些方法可以有效的缩小资源体积,同时更好的利用缓存,给用户更友好的体验。

到此这篇关于webpack代码分片的实现的文章就介绍到这了,更多相关webpack代码分片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • webpack4 SplitChunks实现代码分隔详解

    代码均放在 git仓库 Webpack 4给我们带来了一些改变.包括更快的打包速度,引入了SplitChunksPlugin插件来取代(之前版本里的)CommonsChunksPlugin插件.在这篇文章中,你将学习如何分割你的输出代码,从而提升我们应用的性能. SplitChunks插件( webpack 4.x以前使用CommonsChunkPlugin )允许我们将公共依赖项提取到现有的 entry chunk 或全新的代码块中. 代码分割的理念 首先搞明白: webpack里的代码分割是

  • webpack优化之代码分割与公共代码提取详解

    前言 开发多页应用的时候,如果不对webpack打包进行优化,当某个模块被多个入口模块引用时,它就会被打包多次(在最终打包出来的某几个文件里,它们都会有一份相同的代码).当项目业务越来越复杂,打包出来的代码会非常冗余,文件体积会非常庞大.大体积文件会增加编译时间,影响开发效率:如果直接上线,还会拉长请求和加载时长,影响网站体验.作为一个追求极致体验的攻城狮,是不能忍的.所以在多页应用中优化打包尤为必要.那么如何优化webpack打包呢? 一.概念 在一切开始前,有必要先理清一下这三个概念: mo

  • Webpack3+React16代码分割的实现

    项目背景 最近项目里有个webpack版本较老的项目,由于升级和换框架暂时不被leader层接受o(╥﹏╥)o,只能在现有条件进行优化. webpack3 + react16 webpack v3配置检查 很明显项目的配置是从v1继承过来的,v1->v3的升级较为简单,参考官网https://webpack.js.org/migrate/3/即可. loaders变为rules 不再支持链式写法的loader,json-loader不需要配置 UglifyJsPlugin插件需要自己开启mini

  • webpack学习笔记之代码分割和按需加载的实例详解

    本文介绍了webpack学习笔记之代码分割和按需加载的实例详解,分享给大家,也给自己留个笔记 为什么需要代码分割和按需加载 代码分割就是我们根据实际业务需求将代码进行分割,然后在合适的时候在将其加载进入文档中. 举个简单的例子: 1.一个HTML中存在一个按钮 2.点击按钮出现一个包着图片的div 3.点击关闭按钮图片消失 Demo目录: 一.当未点击按钮时浏览器只加载了对入口文件打包后的js 二.点击按钮会对组件进行异步加载 这个clichunk就是我们打包好的click组件,包括相应的JS逻

  • 在react-router4中进行代码拆分的方法(基于webpack)

    前言 随着前端项目的不断扩大,一个原本简单的网页应用所引用的js文件可能变得越来越庞大.尤其在近期流行的单页面应用中,越来越依赖一些打包工具(例如webpack),通过这些打包工具将需要处理.相互依赖的模块直接打包成一个单独的bundle文件,在页面第一次载入时,就会将所有的js全部载入.但是,往往有许多的场景,我们并不需要在一次性将单页应用的全部依赖都载下来.例如:我们现在有一个带有权限的"订单后台管理"单页应用,普通管理员只能进入"订单管理"部分,而超级用户则可

  • 详解webpack4之splitchunksPlugin代码包分拆

    本文讲解的是最近在做的一个多页面项目,结合webpack4的splitChunks进行代码包分拆的过程 项目框架 项目有home和topic两个入口文件,主要包括: react.mobx.antd作为项目的基本框架, echarts和d3(画图)是项目中部分页面用到比较大的组件库 src下的工作的组件和代码 其他的非公共代码. 两个入口文件都用react-loadable做了异步加载 import Loadable from 'react-loadable'; ... const Loadabl

  • webpack 代码分离优化快速指北

    分离代码文件 在此之前,首先要知道经常配置的 output 中有关 filename 和 chunkFilename 的区别:简单来说在 entry 定义的入口文件走的就是 filename 配置项,在入口文件内部引入的通常情况下是 chunk,走 chunkFilename 的配置 所以很多时候分离代码文件就是将不同的 chunk 分离开来,生产环境中有利于浏览器缓存,加快二次访问的速度 代码分离的时候,optimization 中配置的 splitChunks 默认就是 async,默认对异

  • 关于webpack代码拆分的解析

    最近在学习VUE的时候接触到了webpack,今天就留个小笔记,介绍一下webpack代码拆分 如果利用 webpack 将项目中的所有代码打包在一起,很多时候是不适用的,因为代码中有些东西我们总是希望将其拆分出来.比如: 样式表,希望利用 link 标签引入 使用概率较低的模块,希望后期需要的时候异步加载 框架代码,希望能利用浏览器缓存下部分不易变动的代码 下面是我在阅读 webpack 的官方文档时候,记录的一些笔记,部分地方使用了自己的话来讲,力图让它显得更易懂. 按需加载拆分 webpa

  • webpack代码分片的实现

    目录 背景 CommonsChunkPlugin splitChunks 配置 异步加载资源 总结 背景 实现高性能应用其中最重要的一点就是尽可能地让用户每次只加载必要的资源,优先级不要太高的资源则采用延迟加载等技术渐进式地获取,这样可以保证页面的首屏速度.代码分片是webpck打包工具所特有的一项技术,通过这项功能可以把代码按照特定的形式进行拆分,使用户不必一次全部加载,而是按需加载. CommonsChunkPlugin 虽然这个插件在webpack4当中已经不推荐使用,但是我们还是要了解一

  • 详解webpack解惑:require的五种用法

    webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.include,再加上ES6的import语法,这么多岂不是会把人给搞乱.本篇就来梳理一下这些require各自的特点,以及都在什么场景下使用. commonjs同步语法 经典的commonjs同步语法如下: var a = require('./a'); a.show(); 此时webpack会将a.js

  • webpack学习教程之前端性能优化总结

    前言 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: 1.MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 2.构建工具层出不穷.多多益处(提升团队协作,以及工程运维,避免人工处理琐碎而重复的工作) 模块化开发 将前端性能优化理论落地,代码压缩,合并,缓存控制,提取公共代码等 其他的还包括比如你可以用ES 6 或CoffeeScript写源码,然后构建出浏览器支持的E

  • 浅谈如何使用 webpack 优化资源

    前言 在前端应用的优化中,对加载资源的大小控制极其的重要,大多数时候我们能做的是在打包编译的过程对资源进行大小控制.拆分与复用. 本片文章中主要是基于 webpack 打包,以 React.vue 等生态开发的单页面应用来举例说明如何从 webpack 打包的层面去处理资源以及缓存,其中主要我们需要做的是对 webpack 进行配置的优化,同时涉及少量的业务代码的更改. 同时对打包资源的分析可以使用 (webpack-contrib/webpack-bundle-analyzer) 插件,当然可

  • 详解如何使用webpack在vue项目中写jsx语法

    本文介绍了如何使用webpack在vue项目中写jsx语法,分享给大家,具体如下: 我们知道Vue 2.0中对虚拟DOM的支持.我们可以通过JavaScript动态的创建元素,而不用在template中写HTML代码.虚拟DOM最终将被渲染为真正的DOM. data: { msg: 'Hello world' }, render (h) { return h( 'div', { attrs: { id: 'my-id' }, [ this.msg ] ); } 渲染后的内容为: <div id=

  • 详解webpack + react + react-router 如何实现懒加载

    在 Webpack 1 中主要是由bundle-loader进行懒加载,而 Webpack 2 中引入了类似于 SystemJS 的System.import语法,首先我们对于System.import的执行流程进行简单阐述: Webpack 会在编译过程中扫描代码库时将发现的System.import调用引入的文件及其相关依赖进行单独打包,注意,Webpack 会保证这些独立模块及其依赖不会与主应用的包体相冲突. 当我们访问到这些独立打包的组件模块时,Webpack 会发起 JSONP 请求来

  • 详解一个基于react+webpack的多页面应用配置

    简单介绍 首先本文不会对webpack代码进行解释,其所有配置都可以在文档上找到. 平时工作中会写一些多页面应用,因为习惯了react的开发模式,故此写了一个简单的配置,跟大家一起分享.如果你也喜欢,对你的开发有所帮助,希望给点鼓励(start) github地址:https://github.com/ivan-GM/Gm-cli 项目目录介绍: 打包后文件目录: 打包成cli如果你厌烦了新项目的复制.粘贴,也可以构建成cli 1,首先创建个文件夹,npm init初始化项目: 2, 创建bin

随机推荐