Appearance
性能优化
代码优化
代码分割
页面级代码分割:将不同页面的代码分割到不同的包中,减少初始加载时间
javascript// app.config.js export default { pages: [ 'pages/index/index', 'pages/login/index' ], subPackages: [ { root: 'pages/detail', pages: [ 'index' ] } ] }组件级代码分割:使用动态 import 实现组件的懒加载
jsx// React import React, { lazy, Suspense } from 'react' const LazyComponent = lazy(() => import('./LazyComponent')) function App() { return ( <Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </Suspense> ) } // Vue const LazyComponent = () => import('./LazyComponent.vue')
代码压缩
JavaScript 压缩:使用 Terser 等工具压缩 JavaScript 代码
CSS 压缩:使用 PostCSS 等工具压缩 CSS 代码
HTML 压缩:使用 html-minifier 等工具压缩 HTML 代码
代码混淆
变量名混淆:将变量名替换为短变量名,减少代码体积
函数名混淆:将函数名替换为短函数名,减少代码体积
字符串加密:对敏感字符串进行加密,提高安全性
渲染优化
减少渲染次数
使用 React.memo:对于纯展示组件,使用 React.memo 减少不必要的渲染
jsximport React, { memo } from 'react' const PureComponent = memo(({ data }) => { return <div>{data}</div> })使用 useMemo:对于计算密集的操作,使用 useMemo 缓存计算结果
jsximport React, { useMemo } from 'react' function Component({ data }) { const processedData = useMemo(() => { return data.map(item => item * 2) }, [data]) return <div>{processedData}</div> }使用 useCallback:对于函数,使用 useCallback 缓存函数引用
jsximport React, { useCallback } from 'react' function Component({ onButtonClick }) { const handleClick = useCallback(() => { onButtonClick('clicked') }, [onButtonClick]) return <button onClick={handleClick}>Click</button> }
虚拟列表
对于长列表,使用虚拟列表技术减少 DOM 节点数量:
jsx
import React from 'react'
import { VirtualList } from 'taro-ui'
function LongList({ data }) {
return (
<VirtualList
height={500}
itemHeight={100}
data={data}
renderItem={({ item, index }) => (
<View key={index} className="item">
<Text>{item.title}</Text>
</View>
)}
/>
)
}防抖和节流
防抖:对于频繁触发的事件,使用防抖减少函数调用次数
javascriptfunction debounce(func, wait) { let timeout return function() { const context = this const args = arguments clearTimeout(timeout) timeout = setTimeout(() => { func.apply(context, args) }, wait) } } const debouncedSearch = debounce((keyword) => { console.log('Search:', keyword) }, 300)节流:对于持续触发的事件,使用节流控制函数调用频率
javascriptfunction throttle(func, wait) { let lastTime = 0 return function() { const now = Date.now() if (now - lastTime >= wait) { func.apply(this, arguments) lastTime = now } } } const throttledScroll = throttle(() => { console.log('Scroll position:', window.scrollY) }, 100)
网络优化
网络请求优化
合并请求:将多个小请求合并为一个大请求,减少网络请求次数
缓存请求:对于相同的请求,使用缓存避免重复请求
使用 HTTP/2:使用 HTTP/2 协议,支持多路复用,减少网络延迟
使用 CDN:使用 CDN 加速静态资源的加载
图片优化
图片压缩:使用压缩工具压缩图片,减少图片大小
图片格式:使用合适的图片格式,如 WebP、AVIF 等
图片懒加载:对于不在视口中的图片,使用懒加载减少初始加载时间
jsximport React, { useState, useEffect, useRef } from 'react' function LazyImage({ src, alt }) { const [isLoaded, setIsLoaded] = useState(false) const imgRef = useRef(null) useEffect(() => { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { setIsLoaded(true) observer.unobserve(entry.target) } }) }) if (imgRef.current) { observer.observe(imgRef.current) } return () => { if (imgRef.current) { observer.unobserve(imgRef.current) } } }, []) return ( <div ref={imgRef} className="lazy-image"> {!isLoaded && <div className="placeholder">Loading...</div>} {isLoaded && <img src={src} alt={alt} />} </div> ) }响应式图片:根据设备尺寸使用不同大小的图片
html<picture> <source media="(max-width: 768px)" srcset="small.jpg"> <source media="(max-width: 1200px)" srcset="medium.jpg"> <img src="large.jpg" alt="Image"> </picture>
资源加载优化
预加载:对于关键资源,使用预加载提前加载
html<link rel="preload" href="main.css" as="style"> <link rel="preload" href="main.js" as="script">预连接:对于需要连接的域名,使用预连接提前建立连接
html<link rel="preconnect" href="https://api.example.com">预获取:对于可能需要的资源,使用预获取提前加载
html<link rel="prefetch" href="next-page.js">
存储优化
本地存储
合理使用本地存储:对于频繁访问的数据,使用本地存储减少网络请求
存储容量控制:注意不同平台的存储容量限制,避免存储过多数据
存储加密:对于敏感数据,使用加密存储提高安全性
缓存策略
浏览器缓存:使用 HTTP 缓存头控制浏览器缓存
Service Worker 缓存:使用 Service Worker 缓存静态资源,实现离线访问
内存缓存:对于频繁访问的数据,使用内存缓存提高访问速度
小程序优化
小程序包大小
代码分割:使用 subPackages 分割代码,减少主包大小
资源压缩:压缩图片、JS、CSS 等资源,减少包大小
移除无用代码:使用 Tree Shaking 移除无用代码,减少包大小
小程序渲染性能
减少 WXML 节点数量:优化 WXML 结构,减少节点数量
减少 setData 调用:合并 setData 调用,减少渲染次数
使用自定义组件:将复杂的页面拆分为自定义组件,提高渲染性能
使用 virtual-list:对于长列表,使用 virtual-list 减少 DOM 节点数量
小程序启动性能
预加载:使用小程序的预加载功能,提前加载页面
减少启动时的网络请求:将启动时的网络请求移到后台,提高启动速度
使用骨架屏:使用骨架屏提升用户体验,减少启动时的白屏时间
H5 优化
H5 首屏加载
SSR:使用服务端渲染,减少客户端渲染时间
预渲染:使用预渲染,生成静态 HTML,减少客户端渲染时间
代码分割:使用代码分割,减少初始加载时间
资源压缩:压缩静态资源,减少加载时间
H5 性能监控
Performance API:使用 Performance API 监控页面性能
javascript// 监控页面加载时间 const loadTime = performance.timing.loadEventEnd - performance.timing.navigationStart console.log('Page load time:', loadTime)用户体验监控:监控用户交互响应时间,提高用户体验
错误监控:监控页面错误,及时发现和修复问题
React Native 优化
React Native 性能
使用 FlatList:对于长列表,使用 FlatList 提高渲染性能
使用 memo:对于纯展示组件,使用 memo 减少不必要的渲染
使用 useCallback 和 useMemo:缓存函数和计算结果,减少渲染次数
避免使用内联样式:使用 StyleSheet.create 创建样式,提高渲染性能
使用 Hermes:启用 Hermes 引擎,提高 JavaScript 执行性能
React Native 打包优化
代码分割:使用代码分割,减少初始包大小
资源压缩:压缩图片、JS 等资源,减少包大小
使用 App Bundle:使用 App Bundle 格式,减少安装包大小
性能测试工具
Lighthouse
Lighthouse 是 Google 提供的网页性能测试工具,可以测试页面的性能、可访问性、最佳实践等:
性能指标:加载时间、首次内容绘制、可交互时间等
可访问性:页面的可访问性评分
最佳实践:是否遵循 Web 最佳实践
SEO:页面的 SEO 评分
WebPageTest
WebPageTest 是一个在线的网页性能测试工具,可以测试页面在不同设备和网络条件下的性能:
加载时间:页面的加载时间
资源分析:分析页面的资源加载情况
瀑布图:展示资源加载的顺序和时间
性能评分:页面的性能评分
Taro 性能分析
Taro 提供了性能分析工具,可以分析应用的性能:
构建分析:分析构建产物的大小和组成
运行时分析:分析应用运行时的性能
网络分析:分析网络请求的性能
性能优化最佳实践
性能预算:设定性能预算,监控性能指标
持续优化:定期进行性能测试和优化
用户体验:关注用户体验,优化关键路径
数据驱动:基于数据进行性能优化,避免盲目优化
团队协作:建立性能优化的团队规范,共同提高应用性能
文档记录:记录性能优化的过程和结果,便于后续参考
监控告警:建立性能监控告警机制,及时发现性能问题
优化迭代:持续迭代性能优化,不断提高应用性能