Webpack5 的一些知识总结

2023-11-05

2842a58216c8cc79e3a6f16d19a1d669.jpeg

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

前言

webpack 5是2020年发布的,webpack 4是2018年发布的,在webpack 4之上也做出了挺多的改变,比如,添加了cache的支持,模块联邦新玩意......

持久性缓存来提高构建性能

在webpack 5之前,webpack是没有提供持久化缓存,我们开发的时候需要使用类似 cache-loader 来做缓存方面的处理。

在webpack 4中:

module.exports = {
  module: {
    rules: [
      {
        test: /.ext$/,
        use: ['cache-loader', ...loaders],
        include: path.resolve('src'),
      },
    ],
  },
};

在webpack 5中

在webpack 5中自身也加入了持久化缓存,缓存生成的 webpack 模块和 chunk,来改善构建速度。cache 会在开发 模式被设置成 type: 'memory' 而且在 生产 模式 中被禁用。

module.exports = {
  cache: {
    type: 'filesystem',
  },
};

cache.type 有两个值 memory | filesystemmemory表示会将打包生成的资源存放于内存中。filesystem表示开启了文件系统缓存。

更好的hash算法

这里指的就是访问web页面时的浏览器缓存,我们也知道,之前有 hash chunckhash contenthash 在 webpack 5中,把hash改成了fullhash

首先,我们介绍一下这几个hash值有什么不一样。

hash/fullhash

hash/fullhash 是根据打包中的所有文件计算出来的 hash 值,在一次打包中,所有的资源出口文件的filename获得的[hash]都是一样的。

chunckhash

chunckhash顾名思义是根据打包过程中当前 chunck 计算出来的 hash 值。

contenthash

contenthash顾名思义是根据打包时的内容计算出的 hash 值。

当然,这么看好像,看不出啥问题,不就是把一个 hash 改成 fullhash 而已嘛?dang dang dang 然不是,我们就来扒扒看,直接上实战,喵喵有啥不一样。

我们先设定webpack的设置如下

const path = require('path');
module.exports = {
  mode: 'production',
  entry: {
    index: './index.js'
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[contenthash].js',
  },
}

这里是要打包的 index.js 的内容

const num = 1;
console.log('这里是输出', num);

这是添加注释和修改变量后的 index.js 的内容

const str = 1;
//这里是输出
console.log('这里是输出', str);

webpack 4打包

outside_default.png

我们可以看到这里的 hash 值为 e8510378c5f44d16af40

这里是添加注释和修改变量后打包后的结果

outside_default.png

我们可以看到这里的 hash 值为 2c719bba27df586bf8f2

webpack 5打包

outside_default.png

我们可以看到这里的 hash 值为 d1bc13ae7e7dc828a64f

这里是添加注释和修改变量后打包后的结果

outside_default.png

我们可以看到这里的 hash 值为 d1bc13ae7e7dc828a64f

总结

我们可以明显看出,webpack 4对于添加注释和修改变量其实,是会影响它的一个contenthash值的计算,如果是webpack 5的话,就不会影响。

Tree Shaking 的改进

tree shaking是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。

既然webpack 4都有这个功能,那么随着webpack 5的升级,又有什么不一样的地方呢?

我们来建立一个三个文件,index.js、a.js、b.js

// a.js
const name = 'zhangSan';
const age = 18;

export { name, age };
// b.js
import * as data from './a';
export { data };
// index.js
import * as common from './b';
// 我们可以看到只是使用了 age,而没有使用 name
console.log(common.data.age);

webpack 4打包结果

outside_default.png

但是我们打包出来的结果,却是连 name 也打包进去。

webpack 5打包结果

outside_default.png

简直完美秒杀。

总结

当然,在webpack 4中,Tree Shaking 对嵌套的导出模块未使用代码无法很好进行 Tree Shaking,当然我们也可以借助一些plugin来实现,但是到了webpack 5得到了很大的改进。

模块联邦(Module Federation)

Webpack5 模块联邦让 Webpack 达到了线上 Runtime 的效果,让代码直接在项目间利用 CDN 直接共享,不再需要本地安装 Npm 包、构建再发布了!

容器项目

//这里是容器的webpack模块联邦设置【也就是在该组件使用】
new ModuleFederationPlugin({
  name: 'react1',
  library: { type: 'var', name: 'react1' },
  remotes: {
    RemoteComponent: 'RemoteComponent'
  },
}),
// 在html引入
<script src="http://localhost:3001/remoteEntry.js"></script>
// 这里是它的代码
import React, { Fragment } from 'react';
import ReactDOM from 'react-dom';

const Button = React.lazy(() => import('RemoteComponent/Button'));

function App() {
  function onClick() {
    console.log('这里是远程组件触发的');
  }
  return (
    <div>
      <h1>这里是测试模块联邦的项目</h1>
      <React.Suspense fallback='努力加载中									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webpack5 的一些知识总结 的相关文章

随机推荐

  • 链表(应用篇)

    1 概述 链表是在程序设计过程中经常使用的数据结构 bcos系统内部的调度和tasklet的实现都是基于链表 所以 对链表的支持是bcos与生俱来的特性 bcos的链表设计参考了Linux内核链表的设计思想 如果用户想使用链表只需要在自己的
  • C++基础六:C++入门知识、黑盒测试(详解)与复杂度

    cin与cout cin与cout是C 中的输入和输出函数 需要添加头文件 include
  • QT常用分层式软件架构

    第一次写博客 只做个分享吧 关于软件架构的常用模型目前找到的最详细的解说基于Qt的软件框架设计 amwha的专栏 CSDN博客 qt软件框架 1 QMainWWindow主界面类 转到线程是在实例化子界面对象时 将对应的数据处理类对象转到新
  • 笔记-TCP/IP IP地址字符串表示最大长度

    笔记 TCP IP IP地址字符串表示最大长度 IPv4 IPv6 IPv4 定义在
  • 经典vue面试题:谈一谈computed计算属性和watch监听属性的区别

    computed计算属性和watch监听的区别 computed属性 首先computed计算属性是用于在HTML模板中表达式更加简洁 易维护 特点 computed具有缓存功能 当与computed变量相关的变量值不发生改变时 一直用的是
  • windows7 64位机上配置MinGW+Codeblocks+ wxWidgets

    在Windows7 64位机子上安装配置MinGW Codeblocks wxWidgets步骤如下 1 下载mingw get inst 20111118 http sourceforge net projects mingw 2 双击m
  • vue预渲染

    vue预渲染 vue是一个单页面应用 spa 只有一个 html 文件 内容只有一个 app根节点 通过加载js脚本来填充页面要渲染的内容 然而这种方式无法被爬虫和百度搜索到 如果想对某些页面进行SEO 搜索引擎优化 优化 可以通过预渲染实
  • Springboot中使用websocket发送信息给指定用户和群发

    websocket是一种长连接协议 相较于传统的http短连接 websocket不仅可以由客户端向服务器发送消息 可以主动向客户端发起信息 经常用于及时聊天 游戏和服务器向客户端推送信息 主要优点 1 节约带宽 不停地轮询服务端数据这种方
  • 合并排序算法(详解)

    合并排序是成功应用分治技术的一个完美例子 对于一个需要排序的数组A 1 n 合并排序把它一分为二 A 1 n 2 和A n 2 1 n 并对每个子数组 进行递归排序 然后把这两个排好序的子数组合并成一个有序数组 void MergeSort
  • 微信美团支付服务器异常怎么回事,无法使用微信支付?美团回应:支付系统出现异常 已全面恢复...

    5 月 24 日消息 今日上午 美团无法微信支付 登上微博热搜 有网友反映 在点外卖的时候发现美团无法使用微信支付 今日午间 12 43 分 美团通过官方微博发布回应 今天早上 10 点 28 分 我们接到了微信支付系统出现异常抖动的通知
  • fatal: unable to access =‘https://github.com/‘: OpenSSL SSL_read: Connection was reset, errno 10054

    命令 git clone https github com binary husky chatgpt academic git 出现问题 采用了 git config global unset http proxy 命令还是不行 把 htt
  • Android自动化测试工具——Monkey

    前言 最近开始研究Android自动化测试方法 整理了一些工具 方法和框架 其中包括android测试框架 CTS Monkey Monkeyrunner benchmark 以及其它test tool等等 一 什么是Monkey Monk
  • python range和xrange

    python range和xrange 如果需要迭代一个数字序列的话 可以使用range 函数 range 函数可以生成等差级数 如例 for i in range 5 print i 这段代码将输出0 1 2 3 4五个数字 range
  • Python中对负数的整除和取余及特值情况

    整数取余负数 技巧 先忽略负号 之后取余 和正常取余不同的是 被取余的数x一个数 不能比取余的数小 可以相等 这意味着任何一个整数取余 1结果都为0 之后用这个数减去取余的数 最后在得到的结果上加上负号 当被取余的负数取正后大于取余的数时
  • lettuce jedis 比较

    Lettuce 和 Jedis 的定位都是Redis的client 所以他们当然可以直接连接redis server Jedis在实现上是直接连接的redis server 如果在多线程环境下是非线程安全的 这个时候只有使用连接池 为每个J
  • PostgreSQL IoT,车联网 - 实时轨迹、行程实践 1

    背景 车联网 IoT场景中 终端为传感器 采集各个指标的数据 同时包括时间 GIS位置信息 速度 油耗 温度 EDU采集指标 在运动过程中 通过GPS准实时上报到服务端 服务端则通常根据设备 比如车辆 时间范围 查询指定设备在某个时间区间的
  • redis 由浅入深 之 进阶(服务器)

    Redis 服务器 Redis 服务器命令主要是用于管理 redis 服务 bgrewriteaof 命令用于异步执行一个 AOF AppendOnly File 文件重写操作 重写会创建一个当前 AOF 文件的体积优化版本 即使 Bgre
  • linux服务器上僵尸进程查看并杀死方法

    今天在熟悉Linux命令的时候 使用top查看服务器负载的时候 发现了zombie 简单理解成僵尸吧 这个参数 这个参数就代表僵尸进程的含义 什么是僵尸进程呢 这里盗用一下官方的解释 一个进程在调用exit命令结束自己的生命的时候 其实它并
  • c语言程序设计彩色输出,C语言编程之《输出带有颜色》

    在前一篇文章我们学习了让计算机开口说话是使用printf 但是我们发现 计算机 说 出的话都是 黑底白字 的 其实计算机可以输出彩色的 我们一起来看看吧 注意此处代码只能在Windows操作系统下编译运行 下面 我们来看看 如何让颜色出现吧
  • Webpack5 的一些知识总结

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 前言 webpack 5是2020年发布的 webpack 4是2018年发布的 在webpack 4之上也做出了挺多的改变 比如 添加
Powered by Hwhale