02 Code-Splitting

前端工程化实战 - Rollup、Parcel 打包 阅读详情

打包

大多数React应用都会使用Webpack/Rollup/Browserify这类构建工具来打包文件
打包指的是将引入文件合并到一个单独文件的过程,最终形成一个bundle,接着在页面内引入该bundle,就可以一次性载入!
如果你在使用 Create React App, Next.js, Gatsby等类似工具,你会拥有一个可以直接使用的Webpack配置来进行打包工作。
如果没有使用上述工具,就需要自己进行配置


代码分隔

尽管打包是个很棒的技术,但随着应用的增长和第三方库的增加,难免会出现页面加载缓慢现象
为避免搞出大体积代码包,前期考虑到代码分隔是明智的
常见的代码构建工具/打包器都支持这一技术,能够创建多个包并在运行时动态加载。
代码分隔可以让你“懒加载”用户所需内容,提升响应速度

动态import语法

动态import()语法是引入代码分隔的最佳方式

import('./math').then(math => {
  console.log(math.add(19, 21))
})

Webpack在解析到该语法时,会自动进行代码分隔
当你使用Babel时,要确保Babel能解析动态import语法,而非进行转换,你需要babel-plugin-syntax-dynamic-import插件


React.lazy

React.lazy函数能让你像渲染常规组件一样处理动态引入的组件

// not using React.lazy
import OtherCompo from './OtherCompo'

// using React.lazy
const OtherCompo = React.lazy(() => import('./OtherCompo'))

React.lazy接收一个函数,该函数要动态调用import(),且必须返回一个Promise,该Promise需要resolve一个default export的React组件

接下来,应该在Suspense组件中渲染lazy组件,如此使得我们可以做组件加载中的优雅降级,即loading指示器

import React, { Suspense } from 'react'

const OtherCompo = React.lazy(() => import('./OtherCompo))

function MyCompo() {
  return (
    <div>
      <Suspense fallback={<div>Loading....</div>}>
        <OtherCompo />
      </Suspense>
    </div>
  )
}

fallback属性接收任何React元素
Suspense组件可以置于懒加载组件之上的任意位置(任意父级别)
Suspense组件可以包裹多个懒加载组件


异常捕获边界(Error boundaries)

如果模块加载失败(如网路问题),它会触发一个错误
你可以通过异常捕获边界(Error boundaries)来处理,以显示良好的用户体验并管理恢复事宜

import React, { Suspense } from 'react'
import MyErrorBoundary from './MyErrorBoundary'

const OtherCompo = React.lazy(() => import('./OtherCompo'))
const AnotherCompo = React.lazy(() => import('./AnotherCompo'))

const MyCompo = () => {
  <div>
    <MyErrorBoundary>
      <Suspense fallback={<div>Loading...</div>}>
        <section>
          <OtherCompo />
          <AnotherCompo />
        </section>
      </Suspense>
    </MyErrorBoundary>
  </div>
}
// 具体实现见 04 Error Boundarires 

基于路由的代码分隔

决定在哪儿使用“引入代码分隔”是需要一些技巧的
引入代码分隔要以均匀分隔、不影响用户体验为前提条件

大多数用户习惯网页切换过程,所以常见的选择是从路由开始

import React, { Suspense, lazy } from 'react'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'

const Home = lazy(() => import('./routes/Home'))
const About = lazy(() => import('./routes/About'))

const App = () => (
  <Router>
    <Suspense fallback={<div>Loading...</div>}>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </Switch>
    </Suspense>
  </Router>
)

命名导出(Named Exports)

React.lazy目前只支持默认导出(default exports)
如果想要被引入的模块使用命名导出(named exports)
你可以创建一个中间模块,用以导出为默认模块,来保证tree shaking不出错

// Messages.js
export const AllMessages = /*...*/
export const UnreadMessages = /*...*/

// UnreadMessages.js
export { UnreadMessages as default } from './Messages.js'

// App.js
import React, { lazy } from 'react'
const UnreadMessages = lazy(() => import('./UnreadMessages'))

代码分割示例见:myapp>LazyCompo.jsx

Code Splitting(代码分割)​​ 通过在代码中使用 ​​import()​​ 语法,在运行时按需加载模块。这会将 chunk 命名为 about-page.[hash].js,而不是一个数字 ID,便于调试和识别。prefetch非常适合用于预测用户下一步可能进行的操作(例如,在主页预取关于页的代码)。这是最自然的拆分点。用户访问某个路由时,才加载该路由对应的代码。只有当用户点击按钮时,HeavyModal组件的代码才会被加载。使用魔法注释指导浏览器在空闲时加载资源,优化后续导航的体验。在这个过程中,用户会盯着白屏等待,体验非常差。 阅读详情

相关推荐

React入门实战:Code Splitting和懒加载

1.背景介绍 React作为当前最火爆的前端框架,其开发速度、性能等方面都有不俗的表现。然而由于其庞大的体积和复杂性,开发者往往难以将它快速上手并掌握其功能特性。所以,React初学者通常都会遇到以下几个问题: React项目初期如何划分文件? 文件过多后应该如何管理? 如何实现路由跳转时的

AI架构师小马 227

使用CodeWarrior的构建工具选项来优化HC12/HCS12/HCS12X/HCS12XE内核的性能

这篇文档描述了CodeWarrior工具中的两个能为HC12/HCS12/HCS12X/HCS12XE内核生成更优化的代码的选项集。一个选项集优化了代码的速度;另一个则优化了代码的大小。

夏日白云的boke 2432

探索前端领域Webpack的Code Splitting策略

在现代前端开发中,随着项目规模的不断增大,打包后的 JavaScript 文件体积也越来越大,这会导致页面加载时间变长,用户体验下降。Webpack 的 Code Splitting 策略旨在解决这个问题,通过将代码分割成多个较小的文件,实现按需加载,从而提高页面的加载性能。本文的目的是深入探索 Webpack 的 Code Splitting 策略,详细介绍其原理、实现方式和应用场景,范围涵盖从基础概念到实际项目应用的各个方面。

小白菜的博客 808

webpack 之 code splitting (代码分割)

(一)背景 在项目中我们通常会用到一些插件,比如 loadsh、element-ui、axios 等等,如果不进行任何操作的话,这些【插件】和【业务逻辑代码】会统一打包到一个js文件中(main.js) index.js: import { flatten } from './number' var arr = [1, 2, [3, 4, [5, 6]]] var result = flatten(arr) console.log(result) number.js const lodash

Luckyzhoufangbing的博客 630

Vite Code Splitting详解

打包构建中的代码拆分(Code Splitting)是一种优化技术,它将应用程序的代码拆分成多个小块(chunks),并在需要时按需加载这些代码块。当应用程序的代码被打包成一个单独的文件时,用户在访问应用程序时需要下载整个文件,这可能导致长时间的加载延迟。通过代码拆分,可以将应用程序的关键代码和初始加载所需的最小功能模块放在主文件中,而将其他代码块延迟加载。这样可以减少初始加载时间,使用户更快地看到应用程序的内容。应用程序通常具有多个页面或功能模块,用户在访问应用程序时并不总是需要加载所有的代码。

xiangzhihong8的专栏 247

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

Code Splitting 分包策略

主要总结了分包策略的实现方式、工具配置、策略选择、性能优化、实际案例等内容。

热爱前端的大宝同学。 1692

Win11 C盘瘦身终极指南:哪些能删/能移/不能碰?附详细目录清单

本文提供了一份详细的Win11 C盘瘦身终极指南,清晰区分了可安全删除、适合迁移以及绝对不能触碰的系统目录。文章不仅列出了具体的文件夹清单与操作建议,还介绍了使用符号链接和Robocopy进行安全迁移的高阶方法,并附带了自动化脚本,帮助用户从根本上解决C盘空间不足的问题,同时确保系统稳定。

weixin_29246195的博客 1542

Webpack 的 Code Splitting:优化性能的高效策略

Webpack代码分割优化打包体积指南 本文介绍了Webpack的Code Splitting技术及其在现代前端开发中的重要性。主要内容包括: Code Splitting概念:通过将代码分割成多个小块实现按需加载,减少初始加载时间,提升性能。 实现方式: 动态导入(import()) splitChunks配置优化公共模块提取 魔法注释控制分割策略 预加载(preload)和预取(prefetch)优化 应用场景: 懒加载(Lazy Loading) React/Vue框架中的组件按需加载 路由级代码分割

你若盛开,清风自来 1214

第17篇:深入解析OpenEuler 24.03系统中的逻辑卷管理(LVM)

OpenEuler 24.03系统中的逻辑卷管理(LVM)提供了灵活的存储管理方案,通过在物理存储与文件系统间构建抽象层实现动态资源分配。

专注于系统运维、数据库、DevOps、虚拟化技术、docker、kubernetes、等云原生技术。 1689

R语言绘图中文显示全攻略:从乱码到完美适配

本文详细解析了R语言绘图中的中文显示问题,从乱码根源到完美适配方案。通过showtext、sysfonts和extrafont等工具包的应用,提供跨平台的中文显示解决方案,涵盖ggplot2图表、PDF/PNG输出及Shiny应用等场景,助力用户高效实现R绘图中文完美呈现。

hp777的博客 256

webpack和Code-Splitting

webpack和Code-Splitting

shenzhenya的博客 418

Windows 下安装 Hermes Agent 完整教程(含踩坑记录)

不支持原生 Windows,必须通过 WSL2 (Windows Subsystem for Linux 2) 运行。WSL2 是 Windows 内置的 Linux 兼容层,可以在 Windows 上运行完整的 Linux 环境。

weixin_50191542的博客 4269

Code Splitting

webpack4 最大的改动就是废除了CommonsChunkPlugin 引入了 optimization.splitChunks如果你再webpack4中使用了weppack3的CommonsChunkPlugin 会出现以下报错:(运行配置文件 webpack3.config.js)Error: webpack.optimize.CommonsChunkPlugin has been re...

自己整理的一些前端知识 638

T分布和T检验的理解,Python代码实现T检验的计算

每天学习一点,每天进步一点。 声明:本人所有的原创,都是自己在学习过程中的记录点滴,不一定都是对的,肯定也会有一些错误的想法。所以大家看一看就好,不可尽信。当然也欢迎指出。 T分布 定义,有来自标准正态分布的样本X ~ N(0,1),和来自卡方n分布的Y ~ X2(n), 那么有 Z= X/√(Y/n) 成为符合自由度为n的T分布 我们用Python代码画一下他的图形 # 给一个自由度,返回这个自由度的卡方分布 X²(n) def product(n): n = np.ceil(n).astype

PY_smallH的博客 8485

实战优化!C#上位机串口通信卡顿问题:超时机制+数据缓存方案

串口名</param>/// <param name="baudRate">波特率

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1063

3. tree shaking、code splitting、splitchunksplugin、shimming等

(一) Tree shaking https://www.webpackjs.com/guides/tree-shaking/ 使用tree shaking 可以将没有使用的模块、方法、文件不进行打包,但是tree shaking只支持ES Module 引入的方式 (module.exports import from) 在webpack.config.js文件中进行配置 https://webpack.docschina.org/configuration/optimization/ 在packa

草木红的博客 629

SAP-ABAP:接口多继承与复合接口设计:复杂业务场景下的能力组合实现方案

本文介绍了ABAP中通过接口多继承与复合接口设计实现能力组合的方案。文章首先辨析了类实现多个接口与接口继承接口的核心概念,指出ABAP虽不支持类多继承,但可通过这两种机制灵活组合能力。随后详细讲解了类实现多个接口的语法规则与三种调用方式,并给出了五个基础能力接口的设计示例(日志记录、权限校验、数据导出、消息通知、格式转换)。作者通过对比单继承与接口多重实现的差异,强调后者在解耦和扩展性上的优势,为复杂业务场景下的能力组合提供了实用解决方案。

baidu_35680696的博客 244

webpack:Code Splitting 打包项目分割文件,优化页面加载

参考文章: 知乎:Webpack 大法之 Code Splitting 来源项目: vue-element-admin RuoYi 下图左侧为为分割的打包,右侧为分割的打包,很明显的看出,右侧将element和echarts这两个比较大的包从其中分离出来: 而这种做最直接明显的优势就是,像element及echarts这种很大的文件,在很大的情况下是不会改变内容的,比如我们在一个页面的功能修改了一下,打包上传,如果未分割的打包,浏览器会发现这个js文件有变动了,就会重新加载很大的几百KB甚至上M的js.

weixin_43856797的博客 2377

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

React打包优化技巧:Tree Shaking与Code Splitting深度解析

你是否曾经遇到过这样的场景:React应用随着业务增长变得越来越庞大,首次加载时间从几秒延长到十几秒,用户流失率直线上升?或者应用在低端设备上运行卡顿,用户体验大打折扣? 这背后往往是因为打包体积过大导致的性能问题。现代React应用动辄几MB甚至十几MB的打包体积,严重影响了应用的加载速度和运行性能。本文将深入解析React打包优化的两大核心技术:Tree Shaking(树摇)与Code S...

gitblog_00158的博客 1084

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

中级前端进阶方向 框架篇 三十二) 详解前端 Tree Shaking、Code Splitting、懒加载

本文介绍了前端性能优化的三大核心技术:TreeShaking、CodeSplitting和懒加载。TreeShaking通过静态分析移除未使用的代码,减少打包体积;CodeSplitting将代码拆分成多个bundle,提升首屏加载速度;懒加载实现按需加载资源,优化用户体验。三者相辅相成:TreeShaking精简代码,CodeSplitting合理分包,懒加载运行时按需请求。文章还详细说明了各项技术的原理、使用场景和注意事项,并指出它们需要结合ESModule、动态import等技术实现最佳效果。这些优化

DeppBing的博客,全栈修炼记|记录一个开发者的进化轨迹 1026

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

React性能优化终极指南:Tree Shaking与Code Splitting深度解析

React性能优化是提升应用体验的关键环节,而Tree Shaking与Code Splitting是两种高效的优化技术。本文将详细解析这两种技术的核心原理、实施方法及最佳实践,帮助开发者构建更轻量、响应更快的React应用。 ## 为什么React性能优化至关重要? 在React应用开发中,随着项目规模扩大,代码体积往往会急剧增长,导致页面加载缓慢、交互卡顿等问题。性能优化不仅能提升用户体验

gitblog_00845的博客 501

VUX 移动端项目路由异步加载组件:webpack code splitting 实战指南

在基于 VUX 的移动端 Vue 应用中,把所有页面组件一次性打进首屏包会显著拖慢加载速度。本文围绕 VUX 官方开发文档中的异步加载方案,系统讲解如何借助 webpack 的 code splitting 能力,让页面组件在切换到对应路由时才被加载,并完整覆盖 `vue-loader@13.0.0` 前后的语法差异,以及公共组件被重复打包时的全局注册优化方案。读完本文,你将掌握一套可直接落地到

gitblog_00086的博客 615

react : code splitting

1、webpack config output: { ... chunkFilename: 'js/[name].min.js' ... } optimization: { splitChunks: { cacheGroups: { default: false, ...

weixin_30725315的博客 63

Webpack系列(系列六):Code Splitting 和 Webpack的关系

Code Splitting是什么? Code Splitting也就是代码分割的意思,本质上跟Webpack是没有关系的 因为我们会发现,我们通过Webpack打包的js文件,都会放在一个文件当中,那么如果我的业务代码很长,一个js文件可能有2mb大小,那么都放在一个js中,用户是不是在访问页面的时候,都得每次加载这么多的资源?这就造成一个隐性问题,加载时间过长,给用户的体验感不好!!!所以就需要代码分割了,提高页面性能 那么之前我们做代码分割都是手动来去做,很麻烦,但是Webpack提供的配置可以很方便

yu923023913的博客 319

Webpack优化:Tree Shaking与Code Splitting

$|M_{\text{final}}| = |S| \quad \text{其中} \quad S = { m \in M \mid m\text{被直接或间接引用}}$$$$\min(V_{\text{init}}') \quad \text{s.t.} \quad \text{用户体验最优}$$通过组合使用,可显著降低首屏加载时间,典型场景下首屏体积减少$30%-70%$。依赖关系,自动移除未使用的代码(dead code)。:将代码拆分为独立chunk,实现按需加载或并行加载。

2501_93894412的博客 357
上一篇: 12 Thinking in React
下一篇: 03 Context
zyan_cn
博客等级 码龄9年 4粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值