55 npm run serve 和 npm run build 的分包策略

前言

这里我们来看一下 vue 这边 打包的时候的一些 拆分包的一些策略

我们经常会使用到 npm run build 进行服务的打包

然后 打包出来的情况, 可能如下, 可以看到 chunk-vendors 是进行了包的拆分, 我们这里就是 来看一下 这里 npm run build 的时候的, 一个分包的策略

3349532ecefa4a6d893ffc0f31cbd540.png

 

 

测试配置

在 vue.config.js 中配置 webpack 打包配置如下

对于 node_modules 下面的所有的依赖, 限定分包策略为 最小10kb, 最大10kb

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,configureWebpack: {optimization: {splitChunks: {cacheGroups: {defaultVendors: {test: /[\\/]node_modules[\\/]/,priority: 10,minSize: 10000,maxSize: 10000,},default: {chunks: "all",minSize: 10000,maxSize: 10000,},}}}}
})

 

 

chunk-vendors 分组的分包策略

首先超过 maxSize 的包会被单独拧出来形成一个单独的包, 不管他的大小多大

a23b5de626504cfa906f96b86832ea27.png

 

然后其次就是 具体的分包的处理了

如果当前 js 添加到当前包未超过 maxSize, 继续迭代下一个

如果当前 js 太小了, 则重新放回队列, 继续迭代下一个

接下来就是 这里定义的一个拆包的算法了,  这里不细说, 我们也不关注具体的拆分的细节

循环结束, 拆分包的过程就结束了, 拆分成了 n 个小包

3212200534cb47fbbdc6313621fff005.png

 

 

拆分的过程调试如下

比如这里 vue.runtime.esm.js 包 268kb, 超过了配置的 10kb 的大小, 直接拧出来形成一个单独的 chunk

40bdcc62063e414db567e2ddf7359574.png

 

接下来 32 个 js, 合计 15kb, 形成一个 chunk

a243c842422a47d9b47dddc300f3f31b.png

 

接下来也是 32 个 js 形成一个 chunk

2c43da1ba51f4013bfc201400a9543c1.png

 

接下来是 剩余的 14 个 js 形成一个 chunk

1102e338718c49978dc26751c8a97724.png

 

当前 chunk 的命名方式是获取 第一个元素的名称 和 最后一个元素名称 的最大公共部分

ebc2a08a894045beb42f62563545628d.png

 

然后这里是在 compilation 中新增各个 chunk 的地方

chunk 的的名称后缀是根据 group 的名称进行 hash 生成的

bc4d6555c69e460eaf441e386c1e21b9.png

 

然后 如图, 就是编译结果的 chunk-vendors-7a6313df 文件, 里面包含了 32 个 js 文件, 然后 minify 压缩之后, 只有 6kb

要看各个 chunk-vendors 中包含了那些 js, 只能通过运行时调试查看

然后 chunk-vendors-2afcb3e6 这个显然就是 vue.runtime.esm.js 文件, minifiy 压缩之后, 只有 70kb

5771dd4b111d48d19e5441903ef0f0fa.png

 

示例项目中各个 module 大小, 以及各个 chunk 对应的 module 列表如下 excel

d36631b2318b4592b595c579551f0cff.png

 

 

npm run serve 中的 app.js 中默认情况下的 chunk 的拆分

app.js 的拆分分了很多种情况, 这里 我们先来看下 默认的行为

vue.config.js 配置如下

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,configureWebpack: {optimization: {splitChunks: {cacheGroups: {defaultVendors: {test: /[\\/]node_modules[\\/]/,name(module) {return "defaultVendors"},// chunks: "all",// minChunks: 3,priority: 10,// minSize: 10000,maxSize: 10000,},// default: {//   chunks: "all",//   name(module) {//     return "app11"//   },//   // filename: "app112"//   // priority: -10,//   // minSize: 10000,//   maxSize: 10000,// },}}}}
})

 

增加路由配置文件如下, 如下配置了三个路由

import Vue from "vue";
import Router from "vue-router";Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: () => import('../components/snake/Game.vue')}, {path: '/HelloWorld',name: 'HelloWorld',component: () => import('../components/HelloWorld')}, {path: '/AsyncQueue',name: 'AsyncQueue',component: () => import('../components/AsyncQueue.vue')}]
})

 

编译之后的生成的 js 相关的目录结构如下, 我们这里关注 app.js 相关的

即 app.js 和 src_components_xxx 相关的三个文件, 其他的为 node_modules 编译之后生成的项目文件

4354757e42ec44fa8f0d1b07448cfb98.png

 

然后我们看一下 app.js 中 chunk 的拆分

在 visit “src\router\index.js” 的时候, 发现了三个 import(), 然后 采集为 blocks

然后 这里单独拆分出来, 成为单独的 chunk

97ae45fa2f5e444590b9c97e500dcd76.png

 

该 chunk 里面没有保存上下文的任何信息, 上下文的信息是保存在 chunkGroup 中的, 后面对 chunk 和 chunkGroup 进行了关联

9dcb45254f854e2586af081b5be702cc.png

 

为目标 chunk 生成 chunkName 的地方是在 NamedChunkIdsPlugin.js 中, 从 chunkGroup 中相关数据中可以拿到目标 chunk 是属于哪一个文件的

9ace82f536f84b46a7409e4a1a6c8e27.png

39899cf0c0244645b4025ce6a9fd6b90.png

 

 

npm run build 中的 app.js 中默认情况下的 chunk 的拆分

整体的流程 和 上面 npm run serve 中的 app.js 的拆分情况如下

计算 chunk 的 id, 名称如下

1b6ce0e3bbd34d7e93292ca2bbe87baf.png

 

使用 numberHash 进行计算, 如果重复了, 就重新计算

e18bd9a7d81e4ea3aeec2ab947e89e89.png

 

整体来说, chunk 名称和其内容没有什么较为明显的关联

因此, 只能通过 文件内容, 来定位具体的业务组件是在哪一个文件中了

fc4ec0a359f548928430c20208a05463.png

 

但是可以通过 app.js 来进行一个粗略的查找, entryPoint 编号为 3208

37ca0b67675f4f2d988f6b18242fd5e0.png

 

这里便是整个路由, 这两批可以看到 具体的路由信息, 以及组件信息, 比如 “/HelloWorld” 对应于组件 575

c41c0fd77cf34c92a157dda74475df8f.png

 

 

app.js 的手动拆包配置

和上面 chunk-vendors 的拆包的配置类似, app.js 相关, 也是可以手动配置 拆包

配置 vue.config.js 的配置如下, 其中 default 下面的配置对应的是 app.js 的配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,configureWebpack: {optimization: {splitChunks: {cacheGroups: {defaultVendors: {test: /[\\/]node_modules[\\/]/,name(module) {return "defaultVendors"},// chunks: "all",// minChunks: 3,priority: 10,// minSize: 10000,maxSize: 10000,},default: {chunks: "all",name(module) {return "app11"},// filename: "app112"// priority: -10,// minSize: 10000,maxSize: 10000,},}}}}
})

 

打包之后结果如下, 可以看到的是 拆分的和 chunk-vendors 的拆分貌似类似

26be90b0b55b4376a8188d9ae0905b2a.png

 

假设是手动配置了分包的相关配置, 这里 具体的拆分就是和 chunk-vendors 类似的分包拆分处理

在 SplitChunksPlugin 中进行的处理, 这里可以参见上面的 chunk-vendors 的分包策略处理

a93951de34704af8a541aa8144f62f51.png

 

 

app.js 的默认分包 和 手动配置的分包 的差异

这个是从另外的一个维度 来进行的分析

在默认的分包处理下, 可以看到 我们这里访问 HelloWorld, 仅仅是请求了 HelloWorld 的相关的组件

412698767fc6463fbd50775a357c8031.png

 

编译出来的 index.html 如下, 可以看到的是 仅仅是导入了 app.js 这个入口的 chunk

9c2252773e8e44a2bf34d632f0236f1e.png

 

对于路由下面的各个情况, 是导入的各自的 js

703a73f5d6ca4e60a5ab9091a5ec2921.png

 

js 的映射如下

cc34a94329fa42008290e8f9b58305cb.png

 

在手动分包的处理下, 可以看到 请求了 app.js 囊括的所有的 js

74b2048748f84887b0c9b958635e336b.png

 

编译出来 index.html 如下, 可以看到是 引入了所有的包, 不管是进入哪一个页面, 都是请求的全量的 app.js 和 chunk-vendors.js

5c7c068758464f4ca42fecece3f4978c.png

 

 

app.js 的默认分包的每一个组件包含了那些东西?

HelloWorld.vue 文件内容如下

5733b7e8058041489d10759fcb80bd03.png

 

AsyncQueue.vue 文件内容如下, 导入了一个 HelloWorld.vue 的组件

498e6c5b7f6a419b885620fe0f88f6b4.png

 

然后编译完之后的 import('../components/HelloWorld') 如下

a7cb1ed96fa54d878372f710da3b4f64.png

 

然后编译完之后的 import('../components/AsyncQueue) 如下

可以看到 编译之后的结果 是将使用到的组件都内联进来了, 这样可能导致一些公用组件的内容被内联很多次, app.js 总共的包大小 膨胀

但是 页面时按照需要导入的对应的 js

增加了一些 编译器编译的开销, 服务器存储的开销, 减小了客户端请求的开销

42416971f1b44f3fa5f15c8bf93ffe18.png

 

 

完 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/297384.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux实验室】NFS、DHCP的搭建

NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS?环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录,配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现,主要从以下三个方面: 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性,图片地址,类型 string,无默认…

Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?

轮播广告是Facebook广告形式中的一种,可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中,是独立站卖家常用的一种广告形式 为什么选择轮播广告? 转化率更高:相较于单图广告,轮播广…

LeetCode-热题100:2. 两数相加

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…

Day43 动态规划 part05

Day43 动态规划 part05 1049.最后一块石头的重量II 我的思路: 提示说和划分两个和相等的子集差不多,猛然想到,这道题不就是划分子集,用sum - 和最大*2 代码就是划分和相同的子集的变形 解答: class Solution {public int last…

Cache多核之间的一致性MESI

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 思考: 1、为什么要学习MESI协议? 哪里用到了?你确定真的用到了? 2、MESI只是一个协议,总得依赖一个硬件去执行该协议吧&#xff0c…

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题: 蓝桥杯竞赛特别喜欢考日期问题,今天给大家分享一下…

VMware虚拟机安装Linux教程

以管理员身份运行VMware 按一下win键不然显示不全 重启即可。

什么是智慧公厕?智慧旅游下的智慧公厕功能和特点

智慧旅游下的智慧公厕功能和特点?智慧旅游是景区、公园、游乐场、文化场馆等领域的一种信息化解决方案,智慧公厕是智慧旅游极为重要的一部分,能大大提升游客满意度。智慧公厕采用物联网、互联网、大数据、云计算等技术,实现旅游景…

【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

picGo图床搭建gitee和smms(建议使用)

picGoGitee 这个需要下载gitee插件, 因为官方频繁的检索文件类型, 有时候也会失效 如果没有特殊要求平时存个学习的要看图中文字的重要的图片建议就是smms, 免费也够用! 图片存本地不方便, 各种APP中来回传还会失帧损失画质, 所以你值得往下看 picGosmms 建议使用这个, sm…

Linux gcc day3

find命令(importance): 语法:find pathname -options find /root -name test.c which命令: which [指令] 只搜索指令,在什么位置下 为什么文件夹带有颜色呢? 科普补充alias命令: ali…

银行数字化转型导师坚鹏:银行数字化转型给分行带来的8大价值

银行数字化转型给分行带来的8大价值 银行数字化转型对不仅对总行产生了深远影响、给总行带来了新质生产力,对分行也会产生重要价值,银行数字化转型导师坚鹏从以下8个方面进行详细分析,相信能够给您带来重要启发,从而加速银行分行…

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读(非常推荐) Generating Mammography Reports from Multi-view Mammograms with BERT(上) 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

clickhouse 源码编译部署

clickhouse 源码编译部署 版本 21.7.9.7 点击build project,编译工程,经过一定时间(第一次编译可能几个小时,后续再编译,只编译有改动的文件)生成release目录 在cmake-build-release → programs目录下…

Java集合(个人整理笔记)

目录 1. 常见的集合有哪些? 2. 线程安全的集合有哪些?线程不安全的呢? 3. Arraylist与 LinkedList 异同点? 4. ArrayList 与 Vector 区别? 5. Array 和 ArrayList 有什么区别?什么时候该应 Array而不是…

STM32L4R9 的 QuadSPI Flash 通讯速率不理想

1. 引言 客户反应 STM32L4R9 同 QSPI Flash 通讯,测出来的读取速率为 10MB/s, 和理论值相差较大。 2. 问题分析 按照客户的时钟配置和 STM32L4R9 的数据手册中的数据,OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程,于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识,主要包括(模板偏特化,模板参数列表传值,模板函数…

理论实践-CPU性能监控工具-uptime-mpstat-pidstat-vmstat-top-ps-perf

CPU 性能工具。 首先,平均负载的案例。我们先用 uptime, 查看了系统的平均负载;而在平均负载升高后,又用 mpstat 和 pidstat ,分别观察了每个 CPU 和每个进程 CPU 的使用情况,进而找出了导致平均负载升高的…