一、什么是分包 默认情况下,Webpack 会将所有代码构建成一个单独的包,这在小型项目通常不会有明显的性能问题,但伴随着项目的推进,包体积逐步增长可能会导致应用的响应耗时越来越长。 为此,Webpack 专门提供了 SplitChunksPlugin 插件,用于实现产物分包。 二、使用 SplitChunksPlugin SplitChunksPlugin 是 Webpack 4 之后引入的分包方案(此前为 CommonsChunkPlugin),它能够基于一些启发式的规则将 2.1 什么是 Chunk 在《有点难的知识点:Webpack Chunk 分包规则详解》一文中,我们已经了解到 Chunk 是打包产物的基本组织单位,读者可以等价认为有多少 Chunk 就会对应生成多少产物 :用于设置缓存组规则,为不同类型的资源设置更有针对性的分包策略 三、拆分运行时包 在《Webpack 原理系列六:彻底理解 Webpack 运行时》一文中,已经比较深入介绍 Webpack 运行时的概念
导语 | 若你对webpack仅仅是处于使用阶段,觉得webpack原理太杂太乱太多,但是觉得大概了解下webpack的大致原理也不错。亦或是想要了解分包优化如何进行配置呢? 以及为什么webpack官方分包配置会从 CommmonsChunkPlugin演变成SplitChunksPlugin呢? 四、chunk概念及分包基本规则 (一)webpack资源形态流转 webpack资源形态流转 从资源流转的层面,我们来看下webpack的打包流程: compiler.make阶段: entry文件以 代码块,是webpack根据功能拆分出来的(chunk是无法在打包结果中看到的,打包结果中看到的是bundle) (三)chunk的基本分包规则 chunk可以分为三类; 每个entry项都会对应生成一个 Chunk才会正式被分包。
(●'◡'●) webpack4 最核心的特性是 【splitChunks】,splitChunks 最核心的配置是 cacheGroups! 基于这个两个前提,我们再进行下一步。 分析工具 webpack 打包分析有它就够了:webpack-bundle-analyzer 安装 npm install --save-dev webpack-bundle-analyzer 配置:因为 虽然这不会是最终的结果,但本瓜可以先下一个结论: 配置 cacheGroups,权衡拆包与并包二者,便是 webpack 分包的究极奥义! 策略小结 基于本次分包,本瓜简单梳理一下策略: 公共的库是一定要尽量拆的。 公共的库尽量做到按需加载,这也是优化首屏加载需要注意的。 分包不能太细,0KB 至 10 KB 的包是极小的包,应当考虑合并。
默认分包规则 Webpack 4 之后编译过程大致上可以拆解为四个阶段(参考:[万字总结] 一文吃透 Webpack 核心原理): 在构建(make) 阶段,webpack 从 entry 出发根据模块间的引用关系 到了生成(seal) 阶段,webpack 会根据模块依赖图的内容组织分包 —— Chunk 对象,默认的分包规则有: 同一个 entry 下触达到的模块组织成一个 chunk 异步模块单独组织为一个 Runtime 分包 重点:Webpack 5 之后还能根据 entry.runtime 配置单独打包运行时代码。 除了 entry、异步模块外,webpack 5之后还支持基于 runtime 的分包规则。 至此,webpack 分包规则的基本逻辑就介绍完毕了,实现上,大部分功能代码都集中在: webpack/lib/compilation.js 文件的 seal 函数 webpack/lib/buildChunkGraph.js
默认分包规则 Webpack 4 之后编译过程大致上可以拆解为四个阶段(参考:[万字总结] 一文吃透 Webpack 核心原理): ? 到了生成(seal) 阶段,webpack 会根据模块依赖图的内容组织分包 —— Chunk 对象,默认的分包规则有: 同一个 entry 下触达到的模块组织成一个 chunk 异步模块单独组织为一个 Runtime 分包 重点:Webpack 5 之后还能根据 entry.runtime 配置单独打包运行时代码。 除了 entry、异步模块外,webpack 5之后还支持基于 runtime 的分包规则。 同时生成三个文件: 入口 index 对应的 index.js 入口 index 对应的 home.js 运行时代码对应的 solid-runtime.js 分包规则的问题 至此,webpack 分包规则的基本逻辑就介绍完毕了
作者:lzg9527 原文链接:https://segmentfault.com/a/1190000038180453 webpack 异步加载原理 webpack ensure 有人称它为异步加载, = require('html-webpack-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') // 引入 webpack.ensure 就解决了这个问题。 分包策略 在 webpack 打包过程中,经常出现 vendor.js, app.js 单个文件较大的情况,这偏偏又是网页最先加载的文件,这就会使得加载时间过长,从而使得白屏时间过长,影响用户体验。 所以我们需要有合理的分包策略。
Webpack 5 优化指南:分包策略、缓存配置及构建速度提升 60% 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/ invite_code=gbsa5hpojof 背景与目标 目标:在不改变业务功能的前提下,将构建速度提升 60%,同时降低首屏包体与提高二次编译速度 方法:分包策略(splitChunks/runtimeChunk : 'all':统一管理同步/异步资源,避免重复打包 cacheGroups.vendor/ui/commons:框架与重 UI 库独立分包、公共代码抽取,提升缓存命中率 runtimeChunk: ' 常见坑与修复 过度分包导致请求拥塞:为首屏路由保留合并,后续路由按需 缓存失效频繁:确保 runtimeChunk 与 deterministic id;避免每次构建修改 chunk 内容 SourceMap Webpack 5 的持久化缓存 + 分包 + 并行压缩是提升构建速度与运行时性能的核心组合 通过度量→策略→验证的闭环,构建时间可稳定下降约 60%,同时保持可维护的包结构与良好缓存命中率
webpack ensure相信大家都听过。有人称它为异步加载,也有人说做代码切割,那这个家伙到底是用来干嘛的? 如何与webpack配合实现组件懒加载webpack chunk 流webpack配置文件中的output路径配置chunkFilename属性output: { path: resolve(__ ,不推荐——webpack2官网上已经声明将逐渐废除() => system.import(URL)() => import(URL)需要webpack > 2.4,v1不支持——webpack2官网推荐使 ,官方文档webpack中使用import(), 属于es7范畴,require是由webpack社区提供方案,import为es官方提供;如果遇到使用import 报错,需要安装babelrc, 需要配合 a/1190000011519350https://webpack.js.org/guides/code-splitting/转载本站文章《webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载
——莫言 我们在使用uniapp进行微信小程序开发时可能会遇到如下情况: 这是因为微信小程序官方文档提到: 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载 在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。 所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。 在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。 目前小程序分包大小有以下限制: 整个小程序所有分包大小不超过 20M 单个分包/主包大小不能超过 2M 对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作
多业务的分包难以划分 分包体积膨胀 下载并注入无用代码 插件无法实现分包处理 …… 为解决上述问题,微信团队提供【分包异步化】新能力,实现跨分包组件、跨分包方法,成功解决分包难、分包不合理等问题。 • • 分包异步化原理 • • 原有的分包隔离机制导致各分包之间无法引用自定义组件或逻辑代码,因此导致分包难等一系列问题。 分包异步化能力打通不同分包的引用关系,解决小程序代码包合理化的问题,支持跨分包组件、跨分包方法。 分包异步化.png • • 跨分包组件 • • 当使用其他分包组件时,代码包需要增加占位组件 (component placeholder),实现页面高效配置。 例如页面展示时,分包 (subpackageB) 仍未下载,进行以下操作实现跨分包组件: 1.
下面通过一个简单的demo来讲述dex分包方案,该方案分为两步执行: ? 一、编译时分包 整个编译流程如下: ? 除了框出来的两Target,其它都是编译的标准流程。而这两个Target正是我们的分包操作。首先来看看spliteClasses target。 ? 到此,分包完毕,接下来,便来分析一下如何动态将第二个dex包注入系统的ClassLoader。 但是使用dex分包方案仍然有几个注意点: 1. 由于上述第一点的限制,假如我们的app越来越臃肿和庞大,往往会采取dex分包方案和插件化方案配合使用,将一些非核心独立功能做成插件加载,核心功能再分包加载。
下面通过一个简单的demo来讲述dex分包方案,该方案分为两步执行: ? 一、编译时分包 整个编译流程如下: ? 除了框出来的两Target,其它都是编译的标准流程。而这两个Target正是我们的分包操作。首先来看看spliteClasses target。 ? 到此,分包完毕,接下来,便来分析一下如何动态将第二个dex包注入系统的ClassLoader。 但是使用dex分包方案仍然有几个注意点: 1. 由于上述第一点的限制,假如我们的app越来越臃肿和庞大,往往会采取dex分包方案和插件化方案配合使用,将一些非核心独立功能做成插件加载,核心功能再分包加载。
一种流行的方法是通过技术层面对项目进行分包。但是这种方法有一些缺点。相反,我们可以按功能分包并创建独立自治的程序包。结果是一个易于理解且不易出错的代码库。 ? 整体分析 按照技术分包造成的缺点: 对属于某个功能的所有类的概述不佳。 通用代码、重用代码和复杂代码趋向于难以理解,并且由于难以把握变更的影响,因此变更很容易破坏其他功能用例。 按功能分包从而创建包含功能所需的所有类的程序包。好处是: 更好的可发现性和概览 独立且自治 更简单的代码 可测试性 便于团队协作开发 按照技术分层分包 项目结构的一种非常流行的方法是逐层分包。 ⚠️:按层分包从技术角度对所有类进行分组 让我们将调用层次结构添加到图片中,以“清楚地”了解哪个类取决于其他哪个类。 ? ⚠️:调用层次结构遍及整个项目,涉及许多包 那么,按层分包的缺点是什么? 关于按功能分包的部分如下所示: 我们基于功能分包。每个功能包均包含提供该功能所需的大多数代码。每个功能包都应独立且自治。
基于mpvue小程序进行分包首先在 pages / 下,新建 packageA/index 目录,在目录下再新建两个文件,index.vue和 main.js ,目录结构如下图所示: ?
开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 在构建小程序分包项目时,构建会输出一个或多个分包。 每个使用分包小程序必须包含 一个主包,所谓的主包,即放置默认启动页/TabBar 页面,以及一些所有分包需要用到 整个小程序所有分包大小不超过 8M单个分包/主包大小不能超2M 对小程序进行分包,可以优化小程序首次启动的下载时间 : 字段 类型 说明 root String 分包根目录 name String 分包别名,分包预下载时可以使用 pages StringArray 分包页面路径,相对与分包根目录 independent 独立分包是小程序的一种特殊类型的分包,可以独立于主包和其他分包独立运行。 ,普通分包的所有限制独立分包有效。
分包可以减少小程序首次启动时的加载时间 分包页面(例如:商品详情页、商品列表页)。 在 uni-app 项目中,配置分包的步骤如下: 1、右键点击根目录,新建,点击创建分包的根目录,命名为 subpkg。 2、在 pages.json 中,和 pages 节点平级的位置声明 subPackages 节点,定义分包相关结构: { "pages": [ { "path": "pages pages/cate/cate", "style": {} }, ], "subPackages": [ { "root": "subpkg", // 指定分包的 根目录 "pages": [] // 存放分包 页面 } ] } 3、在 subpkg 目录上鼠标右键,点击 新建页面 选项,并填写页面的相关信息: 4、注意:分包
对于很多在使用react-native开发应用的小伙伴们肯定都会遇到一个问题,功能越来越复杂,生成的jsbundle文件越来越大,无论是打包在app内发布还是走http请求更新bunlde文件都是噩梦,这个时候我们应该如何来更新呢?来看看我们的方案。 我们可以在打包的时候直接讲基础文件打包到内部, 在请求线上的业务bundle合并后初始化react-native,对于在rn初始化后 如果还有新业务的话 也可以直接加载业务代码b 通过bridge enqueueApplicationScript注入到j
fochaillee (747**11) 2012-08-28 16:24:56 潘老师,请教一下,业务建模过程中,针对需求分包的情况,是否要为每个分包寻找出它的组织?以及找到这个组织要解决的问题? 这和"需求分包"无关。
所以,最终我们采用了 dex 分包的方案,来避开了 Android 3.0以下平台的方法数和 LinearAlloc 限制。 简单的说,分包就是在打包时将应用的代码分成多个 dex,使得主 dex 的方法数和所需的 LinearAlloc 不超过系统限制。 生成的 apk 包跟 dex 分包前一样。为什么会这样? ---- 四、性能影响 Dex 分包后,如果是启动时同步加载,对应用的启动速度会有一定的影响,但是主要影响的是安装后首次启动。 由于分包是一个比较复杂和耗时的过程,开始时分包脚本的性能并不理想,后来经过我们两次优化,将打包过程中的分包时间从7分多钟优化到10秒以内; (3) 研究未来可能的按需加载或异步加载从 dex 的问题。
分包处理 顾名思义, 我们要对传输的数据进行分包. 一个简单的处理逻辑是在发送数据包之前, 先用四个字节占位, 表示数据包的长度. socket.getOutputStream().write(array); 12 } 13 socket.close(); 服务器端代码, 我们需要借助于FrameDecoder类来分包 他在其中缓存了一个cumulation对象, 如果return了null, 他会继续往缓存里写数据来实现分包 1 public void messageReceived(ChannelHandlerContext