Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新
文章目录
- 前言
- 包准备
- CDN 集成
- 代码分包
- Tree Shaking
- 原理
- 实现条件:
- 解决 treeShaking 无效方案:
- 示例代码:
- 热更新(HMR)
前言
Webpack 作为现代前端开发中的核心构建工具,提供了丰富的特性来帮助开发者优化和打包应用。本文将探讨 Webpack 的 CDN 集成、代码分包、Tree Shaking 以及热更新(HMR)等关键特性。
我们将使用前一篇文章中的代码,然后我们引入一些图片、css 等资源文件已经一些常用的第三方库,如
lodash
包准备
安装文件处理的 loader 和后续分析的包
yarn add webpack-bundle-analyzer terser-webpack-plugin url-loader file-loader -D
在 webpack.config.js 添加 处理文件的 loader , file-loader
module: {rules: [// ... 省略{test: /\.(jpg|png|jpeg|gif)$/,use: ["file-loader"],},],},
修改 list.vue
<template><div><img :src="jsJpg" /><h3>前端三大框架:</h3><ul><li v-for="item in list" :key="item">{{ item }}</li></ul></div>
</template><script>
import jsJpg from '@/static/js.jpg'
export default {name:'List',data() {return {list: ["Vue", "React", "Angular"],jsJpg};},
};
</script>
运行结果:

打包结果:
执行 yarn build

CDN 集成
CDN(内容分发网络)的使用可以显著提高资源加载速度,特别是对于静态资源。
我们可以有三种种方式来完成:
output配置中的publicPath
这里我们如果没有 cdn,可以通过修改 hosts 文件的方式, 文件路径:C:\Windows\System32\drivers\etc,添加内容127.0.0.1 ziyu.aliyun.com, 最后我们添加启动端口
const mode =process.env.NODE_ENV === "development" ? "development" : "production";
const isDev = process.env.NODE_ENV === "development";output: {path: path.resolve(__dirname, "dist"),filename: "bundle.js",publicPath: isDev ? "/" : "http://ziyu.aliyun.com:3000/",},
添加前运行文件

打包运行后文件效果

- 配置
externals属性将某些依赖项从打包文件中排除,并通过 CDN 链接直接引入。
externals: {vue: "Vue","vue-router": "VueRouter",
}
在 html 文件中添加
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title><%= htmlWebpackPlugin.options.title %></title><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script src="https://unpkg.com/vue-router@3.0.0/dist/vue-router.js"></script></head><body><div id="app"></div></body>
</html>
添加打包分析器:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginplugins: [// ...new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'report.html',openAnalyzer: false,}),],
执行 yarn build, 查看report.html , 没有 vue和vue-router的代码

- 使用
html-webpack-plugin插件,在生成的 HTML 文件中动态插入 CDN 资源链接。
// 1. 配置插件new HtmlWebpackPlugin({title: "vuew + webpack",template: "./src/index.html",}),
// 2. 配置html// 可以随便添加cdn
代码分包
代码分包是 Webpack 优化应用加载性能的重要手段。通过将代码分割成多个包,可以实现按需加载,减少单次加载的数据量。
代码准备:
我们新建一个utils/calc.js文件,然后补充代码:
export const sum = (a, b) => a + b;
常规使用: hello.vue 中引用
<template><button @click="calcRes">计算 : 5 +6 结果</button> {{ res }}
</template><script>
import { sum } from "../utils/calc";
export default {data() {return {res: 0,};},methods: {calcRes() {this.res = sum(5, 6);},},
};
</script>
打包结果
import()分包:
<template><button @click="calcRes">计算 : 5 +6 结果</button> {{ res }}
</template><script>
import { sum } from "../utils/calc";
export default {data() {return {res: 0,};},methods: {calcRes() {this.res = import(/* webpackChunkName: "calc" */ "../utils/calc").then(({ sum }) => {this.res = sum(5, 6);});},},
};
</script>


- 自动分包:Webpack 的
SplitChunksPlugin插件可以自动分析模块依赖关系,将共享模块提取到单独的包中 , 供我们自定义更加细粒度的分包策略
optimization: {splitChunks: {chunks: 'all', // all, async, and initialminChunks :10,// 当包大于1000byte,就拆分maxSize: 1000,// 拆分的每个包不能小于500byteminSize: 500,cacheGroups:{utils: {test: /utils/,filename: '[id]_utils.js'}}},},

- 多入口分包:通过
entry属性手动定义多个入口点,Webpack 会为每个入口点生成一个独立的包。
Tree Shaking
Tree Shaking 是移除代码中未引用部分的过程,它利用了 ES2015 模块的静态结构特性。
原理
- 一是先
「标记」出模块导出值中哪些没有被用过 - 二是使用
Terser 删掉这些没被用到的导出代码
实现条件:
- 使用 ES2015 模块:确保项目使用
import和export语法。 - 配置
sideEffects:在package.json中添加"sideEffects": false字段,告诉 Webpack 哪些文件是纯模块,可以安全地进行 Tree Shaking。 - 在配置中开始标记
optimization.usedExports = true, 将构建设置成生产模式mode ='production'
解决 treeShaking 无效方案:
@babel/preset-env或babel-preset-env不要将 target 设置为node- 第三方包中的
"sideEffects": false
示例代码:
我们安装 loadsh-es包来测试,它比 lodash 包更好的 tree-shaking
yarn add lodash-es
yarn add terser-webpack-plugin -D
<button @click="log">防抖函数</button><script>import { debounce } from 'lodash-es';export default {methods: {log: debounce(()=>console.log("log...."), 500),}}
</script>
更新配置文件:
optimization: {minimize: true,minimizer: [new TerserPlugin()],usedExports: true,},
打包结果:可以看到结果中只有loadsh-es包的 debunce函数

热更新(HMR)
热更新允许在开发过程中实时更新应用,而无需刷新页面。
- 配置
webpack-dev-server:通过webpack-dev-server提供热更新服务。 - 使用
HotModuleReplacementPlugin:在 Webpack 配置中添加此插件,实现模块的热替换。
devServer:{hot:true
}plugins: [new webpack.HotModuleReplacementPlugin()
]mounted() {if (module.hot) {module.hot.accept('./Hello.vue', () => {});}},相关文章:
Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新
文章目录 前言包准备CDN 集成代码分包Tree Shaking原理实现条件:解决 treeShaking 无效方案:示例代码: 热更新(HMR) 前言 Webpack 作为现代前端开发中的核心构建工具,提供了丰富的特性来帮助开发者优化和打…...
Robot Operating System——一组三维空间中的位姿(位置和方向)
大纲 应用场景1. 机器人导航场景描述具体应用 2. 运动规划场景描述具体应用 3. 物体识别和跟踪场景描述具体应用 4. 环境建模场景描述具体应用 5. 仿真环境场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::PoseArray 是 ROS 2 中的一个消息类型,用于表示一…...
mycat读写分离中间件
5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…...
Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
作者:Stella L (stellafootprint.network) 在瞬息万变的 Web3 领域,众多项目在用户吸引、参与和留存方面遭遇重重难关。Footprint Analytics 推出 Growthly,作为应对这些挑战的全方位解决方案,其中创新性的 Quest(任务…...
Pytorch 学习手册
零 相关资料 官方网址 官方网址下的API搜索网站 一 定义 深度学习框架是用于设计、训练和部署深度学习模型的软件工具包。这些框架提供了一系列预定义的组件,如神经网络层(卷积层、全连接层等)、损失函数、优化器以及数据处理工具…...
第十一章 【前端】调用接口(11.1)——Vite 环境变量
第十一章 【前端】调用接口 11.1 Vite 环境变量 参考:https://cn.vitejs.dev/guide/env-and-mode.html Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 …...
MySQL添加时间戳字段并且判断插入或更新时间
文章目录 步骤 1: 修改表结构步骤 2: 插入或更新数据步骤 3: 查询数据并判断时间完整示例 在MySQL中,可以在表中添加一个时间戳字段来记录每条数据的最后插入或更新时间。然后,在插入或更新数据时,自动更新这个时间戳字段。最后,在…...
SOA(面相服务架构)
目录 SOA的基本概念 SOA的关键特性 SOA的实现步骤 SOA的技术实现 SOA的应用场景 面向服务的架构(Service-Oriented Architecture, SOA)是一种软件设计理念和架构模式,旨在通过网络协议将不同的服务相互连接和集成,以构建灵活、可扩展和可重用的应用系统。SOA的…...
One2many(一对多)关联场景中,如何从模型(一)关联到模型(多)的某个字段
好的,我们用一个更通俗的例子来解释不同模块之间的模型关联,场景是“学校和学生”的例子。 1. 场景介绍 假设我们有两个模块: 学校模块 (school):用于管理学校信息。学生模块 (student):用于管理学生信息。 每个学…...
LLaMA 3 和 OpenAI有哪些相同点和不同点?
LLaMA 3(Meta 的 LLaMA 系列)和 OpenAI 的模型(如 GPT 系列)都是先进的 大语言模型(LLMs),它们在训练、应用场景和能力上有很多相似之处,但也存在显著的不同点。以下是一些关键相同点…...
Spring 事务管理及失效总结
所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。 Spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给 Hibernate 或者 JTA 等持久化机制所提供的相关平台框架的事务来实现。 Spring 事务…...
全局思维下的联合创新:华为携手ISV伙伴助推银行核心平稳升级
文 | 螳螂观察 作者 | 李永华 随着数字金融快速发展,对核心系统提出了“海量、高效、弹性、扩展、敏捷”等新需求,区域性银行面临核心系统升级的迫切需要,对金融科技厂商而言也催生了庞大的机遇和空间。 只是,银行核心系统是金…...
深度估计任务中的有监督和无监督训练
在计算机视觉领域,深度估计任务一直是研究的热点之一。它旨在通过图像或视频数据来推断场景中物体与相机之间的距离,为许多应用提供关键信息,如自动驾驶、机器人导航、增强现实等。在深度估计任务中,有监督训练和无监督训练是两种…...
扩散模型DDPM代码实践
安装diffusers pip install diffusers 按照diffusers官方代码 from diffusers import DDPMPipelinepipe DDPMPipeline.from_pretrained("google/ddpm-cat-256")image pipe().images[0]image.save("/data/zhz/projects/diffusion/output/ddpm_generated_imag…...
关于GPIO输入模式的配置选择
GPIO(通用输入输出)口是嵌入式系统中的重要组成部分,输入模式使得微控制器能够与外部世界进行交互。本文将探讨GPIO输入模式中的浮空输入、上拉输入和下拉输入的配置、使用场景及注意事项,并提供一些决策指导,帮助读者…...
【Kubernetes】日志平台EFK+Logstash+Kafka【实战】
一,环境准备 (1)下载镜像包(共3个): elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz (2)在node节点导入镜像: ctr -nk8s.io images i…...
今天推荐一个文档管理系统 Dorisoy.Pan
Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统,它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术,以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端,包括网站、Android、iO…...
【RocketMQ】消费失败重试与死信消息
🎯 导读:本文档详细介绍了RocketMQ中的重试机制与死信消息处理方法。对于生产者而言,文档提供了如何配置重试次数的具体示例;而对于消费者,它解释了默认情况下消息消费失败后的重试策略,并展示了如何通过代…...
注册安全分析报告:闪送
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
SpringCloud入门
SpringCloud 原版笔记:狂神说笔记——SpringCloud快速入门23 - subeiLY - 博客园 (cnblogs.com) 一.前言 常见面试题 什么是微服务? 微服务之间是如何独立通讯的? SpringCloud 和 Dubbo有哪些区别? SpringBoot和SpringCloud&…...
Switch玩家福音!用LDR6282芯片DIY便携屏,告别充电口盲插烦恼
Switch玩家福音!用LDR6282芯片DIY便携屏,告别充电口盲插烦恼 作为一名资深Switch玩家,每次在咖啡厅或朋友家想玩大屏游戏时,最头疼的就是要随身携带底座和一堆线材。直到我发现用LDR6282芯片可以自制支持双C口盲插的便携显示屏&am…...
5个关键步骤:TileLang高性能GPU算子从入门到精通
5个关键步骤:TileLang高性能GPU算子从入门到精通 【免费下载链接】tilelang Domain-specific language designed to streamline the development of high-performance GPU/CPU/Accelerators kernels 项目地址: https://gitcode.com/GitHub_Trending/ti/tilelang …...
XXE漏洞实战:CTF大赛压轴题型解析
题目靶场过大,可以关注我私信xxe回复你靶场 xxe靶场环境搭建 搭建靶场,进入靶场发现这是一个Linux登陆界面,第一个坑就是以为要进行爆破进入虚拟机内部,考官实际上考察xxe漏洞,不需要进入靶场内部,想一想…...
4G手机远程断电停电报警器:三重告警,漏报风险全杜绝
4G手机远程断电停电报警器,简单来说,就是一款在监测到设备停电时,能通过4G网络自动给你打电话、发短信“通风报信”的智能硬件。解决人不在现场,如何第一时间知道设备停电了。特别适合那些停电会造成严重损失的场景,比…...
1746-NR4电阻模拟输入
1746-NR4 模拟输入模块(电阻输入)特点由 Allen-Bradley 生产,属于 SLC 500 系列类型为 模拟输入模块,专门用于电阻信号采集提供 4 路独立输入通道支持热电偶、RTD(热电阻)及其他电阻传感器输入精度高&#…...
【农业AI实战权威指南】:Python图像识别精度提升7大关键瓶颈与2024最新调优方案
第一章:农业AI图像识别精度提升的底层逻辑与行业挑战农业AI图像识别并非简单套用通用计算机视觉模型,其精度瓶颈根植于农田场景特有的物理复杂性与数据稀缺性。光照剧烈变化、作物生长阶段连续演化、病斑形态微小且易与阴影/污渍混淆,导致传统…...
终极开源方案:一站式多媒体内容采集与智能管理利器
终极开源方案:一站式多媒体内容采集与智能管理利器 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new MediaCrawler是一款功能强大的开源多媒体内容采集工具,专为高效获取和管理网络多媒体…...
告别AppImage:在Ubuntu上源码编译QGroundControl地面站(QT项目实战)
从源码构建QGroundControl:Ubuntu开发者深度指南 为什么选择源码编译而非AppImage? 在无人机开发领域,QGroundControl(QGC)作为PX4生态的核心地面站软件,其预编译的AppImage包虽然提供了开箱即用的便利性&a…...
AI辅助数据库设计:让快马平台智能生成优化过的社区论坛系统数据架构
今天想和大家分享一个用AI辅助设计数据库的实践案例——社区论坛系统的数据架构设计。整个过程在InsCode(快马)平台上完成,体验非常流畅。 业务场景分析 社区论坛的核心是内容交互,需要支持用户发帖、互动和管理。通过AI分析,我们确定了几个关…...
从零开始:GitLab 自托管部署与 DevOps 环境搭建指南
1. 为什么选择自托管 GitLab? 对于中小型技术团队来说,代码管理是研发流程的核心命脉。我见过太多团队在初期使用第三方托管服务,随着业务增长却面临三大痛点:代码安全焦虑、定制化需求无法满足、CI/CD 集成受限。自托管 GitLab 就…...
