首页 > 其他分享 >react前端优化小结笔记

react前端优化小结笔记

时间:2022-12-05 14:38:01浏览次数:40  
标签:node 缓存 渲染 优化 笔记 js react webpack 小结

编译阶段的优化

主要是webpack

开发环境时重复构建更快

1.include

缩小编译的范围
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
persets: [
'@babel/preset-react'
],
plugins: [
'@babel/plugin-proposal-class-properties'
]
}
}
],
include: path.resovle('src'),
exclude: /node_modules/
}
]

2.resolve

配置解析

const bootstrap = path.resolve(“node_modules/boostrap/dist/css/bootstrap.css”)

resolve: {
modules: [path.resolve(‘node_modules’)] // 查找范围
extensions: [‘.js’, ‘.ts’], // 扩展 名 越少越好
alias: {
bootstrap
},
fallback: {
cryto: false, // 假如说你引用的一个包里面有node核心模块 它会帮你跳过这个node核心模块的引用 让你最后打出来的包体积更小
buffer: false,
stream: false
}
},
module: {
rules: […]
},

3.alias

上面提到了

4.external

如果配置了这个插件 就不会打包lodash模块 会引入 _ 这个全局变量
new HtmlWebpackExternalsPlugin({
externals: [
{
module: 'lodash',
entry: 'https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/loadash.js',
global: '_'
}
]
})

5.编译缓存

{
loader: 'babel-loader',
options: {
cachDirectory: true, // 开启缓存
}
}
但如果是webpack5
可以配置持久化缓存 以前是没有的
devtool:...
cache: { // 开启持久化缓存
type: 'filesystem' // 改为 memory会更快
},
entry: ...

6.开启多进程

entry:…
optimization: {
minimize: isEnvProduction, // 生产环境会开启压缩
minimizer: [
new TerserPlugin({parallel: true}), // 压缩js 多进程压缩
new OptimizeCSSAssetsPlugin() // 压缩css
],
splitChunks: …
}生产环境时文件更小 加载更快
1.开启tree-sharking
import {join} from ‘lodash’
仅仅只会打包join这一个方法
2.scope-hositing
将作用域提升 可以减小包的体积
3.splitChunks
代码分割 懒加载
optimization: {
minimize: isEnvProduction,
minimizer: [
new TerserPlugin({parallel: true}),
new OptimizeCSSAssetsPlugin()
],
splitChunks: {
chunks: ‘all’, // 支持 asynchronous和同步
minSize: 0, // 最小大小
minRemainingSize: 0, //分割出去剩下的大小
maxSize: 0, // 最大大小
minChunks: 1, // 最小引用次数
maxAsyncRequests: 30, // 异步模块最大并发请求数 import(‘…’)
maxInitialRequests: 30, // 同步模块最大并发请求数 import
enforceSizeThreshold: 50000, // 如果一个代码块的大小超过这个数就强行打包webpack新属性
cacheGroups: { // 缓存组
defaultVendors: { // 第三方的模块如果在node_modules里面的话会进行一个单独的分割
test: /[\/]node_modules[\/]/,
priority: -10, // 优先级
reuseExistingChunk: true // 是否使用已经分割出的代码块
},
default: {
minChunks: 2, // 如果一个模块被引用2次的话 会单独提取为一个代码块
priority: -20,
reuseExistingChunk: true
}
}
},
runtimeChunk: { // 运行时代码 单独分割
name: entrypoint => ​​​runtime-${entrypoint.name}​​​ },
moduleIds: isEnvProduction ? ‘deterministic’ : ‘named’,
chunkIds: isEnvProduction ? ‘deterministic’ : ‘named’
}


4.提供node的空mocks
我们上面在fallback中已经配置了
5.持久化缓存
webpack5新增功能
上面在代码分割后的相关moduleIds配置项
moduleIds: ‘deterministic’

路由切换的优化 懒加载

更新阶段的优化

PureComponent 只要属性不更新 组件就不会重新渲染

实现PureComponent以及memo

但上述的属性对比仅仅是浅比较 所以存在缺陷
所以我们需要用到 immutable.js
import {Map} from ‘immutable’;
Map 为不可变数据
每次操作都会返回一个不同的对象引用地址
但是每次会尽可能复用老的属性 另外可以非常快速进行深度比较 性能特别高

class App … {
constructor() {

this.state = {counter:Map({number:0})};
}
add = (amount) => {
let count = this.state.count.set(‘number’, this.state.count.get(‘number’) + amount);
this.setState(count);
}
render() {
...
return (
<button onClick={()=>this.add(1)}>
)
}

}

可视化工具 React Developer Tools

优化redux
通过reselect

简单实现一个createSelector

最新版react-router-dom 中 useSelector和上面的功能是一样的(缓存中间的计算结果 提高一定的性能)

大数据渲染优化

时间分片优化前

时间分片优化后

虚拟列表

具体虚拟列表会专门开一个专题看虚拟列表专题吧

骨架屏

在真实内容渲染前 有一个loading效果
我们要写一个webpack插件
在编译阶段就生成一个svg图 插入值

中去

skeleton.js (src/skeleton.js)

在根目录下(与webpack.config.js平行)
新建SkeletonWebpackPlugin.js

weback.base.js

webpack.config.js

webpack.seleton.js

通过webpack进行预渲染
由于spa项目普通的爬虫无法爬取项目的静态文本的内容 通过预渲染插件prerender-spa-plugin解决spa项目的seo问题
prerender-spa-plugin利用了Puppeteer的爬取页面的功能
Puppeteer是一个Chrome官方出品的headless Chrome node库 它提供了一系列的API 可以在无UI的情况下调用Chrome的功能 适用于爬虫 自动化处理等各种场景
原理是在webpack构建阶段的最后 在本地启动一个Puppeteer的服务 访问配置了预渲染的路由 然后将Puppeteer中渲染的页面输出到html文件中 并建立路由对应的目录
注意:不适合不同的用户看都会不同的页面 这种类型的页面不适用预渲染 对于一些经常发生变化的页面 如体育比赛等 会导致编译后的数据不是实时更新的

虚拟列表

还有
React hooks性能优化
Error Boundaries
通过DOM-DIFF原理进行性能优化
响应式数据的精细化渲染
图片懒加载等优化手段



标签:node,缓存,渲染,优化,笔记,js,react,webpack,小结
From: https://blog.51cto.com/u_14476028/5912050

相关文章

  • React后台管理系统 03全局样式scss
    安装scss样式依赖,使用命令npmi--save-devsass --dev会将依赖安装在devDependencies=>开发环境的依赖。我们在src目录下的assets下创建styles文件夹,然后创建文件gl......
  • React后台管理系统 02样式初始化,引入reset-css
    上一篇中,我们已经对项目的整体结构进行了搭建,现在需要对不需要的东西进行删除,最后留下这些东西。现在需要对全部的样式进行清除,使用命令导入依赖:npmireset-css然后在m......
  • NLP思维一书读书笔记
     关于NLP,我先给出比较正规的解释。再给出我个人的解释。——————————正规解释——————————NLP是神经语言程序学的英文缩写。在香港,也有意译为身心......
  • 内部类小结
    ​​https://mp.weixin.qq.com/s/hErv4X9Whl_Juq8-TDhzdg​​​什么我们需要使用内部类了?内部类方法可以访问该类定义所在的作用域中的数据,包括私有......
  • XP的一些小结
    最近博客上关于XP的讨论也有不少文章,也很火热,我觉得:与其象有的人说的,XP是否适应国情,倒不如书XP是否适应具体的项目,具体的开发小组,具体的环境。我想起......
  • JAVASCRIPT数组小结
    ​数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。JavaScript数组是无类型的,数组元素可以是任意类型,并......
  • git学习小结
    ​​http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000​​​不错的教程:git补遗1gitk,输入该命令后,简单的图......
  • JVM虚拟机小结1
    1jps-l//列出详细的类名和进程ID2)jps-m//显示运行的程序接收的参数3)jps-v//查看接收的JVM方面的参数4)jps先查出进程ID后jstat-gcutil......
  • 笔记:正确得使用java 8得optional
    publicstaticStringgetName(Useru){if(u==null)return"Unknown";returnu.name;}比如以前这样得代码,经常要判断是否NULL,很麻烦,有了java8得option......
  • 《重构》、《js高级程序设计》一些笔记知识点
    《重构(第2版):改善既有代码的设计》1.函数命名:以它“做什么”来命名,而不是以它“怎么做”来命名。 一个改进函数名字的好方法:先写一句注释描述这个函数的用途,再把这......