Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新

news2024/9/30 6:14:42

文章目录

    • 前言
    • 包准备
    • 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').BundleAnalyzerPlugin

  plugins: [
	//   ...
    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 initial
      minChunks :10,
      // 当包大于1000byte,就拆分
      maxSize: 1000,
      // 拆分的每个包不能小于500byte
      minSize: 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.coloradmin.cn/o/2178901.html

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

相关文章

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

Python 读取与处理出入库 Excel 数据实战案例(HTML 网页展示)

有如下数据&#xff0c;需要对数据合并处理&#xff0c;输出到数据库。 数据样例&#xff1a;&#x1f447; excel内容&#xff1a; 出入库统计表河北库.xlsx: 出入库统计表天津库.xlsx: 01实现过程 1、创建test.py文件&#xff0c;然后将下面代码复制到里面&#xff0c;最后…

original多因子图绘制

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

PDF转换为TIF,JPG的一个简易工具(含下载链接)

目录 0.前言&#xff1a; 1.工具目录 2.工具功能&#xff08;效果&#xff09;&#xff0c;如何运行 效果 PDF转换为JPG&#xff08;带颜色&#xff09; PDF转换为TIF&#xff08;LZW形式压缩&#xff0c;可以显示子的深浅&#xff09; PDF转换为TIF&#xff08;CCITT形…

Squaretest单元测试辅助工具使用

1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件&#xff08;jclasslib&#xff09; 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值&#xff0c;修改的数字即为使…

英飞凌 PSoC6 评估板 Wi-Fi 无线通信

PSoC™ 62 with CAPSENSE™ evaluation kit 开发板&#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;是英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布一款面向物联网开发者的 32 位双核 MCU 开发套件&#xff0c;其默认内置 RT-Thread 物联网操作系统。本文主…

[RabbitMQ] 7种工作模式详细介绍

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【Linux】如何用shell脚本一键安装Java和Maven环境

Shell脚本安装环境 前言脚本Java安装脚本使用方式 Java卸载脚本Maven安装脚本Maven卸载脚本 前言 无论是在云服务器上部署Java项目 还是在本地的Linux虚拟机上运行Java项目 都需要Java的环境 设置环境则需要一些繁琐的操作 为了简化并复用这些操作 我们可以封装这些操作为一个…

AD导出gerber文件(光绘文件)

第一步&#xff1a; 英寸 2:5 勾选你想显示的层 默认默认 第二步&#xff1a; 第三步&#xff1a; 默认

开关电源为什么要进行负载测试,负载测试都包含哪些项目?

开关电源在现代电子设备中占据着重要的地位&#xff0c;其性能的稳定性和可靠性直接影响着电子设备的正常运行。为了确保开关电源的质量&#xff0c;需要对其进行负载测试。负载测试可以模拟实际工作环境中的负载情况&#xff0c;检测开关电源在不同负载条件下的输出特性、稳定…

如何创建虚拟环境并实现目标检测及验证能否GPU加速

创建虚拟环境&#xff1a; 先创建一个虚拟python环境&#xff0c;敲如下代码 然后再到该虚拟环境里面安装自己想要的包 激活虚拟环境 然后再聚类训练这些 验证GPU加速 阿里源 pip install torch torchvision -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mir…

Python的风格应该是怎样的?除语法外,有哪些规范?

写代码不那么pythonic风格的&#xff0c;多多少少都会让人有点难受。 什么是pythonic呢&#xff1f;简而言之&#xff0c;这是一种写代码时遵守的规范&#xff0c;主打简洁、清晰、可读性高&#xff0c;符合PEP 8&#xff08;Python代码样式指南&#xff09;约定的模式。 Pyth…

线段树及应用

目录 1. 线段树基础 &#xff08;1&#xff09;什么是线段树 &#xff08;2&#xff09;线段树的拆分原理 &#xff08;3&#xff09;相关算法对比 &#xff08;4&#xff09;线段树的使用前提 &#xff08;5&#xff09;线段树建树操作 &#xff08;6&#xff09;线段树…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时&#xff0c;Unity Editor会在项目目录建立一个Temp目录&#xff0c;同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

macOS 开发环境配置与应用开发

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【CSS Tricks】css动画详解

目录 引言动画关键帧序列动画各属性拆解1. animation-name2. animation-duration3. animation-delay设置delay为正值设置delay为负值 4. animation-direction5. animation-iteration-count6. animation-fill-mode7. animation-play-state8. animation-timing-function非阶跃函数…

【2025】基于Django的鱼类科普网站(源码+文档+调试+答疑)

文章目录 一、基于Django的鱼类科普网站-项目介绍二、基于Django的鱼类科普网站-开发环境三、基于Django的鱼类科普网站-系统展示四、基于Django的鱼类科普网站-代码展示五、基于Django的鱼类科普网站-项目文档展示六、基于Django的鱼类科普网站-项目总结 大家可以帮忙点赞、收…

B3621 枚举元组

1.递归的具体过程&#xff0c;一个dfs1&#xff0c;产生3个dfs2&#xff0c;一个dfs2产生3个dfs3&#xff0c;一共输出9个&#xff08;用n2&#xff0c;k3举例&#xff09; 2.要记得使用return 结束当前递归 #include<bits/stdc.h> using namespace std; int n, k, a[10…

telnet发送邮件教程:安全配置与操作指南?

telnet发送邮件的详细步骤&#xff1f;怎么用telnet命令发邮件&#xff1f; 尽管现代邮件客户端和服务器提供了丰富的功能和安全性保障&#xff0c;但在某些特定场景下&#xff0c;了解如何使用telnet发送邮件仍然是一项有价值的技能。AokSend将详细介绍如何安全配置和操作tel…

英集芯IP5911:集成锂电池充电管理和检测唤醒功能的低功耗8位MCU芯片

英集芯IP5911是一款集成锂电池充电管理、咪头检测唤醒、负载电阻插拔和阻值检测等功能的8bit MCU芯片。其封装采用QFN16&#xff0c;应用时仅需极少的外围器件&#xff0c;就能够有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型电子设备提供高集成度的解决方…