webpack5.x性能优化之 代码分包 配置文件分离 多入口 SplitChunks cacheGroups runtimeChunk dynamic import(动态导入) 懒加载 魔法注释

2023-11-05

webpack优化

代码分离

认识代码分离

代码分离(Code Splitting)是webpack一个非常重要的特性:

  • 它主要的目的是将代码分离到不同的bundle中,之后我们可以按需加载,或者并行加载这些文件;
  • 比如默认情况下,所有的JavaScript代码(业务代码、第三方依赖、暂时没有用到的模块)在首页全部都加载, 就会影响首页的加载速度;
  • 代码分离可以分出出更小的bundle,以及控制资源加载优先级,提供代码的加载性能;

Webpack中常用的代码分离有三种:

  • 入口起点:使用entry配置手动分离代码;
  • 防止重复:使用Entry Dependencies或者SplitChunksPlugin去重和分离代码;
  • 动态导入:通过模块的内联函数调用来分离代码;

多入口起点

入口起点的含义非常简单,就是配置多入口:

  • 比如配置一个index.js和main.js的入口;

  • 他们分别有自己的代码逻辑;

image-20220330110011953

Entry Dependencies(入口依赖)

假如我们的index.js和main.js都依赖两个库:lodash、dayjs

  • 如果我们单纯的进行入口分离,那么打包后的两个bunlde都有会有一份lodash和dayjs;

  • 事实上我们可以对他们进行共享;

image-20220330110124845

配置很灵活,import也可以是再次多入口,是多个文件。

SplitChunks

另外一种分包的模式是splitChunk,它是使用SplitChunksPlugin来实现的:

  • 因为该插件webpack已经默认安装和集成,所以我们并不需要单独安装和直接使用该插件;
  • 只需要提供SplitChunksPlugin相关的配置信息即可;

Webpack提供了SplitChunksPlugin默认的配置,我们也可以手动来修改它的配置:

比如默认配置中,chunks仅仅针对于异步(async)请求,我们可以设置为initial或者all;

chunks

  1. async:当设置chunks的值为async时,只有在异步加载模块的时候,才会进行分包处理该模块
  2. initial:同步加载模块的时候,也会进行分包处理。
  3. all:同步异步都会进行分包处理
  • 默认值是async
  • 另一个值是initial,表示对通过的代码进行处理
  • all表示对同步和异步代码都进行处理**(最为常用)**

其他的splitChunks属性(很少手动配置)

minSize和maxSize

minSize的优先级高于maxSize,

  • minSize:拆分出的包的大小,至少为该minSize的值,默认值是20000B大小,如果需要拆分的包的大小不足该值的大小,是不会进行分包的。
    • 拆分包的大小, 至少为minSize;
    • 如果一个包拆分出来达不到minSize,那么这个包就不会拆分;
  • maxSize:将大于maxSize的包,再次拆分为大于minSize,但是不会大于maxSize的包。

minChunks

在模块中,使用(import,require)等关键字引入其他模块的时候,只有引入次数大于等于该值时,才会进行分包。

  • 至少被引入的次数,默认是1;
  • 如果我们写一个2,但是引入了一次,那么不会被单独拆分

cacheGroups

缓存组,出现在缓存组中的模块,不会直接分包,而是在所有模块加载完毕以后再根据缓存组配置的内容进行分包处理。

  • 用于对拆分的包就行分组,比如一个lodash在拆分之后,并不会立即打包,而是会等到有没有其他符合规则的包一起来打 包
  • test属性:匹配符合规则的包;
  • name属性:拆分包的name属性;
  • filename属性:拆分包的名称,可以自己使用placeholder属性;
// 优化
  optimization: {
    // 代码压缩操作
    minimizer: [
      new TerserPlugin({
        // 去除注释信息
        extractComments: false,
      }),
    ],
    splitChunks: {
      chunks: "all",
      // chunks:"async" // 默认值 模块存在异步加载操作(import("文件")) 进行分离
      // 最小值 默认值:20000B ~ 拆分出来的最小的包的大小是 大概20KB
      minSize: 20,
      maxSize: 40000,
      minChunks: 1,
      cacheGroups: {
        // 第三方库 将匹配到的 node_modules下加载的库 都打包到vendors下面
        vendors: {
          test: /[\\\/]node_modules[\/\\]/,
          filename: "[id]_vendors.js",
        },
        // 将自己的 utils文件夹下的文件 打包
        format:{
          test:/[\\\/]utils[\/\\]/,
          filename:"[id]_utils_format.js"
        }
      },
    },
  },

image-20220330111038018

默认缓存组

cacheGroups: {
        // 第三方库 将匹配到的 node_modules下加载的库 都打包到vendors下面
        vendors: {
          test: /[\\\/]node_modules[\/\\]/,
          filename: "[id]_vendors.js",
        },
        // 默认缓存组 当一个文件被引入超过两次的时候 也分包成一个文件
        default: {
          minChunks: 2,
          filename:"[id]_default.js"
        },
      }

image-20220330120836620

缓存组优先级

如果一个模块同时满足多个缓存组,那么就将模块分包到优先级高的缓存组中。优先级可以为负数。

如图所示:

image-20220330121308508

cacheGroups: {
        // 第三方库 将匹配到的 node_modules下加载的库 都打包到vendors下面
        vendors: {
          test: /[\\\/]node_modules[\/\\]/,
          filename: "[id]_vendors.js",
        },
        // 将自己的 utils文件夹下的文件 打包
        format: {
          test: /[\\\/]utils[\/\\]/,
          filename: "[id]_utils_format.js",
          priority: -30,
        },
        // 默认缓存组 当一个文件被引入超过两次的时候 也分包成一个文件
        default: {
          minChunks: 2,
          filename: "[id]_default.js",
          priority: -20,
        },
      }

整个项目中,只要某个模块的引用次数超过2次(可以等于),也就是说多入口的引入也是一样,都会打包到默认中。

maxAsyncRequests

最大的异步请求数量。默认值 20

name

设置拆包的名称:

  • 可以设置一个名称,也可以设置为false
  • 设置为false,则需要在cacheGroups中设置名称

chunkIds

告诉webpack,配置分包的时候,生成的分包文件的id采用什么算法。

optimization.chunkIds配置用于告知webpack模块的id采用什么算法生成。

  • 有三个比较常见的值:

    • natural:按照数字的顺序使用id;
    • named:development下的默认值,一个可读的名称的id;
    • deterministic:确定性的,在不同的编译中不变的短数字id 。确定的文件名一定有确定的短数字id。
      • 在webpack4中是没有这个值的;
      • 那个时候如果使用natural,那么在一些编译发生变化时,就会有问题
  • 最佳实践:

    • 开发过程中,我们推荐使用named;
    • 打包过程中,我们推荐使用deterministic;
optimization:{
 	// 采用自然数   
    chunkIds:"natural"
}

image-20220330130702001

实际开发中很少使用:

因为:

  1. 不见名知意
  2. 不利于浏览器缓存
  3. 如果我们有很多文件,但是有一天删除了生成自然数为1的那个源文件,重新打包,后面的所有文件名都会发生改变,本来并没有修改的代码,因为文件名发生改变,浏览器需要重新请求,无法利用之前的请求缓存。

而named属性值用的较多。在开发环境中很常见

image-20220330131019769

默认情况下,不配该属性值,打包环境的值就是 deterministic

image-20220330131425484

optimization. runtimeChunk

配置runtime相关的代码是否抽取到一个单独的chunk中:

  • runtime相关的代码指的是在运行环境中,对模块进行解析、加载、模块信息相关的代码;
  • 比如我们的component、bar两个通过import函数相关的代码加载,就是通过runtime代码完成的;

抽离出来后,有利于浏览器缓存的策略:

  • 比如我们修改了业务代码(main),那么runtime和component、bar的chunk是不需要重新加载的;

  • 比如我们修改了component、bar的代码,那么main中的代码是不需要重新加载的;

设置的值:

  1. true/multiple:针对每个入口打包一个runtime文件;
  2. single:打包一个runtime文件;
  3. 对象:name属性决定runtimeChunk的名称;
optimization:{
    chunkIds:"deterministic",
        runtimeChunk:{
            name:"runtime"
        }
}
  1. 每个动态模块单独打包 ture/“multiple”

image-20220331140809500

  1. 将所有的动态模块打包到一个文件 “single”

image-20220331141025781

  1. 设置为一个对象,使用name属性来决定打包文件的名称(就是预占位的[name]的名字)不包含后缀等

image-20220331141249536

通过将 optimization.runtimeChunk 设置为 object,对象中可以设置只有 name 属性,其中属性值可以是名称或者返回名称的函数,用于为 runtime chunks 命名。

默认值是 false:每个入口 chunk 中直接嵌入 runtime。

module.exports = {
  //...
  optimization: {
    runtimeChunk: {
      // name: "runtime.module", // single的别名配置
      // name: (entrypoint) => "runtime.module" // single的别名配置
      name: (entrypoint) => `runtime.module-${entrypoint.name}`, // true multiple 的别名配置
    }
  },
};

image-20220331141959288

动态导入(dynamic import)

同步代码的分包,一般我们最多分成四个文件:

  • main.bundle.js
  • 第三方库.bundle.js(vendor.chunk.js)
  • 多次引入的模块,都打包为 common.chunks.js
  • runtime.js

对于异步导入的模块,不管你设置什么样的值,chunks的值为什么,webpack都会在打包时帮我们进行分离。

即使chunks的值为initial,也只是表示splitChunks不对异步代码做分包,webpack依然会帮我们分包。

另外一个代码拆分的方式是动态导入时,webpack提供了两种实现动态导入的方式:

  • 第一种,使用ECMAScript中的 import() 语法来完成,也是目前推荐的方式;
  • 第二种,使用webpack遗留的 require.ensure,目前已经不推荐使用;

比如我们有一个模块 bar.js:

  • 该模块我们希望在代码运行过程中来加载它(比如判断一个条件成立时加载);
  • 因为我们并不确定这个模块中的代码一定会用到,所以最好拆分成一个独立的js文件;
  • 这样可以保证不用到该内容时,浏览器不需要加载和处理该文件的js代码;
  • 这个时候我们就可以使用动态导入;

注意:使用动态导入bar.js:

  • 在webpack中,通过动态导入获取到一个对象;
  • 真正导出的内容,在该对象的default属性中,所以我们需要做一个简单的解构;

image-20220330125726688

异步导入的模块,不管文件的大小,都会进行分包处理的。

动态导入的文件命名

动态导入的文件命名:

  • 因为动态导入通常是一定会打包成独立的文件的,所以并不会再cacheGroups中进行配置;

  • 那么它的命名我们通常会在output中,通过 chunkFilename 属性来命名;(设置异步加载的打包文件名)

    output:{
        chunkFilename:"[name].chunk.js"
    }
    

    image-20220330131726055

output: {
        // 异步 分离打包的文件名称
        // 默认情况下:这里的占位name就是我们chunkIds生成的 id
        chunkFilename: "[name].chunk.js",
        // 以入口文件名称作为打包后文件名称前缀
        filename: "[name].bundle.js",
        path: path.resolve(__dirname, "dist"),
      }
  • 你会发现默认情况下我们获取到的 [name] 是和id的名称保持一致的,如果我们希望修改name的值,可以通过**magic comments(魔法注释)**的方式;

    image-20220330194428824

// 魔法注释: name的值需要加引号
import(/* webpackChunkName:"bar" */ "./bar").then((res) => {
  console.log(res, res.default);
});

代码懒加载

动态import使用最多的一个场景是懒加载(比如路由懒加载):

  • 封装一个component.js,返回一个component对象;
  • 我们可以在一个按钮点击时,加载这个对象;

image-20220331133000083

image-20220331133028694

这种方法解决了首屏页面暂时用不到的js文件的获取,是加快首屏页面渲染速度的方式之一:

但是也有弊端:

  • 代码的懒加载,导致了只有在我们用到该文件的时候才会获取
  • 如果文件特别大,那么发起请求获取文件也是比较耗时的
  • 当浏览器获取到文件后还需要进行解析
  • 可能导致用户在某个操作后,导致很长时间无法看见效果,对用户体验不好

我们如何避免这种情况?

我们可以让首屏渲染完毕后,在浏览器空闲的时候,提前帮我们把需要懒加载的一些文件提前下载好,在用户执行某些操作后,就不需要再次发起请求,直接解析代码即可。

在webpack中,做这种效果很简单:

我们只需要使用魔法注释:webpack就会在浏览器的空闲时间帮我们下载好:

魔法注释

魔法注释:prefetch预获取

只需要在需要提前懒加载的文件前面使用魔法注释:webpackPrefetch:true,webpack就会帮我们做好。

btn.addEventListener("click", async () => {
  const { default: div } = await import(
    /* webpackChunkName: "component" */
    /* webpackPrefetch: true */
    "./components/component"
  );
  document.body.appendChild(div);
});

image-20220331134756013

image-20220331135014528

可以发现该组件是从预获取的缓存中获取的,而不是再次发起请求。

webpackPreload 预加载
  • 预加载会和当前懒加载所在的模块一起,以并行的方式开始加载。而预获取是当父模块加载结束后开始加载。

  • preload是中等优先级,且立即开始下载。prefetch chunk 在浏览器闲置时下载。

  • preload chunk 会在父 chunk 中立即请求,用于当下时刻。prefetch chunk 会用于未来的某个时刻。

  • 浏览器支持程度不同。

推荐组件等的懒加载,使用prefetch

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack5.x性能优化之 代码分包 配置文件分离 多入口 SplitChunks cacheGroups runtimeChunk dynamic import(动态导入) 懒加载 魔法注释 的相关文章

  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 如何删除除任何特定 id 之外的元素

    假设有一个父 id 其中包含许多元素 我想删除除一个元素之外的所有元素 ex parent id children not id n remove
  • 在特定页面上执行 javascript 的正确“Rails”方式

    我试图在特定页面上运行 javascript 而我唯一的解决方案似乎是反模式 我有controller js内部生成的assets javascripts 我在用着gem jquery turbolinks 我的代码类似于以下内容 docu
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • Webpack 开发服务器重新加载在虚拟机上不起作用

    我正在使用 vagrant over mac OSX 在 Ubuntu 15 10 的虚拟机上运行 webpack 服务器 webpack 配置非常干净 var HtmlWebpackPlugin require html webpack
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 使用 Enzyme 测试 `React.createRef` api

    我想测试下面的类 它使用React createRef api 不过 快速搜索并没有发现任何这样做的例子 有人成功过吗 我该如何嘲笑裁判 理想情况下我想使用shallow class Main extends React Component
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • SpringBoot vue电影购票系统 电影院系统

    SpringBoot vue电影购票系统 电影院系统 SpringBoot 电影购票系统 电影院系统 功能介绍 首页 登录 注册 图片轮播 正在热播列表 热门榜单Top10 电影分类 按类型 地区展示 搜索 活动 留言 评价客服 购买电影票
  • LeetCode初级算法:数组--买卖股票的最佳时机 II

    以下是本人的C 算法学习笔记 记录在博客上以供自己随时查阅 题目描述 给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 注意 你不能同时参
  • mavoneditor 显示html,Markdown编辑器 mavonEditor

    Markdown编辑器 mavonEditor 前端 HTML Markdown 627次浏览 0次点赞 2019 01 25 21 46 mavonEditor 是基于Vue的markdown编辑器 githup 项目地址 1 安装 np
  • html实现购物车全选,vue实现商品购物车全选与全不选项目实战

    项目需求 实现一个购物车 全选框实现对商家和商品的全选 商家全选框实现对当前商家所有商品的全选 取消其中一个商品则取消对应商家全选和全选框 选中一个商家下的所有商品则勾选对应商家的全选框 不勾选全选框 选中所有商品则勾选所有商家全选框和全选
  • 电脑不能正常启动windows怎么办,电脑系统无法正常启动

    在用电脑的时候 我们经常会碰到windows服务无法启动的问题 很多朋友也不知道怎么解决 加上导致电脑不能正常启动的因素有很多 所以 下面小编将和大家分享两种电脑无法正常启动windows解决方法 电脑不能正常启动windows怎么办 具体
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1 一元多项式拟合 使用方法 np polyfit x y deg 2 任意函数拟合 使用 curve fit 方法 实例 1 初始化 x 和 y 数据集 2 建立自定义函数 3 使用自定义的函数生成拟合函数绘图 1 一元多项式拟合
  • pip 常用命令及控制台怎么查看python 及pip 和已安装包版本号

    在使用python的时候 经常使用到pip这个工具 可以很方便的线上安装依赖库 当然pip还有很多参数都可以帮我们去查询一些库信息 在安装python的时候 下载带有pip的安装包就可以直接安装pip啦 当然没有带pip的 也可以通过下载安
  • [C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和

    作者 zyl910 本文面对对SSE等SIMD指令集有一定基础的读者 以双精度浮点数组求和为例演示了如何跨平台使用SSE2 AVX指令集 支持vc gcc编译器 在Windows Linux Mac这三大平台上成功运行 一 关键讲解 前文
  • 90道渗透测试面试题(附答案)

    2023年已经快过去一半了 不知道小伙伴们有没有找到自己心仪的工作呀 最近后台收到不少小伙伴说要我整理一些渗透测试的面试题 今天它来了 觉得对你有帮助的话记得点个赞再走哦 1 什么是渗透测试 渗透测试是一种评估计算机系统 网络或应用程序的安
  • 四.javascript对象

    目录 一 对象的介绍 1 对象的概念 2 对象的属性 3 对象的方法 二 创建对象 1 使用构造函数创建内置对象 2 直接创建自定义对象 3 使用自定义构造函数创建对象 三 对象的属性 1 设置对象的属性 2 存取对象属性 3 属性的枚举
  • 使用gpt和mindshow快速制作PPT

    目录 准备工具 PPT制作大体流程 工具 步骤 获取PPT大纲 注意 要markdown格式 编辑 打开MindShow 找不到的可以私信我 编辑 创建ppt 编辑 选择ppt基本样式 编辑 点击下载 不过要提前登录一下就好 编辑 添加动画
  • Qt(c++)调用python一直报错slot、hypot等

    最近在Qt里调用python代码 参考教程 https blog csdn net a137748099 article details 119217197 引入python的include libs之后 在c 里写了简单的调用python
  • 各种通信方式对比

    各种通信方式对比 2011年11月09日 16 58 25 horatio2010 阅读数 444 通信名称 连接端 通信方式 传输顺序 通信速度 I2C scl sda 2 串行 高位 低位 标准模式速度100kbit s 快速模式
  • 前后端常见的几种鉴权方式

    本文链接 https blog csdn net wang839305939 article details 78713124 最近在重构公司以前产品的前端代码 摈弃了以前的session cookie鉴权方式 采用token鉴权 忙里偷闲
  • C#深拷贝和浅拷贝的区别

    先上代码 后解释 public class Person public int Age public DateTime BirthDate public string Name public IdInfo IdInfo
  • C++ Templates:实例化

    延迟实例化 当隐式实例化类模板时 同时也实例化了该模板的每个成员声明 但并没有实例化相应的定义 然而 存在例外 1 如果类模板包含了一个匿名的union 那么该union定义的成员同时也被实例化了 2 作为实例化类模板的结果 虚函数的定义可
  • react ref和组件API

    介绍 昨天学习到了生命周期 今天我们接着昨天的知识点继续学习 今天学习一下state setState以及ref和组件API 大家感兴趣的话可以跟随文章进行学习呦 state和setState state 组件自身状态 setState u
  • 【100%通过率 】【华为OD机试真题】模拟商场优惠打折(一)【2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 模拟商场优惠打折 有三种优惠券可以用 满减券 打折券和无门槛券 满减券 满100减10 满200减20 满300减30 满400减40 以此类推
  • 辛普森悖论

    本系列主要为大家带来一整套的博弈论问题 广义 因为在面试的过程中 除了常规的算法题目 我们经常也会被问到一些趣味题型来考察思维 而这类问题中 很多都有博弈论的影子存在 这些公司里以FLAG Facebook LinkedIn Amazon
  • webpack5.x性能优化之 代码分包 配置文件分离 多入口 SplitChunks cacheGroups runtimeChunk dynamic import(动态导入) 懒加载 魔法注释

    webpack优化 文章目录 webpack优化 代码分离 认识代码分离 多入口起点 Entry Dependencies 入口依赖 SplitChunks chunks 其他的splitChunks属性 很少手动配置 minSize和ma