首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

​我是如何将网页性能提升5倍 — 构建优化篇

动态 import 将 vendor 拆分后,依赖仍然会在首屏被加载,如果依赖不在首屏使用,仍然会造成网络资源浪费,并阻塞页面渲染,对于没必要在首屏进行加载依赖,我们可以采用动态 import 方式...例如上面这个 js-export-excel 这个依赖,自己本身有将近 500 kb,但是其只会在用户点击【导出】按钮时候使用,我们首先在 vendor 中将其拆出来。 ?...不是所有依赖都适合异步加载,如果你对使用该依赖有很高性能要求,然后依赖本身也比较大,这种情况是不适合,因为你可能会看到明显延迟。...对于一个依赖,我们可以通过动态 import 方式进行懒加载,但是对于一个 React 组件,直接使用动态 import 可能就不太合适了,组件渲染运行时都是可多次触发了,不可能在每次组件渲染时都加载一次组件...在 Suspense 组件渲染 lazy 组件,可以使用在等待加载 lazy 组件时做优雅降级( loading )。fallback 属性接受任何在组件加载过程你想展示 React 元素。

2.3K20

微前端——single-Spa

特点:(1)在同一页面上使用多个框架而无需刷新页面(2)独立部署(3)使用新框架编写代码,无需重写现有应用程序(4延迟加载代码以改善初始加载时间(5)本身没有处理样式隔离、js执行隔离,共用同一个windowsingle-spa...["react", "react-dom"] : [], };};3、在single-spa应用在 single-spa使用过程,我们需要用importmap在根项目中引入所有的模块文件和子项目...bootstrap, mount, unmount } = lifecycles;在webpack.config.js中将react-router-dom手动抽取出来reactreact-dom会自动抽取...)(2)改造应用下载对应包装器,single-spa-vue,下载几个:systemjs-webpack-interop、vue-cli-plugin-single-spanpm i single-spa-vue...,它是一个npm,它导出函数可以帮你创建一个webpack,这个可以被systemjs作为浏览器内模块使用

3.6K10
您找到你想要的搜索结果了吗?
是的
没有找到

前端性能优化之webpack打包优化

两种,配置文件entry配置是默认拆分,多个入口,多个 main chunk。...all 分包上面两种,这里要注意就是all有时候会理解成“所有”就会以为所有使用import '....,常见几个优化项目为 优化使用工具引用,将必要工具引用单独提到一个文件,避免打包其他没用到代码到 有些应用初始化相关但是跟应用无关代码,使用异步模块加载,如下 // app.ts...等三方通过npm或yarn安装到本地,然后直接import进来使用,这种方式势必就会将这些第三方包打包到我们自己js,且因为这些库本身体积就较大,所以会导致我们打包出来js非常大,而且,当我们使用了...原因是方便写判断逻辑,而不是在html通过ejs模板语法来写判断逻辑 然后,配置externals选项告诉webpack当我们使用import语句导入模块时,实际使用是是什么内容(一般三方库都会导出一个包含了所有他包含内容全局变量

25320

干货 | 0到1,搭建一个体系完善前端React组件

js代码如果有显式require css语句时,在同构项目中,可能会遇到服务端解析css文件各种问题。...组件项目中基础UI部分,组件剥离,拆分成独立ui-basic组件库;组件项目中工具方法(表单校验、环境判断、正则处理、时间日期格式化等),拆分成独立 util库。...这种拆分组件开发形式,组件库不再是所有功能都揉在一个仓库,开发和维护将变得更加灵活且易于扩展。 拆前,core部分将随着功能增加而越来越臃肿: ? 拆结构: ?...五、解决组件开发环境问题 拆分组件后,给组件多样性扩展带来了极大便利,但随之而来问题便是,每一个组件都需要单独维护,在开发组件时,每一个都需要一个可运行本地开发环境。...我们目前选择解决方案是,对于粒度更细组件所有会公用一套dev开发仓库,通过 git modules在开发仓库嵌套子模块仓库,实现了只维护一套开发环境,产出多个子模块组件库工厂。

1.7K30

首屏体验提升之不一样代码拆分+预加载实现应用性能及体验兼得

常规组件按需加载方案缺点 React.lazy 组件按需加载 - 组件渲染时加载组件资源 react.lazy(() => import("xxxx/component")); 优点:拆分组件代码,按需加载...如图是我们项目中实际出现场景之一: image.png image.png 由于资源加载存在近4s耗时,组件渲染被延迟,这种情况下,便导致了我们虽然通过减少了首屏资源提升了首屏加载体验,但却让用户在后续使用过程中出现了体验断层...dynamic 是基于 import()做一个封装函数。 支持组件资源批量自动预加载,同时支持自定义触发时机, hover 到某个组件上、某组件渲染时、出现在视图内时。...) 405 8 可以看出,预加载显著提升了组件加载速度,尤其是对于复杂组件加载速度提升更为明显。...生成 JSON 文件: JSON: 开发者基于 JSON,可以判断出可被预加载chunk及已配置预加载chunk具体有哪些,同时也能知道插件配置加载标识preloadKey与chunk间映射关系

29820

webpack 构建之 splitChunks 优化与 manifest

splitChunks 配置项用来确定具体拆分规则,其中 cacheGroups 配置项必须同时满足其下所有条件才能生效。...lodash 是 page1.js 引入,而 page1.js 是动态加载,所以 loadsh 就可以进入分包规则校验,并抽离出来,生成 vendors-xxxlodash.js 。...initial 表示只入口模块进行拆分。 all 表示入口模块和异步加载模块都要进行拆分。...请求定义: 入口文件本身算一个请求; 入口文件动态加载模块不算在内; 通过 runtimeChunk 拆分出来 runtime 文件不算在内; 只算 js 文件,css 文件不算在内; 如果同时有两个模块满足...依赖关系图如下,可以看到 orgchart.js 分别存在于 entry1.js 和 entry3.js ,并没有被抽离出来: 把 maxInitialRequests 设置为 4 后,可以看到打包结果中出现了

1.5K10

金九银十,带你复盘大厂常问项目难点

其实从这里可以看出来,管理系统使用微前端成本并不会太大,而且后面的技术问答,候选人微前端还是挺优秀,各个细节基本都涉略到了。...默认值为 true,即在应用 start 之后即刻开始预加载所有应用静态资源。如果设置为 'all',则应用 start 之后会预加载所有应用静态资源,无论应用是否激活。...babel-plugin-import Babel 插件: 使用 babel-plugin-import Babel 插件可以在编译时将导入整个库语句转换为仅导入使用组件。...样式和逻辑关联 这种方案下,虽然CSS和JS在源码层分离,但组件内会直接引用样式,且输出文件中保留import语句。 优点: 使用简单,只引入JS即可。 支持按需加载。...npx standard-version 4. 构建: 使用 Webpack、Rollup 等工具进行构建,生成可以在不同环境(浏览器、Node.js)下使用代码。

59930

【译】在生产环境中使用原生JavaScript模块

除了通过动态导入做代码拆分外,我还建议以npm为粒度做代码拆分,node_modules模块都合并到以其名命名文件。...如果没有返回任何内容,参数模块将被添加到默认文件。 考虑 lodash-es中导入 cloneDeep()、 debounce()和 find()模块一个应用程序。...我在上面说过,我认为级别上代码拆分是站点代码拆分最佳状态,而又不会太激进。 当然,如果你应用程序数百个不同npm中导入模块,那么浏览器可能无法有效地加载所有模块。...一般来说,你可以将可能在同一时间发生变化(例如, Reactreact-dom)分组,因为它们必须一起失效(例如,我稍后展示示例应用程序将所有React依赖项分组为同一个文件)。...高效加载JavaScript模块 当你使用代码拆分时候,最好预加载所有马上要使用模块(即入口模块导入图中所有模块)。

1.3K20

webpack性能优化(2):splitChunks用法详解

之前写webpack性能优化(0):webpack性能优化概况-优化构建速度》、《webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载》如果使用vue-cli,默认生成vendor.js...一些对于代码分离很有帮助插件和 loaders:ExtractTextPlugin:用于将CSS应用程序中分离出来。bundle-loader:用于分离代码和延迟加载生成 bundle。...所谓延迟加载|按需加载|懒加载先选择方式是,使用符合 ECMAScript 提案 import() 语法。...值必须大于等于 1;minSize与maxSizeminSize限制拆分最小值(达到这个值,就拆出新)maxSize限制每个拆分出来最大文件体积(超过这个大小,再做拆分cacheGroups...minChunks: 2,        priority: -20,        chunks: 'initial',        reuseExistingChunk: true//如果当前块包含已经中分离出来模块

1.5K31

webpack性能优化(2):splitChunks用法详解

之前写webpack性能优化(0):webpack性能优化概况-优化构建速度》、《webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载》如果使用vue-cli,默认生成vendor.js...一些对于代码分离很有帮助插件和 loaders:ExtractTextPlugin:用于将CSS应用程序中分离出来。bundle-loader:用于分离代码和延迟加载生成 bundle。...所谓延迟加载|按需加载|懒加载先选择方式是,使用符合 ECMAScript 提案 import() 语法。...值必须大于等于 1;minSize与maxSizeminSize限制拆分最小值(达到这个值,就拆出新)maxSize限制每个拆分出来最大文件体积(超过这个大小,再做拆分cacheGroups...minChunks: 2,        priority: -20,        chunks: 'initial',        reuseExistingChunk: true//如果当前块包含已经中分离出来模块

1.5K20

详解 Module Federation 实现原理

component 应用入口代码(remoteEntry)以及组件,同时只下载了 main 应用共享出去 reactreact-dom 这两个依赖,也就是说 component 组件使用就是.../bootstrap') 一般在我们项目中 index.js 作为我们入口文件里面应该存放是 bootstrap.js 代码,这里却将代码单独抽离出来放到 bootstrap.js ,同时在...我们先看一下 webpack 是怎么转换 main 应用导入语句:main/src/App.js import React, {useState} from 'react'; import Button...在加载 bootstrap_js.js 时候必须先加载完远程应用资源,对于我们例子来说如果我们想要使用远程应用 Button、Tooltip 组件就必须先加载这个应用资源,即 webpack...总结 上面我们讲了 MF 基本概念到实现原理再到应用场景,也介绍了在不同场景存在一些问题,下面总结下他优缺点: 优点: 能够像微前端那样将一个应用拆分成多个相互独立应用,同时应用可以与技术栈无关

42120

场景倒推,在字节我们要什么样微前端体系

概览,这篇文章面向是还没有在业务中使用过微前端同学或团队,通过这篇概览,可以简单建立对 「微前端」整体认知; 总的来说「微前端」这个概念出来到发展如今,还处于一个百花齐放(各做各)发展...chunk js 通过 jsonp 方式来加载 (入口文件则是 IIFE)。...,具体来说,是在渲染某些区域内容时,加载自身 chunk」变成 「加载应用入口」,加载 webpack 换成「微前端容器」; 以访问 https://xxx-domiain/main-app/...应用上线升级版本,怎么不让应用重新打包? 如何选择不同版本 上线 / 回滚 / 灰度? 如何查看现在所有应用列表? 多个版本之间切换如何集成联调? ......模块之间组件交叉耦合 模块内引入了其他模块内部组件 / 方法, 这些被引用项应该拆分出去成公共组件 / 方法; (如数据准备用到标签表达式树组件、可视化筛选器组件等) 公共依赖组件/方法还没完整拆分打包

1.4K30

Vue.js应用性能优化二

在Vue.js延迟加载和代码拆分文章,我们了解了代码拆分是什么,它如何与Webpack一起工作以及如何在Vue应用程序中使用延迟加载使用它。...所有js代码都被打包到一个文件 — app.js 您可能已经注意到,根据我们访问路由,我们可能不需要Home.vue或About.vue(依赖lodash)但它们都在相同app.js,无论路由用户是什么...如果是这样,重要是要知道它们都有关于代码拆分一些自定义行为: 在vue-cli 3,默认情况下将预取所有延迟加载块。我们将在稍后学习如何使用预取(prefetching)。...只需将这几行添加到webpack配置,我们就会将公共依赖项分组到一个单独,以便共享它们。再说清楚一些,几个路由页面共享依赖,会单独抽取出来打包,而其他页面不会下载这个共享。...在下一部分,我们将了解所有其他小部件(Vuex存储和单个组件),这些部件也可以bundle减掉并且懒加载

2K30

Vue.js延迟加载和代码拆分

要了解它,首先我们需要了解Webpack如何打包所有文件。 打包我们资源(assets)时,Webpack会创建一个依赖图。它是一个基于导入链接所有文件图表。...延迟加载允许我们拆分捆绑并仅提供所需部分,这样用户就不会浪费时间下载和解析不会使用代码。...现在是时候看看我们如何在我们自己Vue.js应用程序中使用延迟加载。 动态导入 我们可以使用webpack动态导入,轻松地加载我们应用程序某些部分。...我们来看看这里发生事情: 我们创建了一个返回import()函数函数,而不是直接导入Cat模块。现在,webpack会将动态导入模块内容捆绑到一个单独文件。...假设我们有一个非常小网上商店,有4文件: main.js 作为我们主要bundle product.js 用于产品页面脚本 productGallery.js 用于产品页面产品库 category.js

7.7K10

下一代前端构建利器——Turbopack

App Router 文件默认都是服务端组件.Client Components 客户端组件,如果要使用客户端组件那就必须加上 use client ,并且这个命令会影响到组件,如果父组件加上了...use client ,那么这个组件所有组件都是客户端组件了(无需再添加use client).只有在客户端才可以使用useState,useEffect等 Rooks。'...它会根据设备屏幕大小和分辨率,动态调整图像大小和质量,并使用现代图像格式( WebP),以减少图像文件大小和加载时间。Webpack5 需要使用额外插件或加载器才能实现类似的功能。...这样一来,用户在访问应用时可以离其最近服务器获取内容,减少网络延迟并提高响应速度。Webpack5 不提供这样一体化全球 CDN 和扩展功能。4....逐渐拉开关于团队项目webpack5向Turbopack进行迁移turbopack作为webpack继任者,团队提供支持wepack应用所有工具, 目前还无法webpack迁移到turbo,但是不提供

17110

微前端qiankun搭建到部署实践总结

为了不eject所有webpack配置,我们用react-app-rewired方案复写webpack就可以了。...**接下来先选一个loading组件: 如果应用使用了ElementUI或其他框架,可以直接使用UI库提供loading组件。...如果应用为了保持简单没有引入UI库,可以考虑自己写一个loading组件,或者找个小巧loading库,笔者这里要用到NProgress。...= { transpileDependencies: ['common'], } 应用支持独立开发 微前端一个很重要概念是拆分,是分治思想,把所有的业务拆分为一个个独立可运行模块。...现在觉得比较好做法是:应用可以下发一些自身用到模块,应用可以优先选择应用下发模块,当发现应用没有时则自己加载应用也可以直接使用最新版本而不用父应用下发

2K11

关于webpack面试题总结

reactjsx代码必须编译后才能在浏览器中使用;又如sass和less代码浏览器也是不支持。...所以总结一下: 构建思路来说 gulp和grunt需要开发者将整个前端构建过程拆分成多个`Task`,并合理控制所有`Task`调用关系 webpack需要开发者找到入口,并需要清楚对于不同资源应该使用什么...同样是基于入口打包工具还有以下几个主流webpack rollup parcel 应用场景上来看: webpack适用于大型复杂前端站点构建 rollup适用于基础库打包,vue、react...:用上一步得到参数初始化 Compiler 对象,加载所有配置插件,执行对象 run 方法开始执行编译; 确定入口:根据配置 entry 找出所有的入口文件; 编译模块:入口文件出发,调用所有配置...通过import(*)语句来控制加载时机,webpack内置了对于import(*)解析,会将import(*)引入模块作为一个新入口在生成一个chunk。

11.5K114

一文带你进入微前端世界

iframe 内外系统通信、数据同步等需求,应用 cookie 要透传到根域名都不同应用实现免登效果。 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载过程。...,应用通信较为复杂易踩坑 webpack5 Module Federation 使用 Module Federation,我们可以在一个应用动态加载并执行另一个应用代码,且与技术栈无关,并且能够共享模块...manifest.json 文件,生成一份资源清单,然后主应用 loadApp 远程读取每个子应用清单文件,依次加载文件里面的资源;不过该方案也没办法享受应用按需加载能力 HTML Entry...则更加灵活,直接将应用打出来 HTML 作为入口,框架可以通过 fetch html 方式获取应用静态资源,同时将 HTML document 作为节点塞到框架容器。...除了打出来可能体积庞大之外问题之外,资源并行加载等特性也无法利用上 微前端应用隔离 CSS 隔离 当应用和微应用同屏渲染时,就可能会有一些样式会相互污染,可以采取以下两种方案 CSS Module

81410

深入浅出微前端

微前端也是借鉴后端微服务思想。微前端就是将不同功能按照不同纬度拆分成多个子应用。通过应用来加载这些应用。 微前端核心在于先拆后合。...iframe 内外系统通信、数据同步等需求,应用 cookie 要透传到根域名都不同应用实现免登效果。 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载过程。...实现import方法,传参为id即入口文件加载入口文件后,解析查看dest目录setters和execute。...微应用接入像使用接入一个 iframe 系统一样简单, 但实际不是 iframe 。 完备: 几乎包含所有构建微前端系统时所需要基本能力, 样式隔离、 js 沙箱、 预加载等。...qiankun没有使用single-spa所使用system.js模块规范,而打包成umd形式,在qiankun内部使用了fetch去加载应用文件内容。

3K10

微前端在美团外卖实践

这一过程也非常轻量,由于React-Router版本4开始有了“破坏级”升级,于是我们就调研了两种方式进行动态加载路由(目前我们使用React-Router版本5),如下表所示: ?...如果业务很复杂,完全可以在工程通过webpack动态import进行路由懒加载,也就是说,工程完全可以按照路由再次切分成chunks来减少JS体积。...我们这里暴露了工程三个对象:这里最重要就是routes路由组件,就是在写React-Router(版本4及以上)路由。...之前所有业务线都在一个工程,打包速度随着业务线膨胀变得越来越慢,而如下方案使得工程开发和部署完全独立,单个业务线打包速度会非常快,之前分钟级别降到了秒级别。...另外还有多个正在开发微前端子工程,剩余在工程业务线后续也可以无痛迁移出来成为工程。我们内部也在此过程搜集了不少意见反馈,未来继续在实践中进行思考和完善。

97630
领券