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(内容分发网络)的使用可以显著提高资源加载速度,特别是对于静态资源。

我们可以有三种种方式来完成:

  1. 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/",},

添加前运行文件

在这里插入图片描述

打包运行后文件效果

在这里插入图片描述

  1. 配置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的代码

在这里插入图片描述

  1. 使用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>

打包结果

  1. 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>

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

  1. 多入口分包:通过entry属性手动定义多个入口点,Webpack 会为每个入口点生成一个独立的包。

Tree Shaking

Tree Shaking 是移除代码中未引用部分的过程,它利用了 ES2015 模块的静态结构特性。

原理

  1. 一是先「标记」出模块导出值中哪些没有被用过
  2. 二是使用 Terser 删掉这些没被用到的导出代码

实现条件:

  1. 使用 ES2015 模块:确保项目使用importexport语法。
  2. 配置sideEffects:在package.json中添加 "sideEffects": false字段,告诉 Webpack 哪些文件是纯模块,可以安全地进行 Tree Shaking。
  3. 在配置中开始标记optimization.usedExports = true, 将构建设置成生产模式 mode ='production'

解决 treeShaking 无效方案:

  1. @babel/preset-envbabel-preset-env 不要将 target 设置为 node
  2. 第三方包中的 "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)

热更新允许在开发过程中实时更新应用,而无需刷新页面。

  1. 配置webpack-dev-server:通过webpack-dev-server提供热更新服务。
  2. 使用HotModuleReplacementPlugin:在 Webpack 配置中添加此插件,实现模块的热替换。
devServer:{hot:true
}plugins: [new webpack.HotModuleReplacementPlugin()
]mounted() {if (module.hot) {module.hot.accept('./Hello.vue', () => {});}},

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【sw2024】solidworks2024双击setup.exe无反应管理员运行也没反应解决方法

第一步 官网下载xxclean&#xff0c;打开xxclean最新版本&#xff0c;登录。官网xxclean.com或者自己浏览器搜。 第二步 点击扩展功能&#xff0c;点击 运行sw2024安装程序无反应 右边的开始 第三步 进度百分之百之后去双击setup就有界面了。

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数&#xff0c;包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后&#xff0c;新进程可以直接执行原本正文段的其他内容&#xff0c;但更多时候&#xff0c;我们在一个进程中调用fork创建新的进程后&#xff0c;希望新进程能…

ApiSix 插件开发

版本 3.0.1 创建插件目录和文件 cd ./example/ mkdir -p apisix/plugins cd apisix/plugins touch my_plugin.lua结构如下&#xff1a; 编写脚本 local core require("apisix.core")local plugin_name "my_plugin"local schema {type "obje…

MySQL约束:外键约束

下面先创建两张表用来作为实验样例 1.创建dept表 create table dept(id int auto_increment comment ID primary key,name varchar(50) not null comment 部门名称 ) comment 部门表;INSERT INTO dept (id, name) VALUES (1, 研发部), (2, 市场部), (3, 财务部), (4, 销售部…

基于服务网格的集群访问控制

随着容器化、云原生等概念的火热&#xff0c;越来越多的应用都开始选择支持云原生部署&#xff0c;但是对于大型企业应用来说&#xff0c;各种为服务的拆分会导致集群运维的压力越来越大&#xff0c;尤其是服务之间的安全通信至关重要。 在容器化集群中&#xff0c;传统的基于…

同元软控参展2024超临界二氧化碳动力循环与多能互补系统国际会议

9月20-23日&#xff0c;2024超临界二氧化碳动力循环与多能互补系统国际会议&#xff08;简称ICSPC2024&#xff09;在上海召开。会议由中国科学院工程热物理研究所、中国工程热物理学会主办&#xff0c;华北电力大学、西安热工研究院有限公司为联合主办单位。同元软控携核反应堆…

7.3树形查找

7.3.1二叉排序树 1.定义 目的:提供查找删除,插入关键字的速度 二叉排序树的特性: 左子树<根节点<右子树左右字数也分别是一棵二叉树 对二叉排序树进行中序遍历,可以得到一个递增的有序序列 2.二叉排序树的查找 查找从根节点开始,沿分支逐层向下比较的过程 二叉排序…

foxmail登录不了hotmail的解决办法

foxmail登录不了hotmail 由于hotmail的信息安全保护&#xff0c;9.16号就在foxmail登录不了&#xff0c;因为习惯了foxmail&#xff0c;且微软改了验证方式&#xff0c;换要他们的客户端才行&#xff0c;就感觉好麻烦。 在foxmail输入原密码报错 修改验证方式 也是会报错 解决…

第十三届蓝桥杯真题Java c组C.纸张尺寸(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm&#…

LLM推理需要多大GPU?背完再去面试

在实际工作中&#xff0c;经常有人问&#xff0c;7B、14B 或 70B 的模型需要多大的显存才能推理&#xff1f;如果微调他们又需要多大的显存呢&#xff1f; 为了回答这个问题整理一份训练或推理需要显存的计算方式。如果大家对具体细节不感兴趣&#xff0c;可以直接参考经验法则…

original多因子图绘制

成品参考 首先导入数据 设置过程 设置X轴 设置图 双击空白部分设置图层宽度&#xff08;也需要设置高度&#xff09; 颜色配置 1.删除边框 合适的参数与颜色&#xff08;设置为单色&#xff09;

【Python】Python多行输入储存为字典,值为列表

1.储存在变量中 # 输入格式&#xff1a;3 5 tabel, customer map(int, input().split()) print("table:", tabel) print("customer:", customer) 2.储存在列表中 #输入格式&#xff1a;2 4 2 tabel_number [int(x) for x in input().split()] print(&q…

跨国企业如何布局知识产权战略以应对国际条约的挑战与机遇?

在跨国企业的全球运营中&#xff0c;知识产权的战略布局显得尤为重要。面对复杂多变的国际环境&#xff0c;跨国企业如何在全球范围内有效保护其知识产权&#xff0c;同时利用国际条约促进合作并应对挑战&#xff0c;成为了一个亟待探讨的问题。 跨国企业知识产权的全球布局 1…

项目管理系统中的风险管理:如何识别和应对项目风险?

在现代项目管理中&#xff0c;风险管理是确保项目成功的关键因素之一。无论是技术、资源还是市场的变化&#xff0c;风险无处不在。有效的风险管理能够帮助团队识别潜在问题并制定应对策略&#xff0c;从而避免项目延误和预算超支。项目管理系统在这一过程中扮演着重要角色&…

微积分入门(真的很入门)

前置知识 前置知识&#xff1a;极限 我们要求 lim ⁡ x → 1 x 2 − 1 x − 1 \lim\limits_{x \to 1}\dfrac{x^2-1}{x-1} x→1lim​x−1x2−1​。 右边我们都知道是什么意思&#xff0c;那左边是什么呢&#xff1f; 意思就是&#xff0c;当 x x x 无限接近 1 1 1 时&…

相亲交友系统的社会影响:家庭结构的变化

随着互联网技术的发展&#xff0c;相亲交友系统已成为许多单身人士寻找伴侣的重要途径。这些平台不仅改变了人们的社交方式&#xff0c;还对家庭结构产生了深远的影响。本文将探讨相亲交友系统如何促使家庭结构发生变化&#xff0c;开发h17711347205并通过简单的Python代码示例…

华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

kubernetes基础配置(入门操作)

资源管理 一、资源管理方式 1.命令式对象管理&#xff1a;直接使用命令去操作kubernetes资源 [rootmaster ~]# kubectl run nginx-pod --imagenginx --port80 kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubect…

煤矿厂智能化可视化:提升安全与效率

运用图扑可视化技术对煤矿厂进行实时监控与数据分析&#xff0c;提高安全管理水平和生产效率。

Java8/9/10/11新特性

目录 一、 Lambda表达式二、函数式(Functional)接口三、方法引用与构造器引用3.1、方法引用3.2 构造器引用和数组引用3.2.1 构造器引用3.2.2 数组引用 四、 强大的Stream API4.1 Stream API说明4.2 Stream 的操作三个步骤4.3 创建 Stream方式4.4 、Stream 的中间操作4.4.1 筛选…