一、项目背景与性能瓶颈分析
1.1 Tume平台特点
Tume(假设为新兴跨境电商平台)具有以下技术特征:
- 新兴平台:技术架构相对现代,但优化经验不足
- 全球化运营:覆盖欧美、东南亚、中东等地区
- 移动端优先:85%+流量来自手机,对性能要求极高
- 社交电商属性:直播带货、短视频展示、社区互动
- AI推荐:智能商品推荐和个性化内容
- 实时交互:直播聊天、即时客服、动态价格
1.2 优化前性能数据
// 移动端Lighthouse检测结果
const beforeOptimization = {
// 核心Web指标
"First Contentful Paint (FCP)": "3.2s", // 首次内容绘制
"Largest Contentful Paint (LCP)": "7.5s", // 最大内容绘制
"Cumulative Layout Shift (CLS)": "0.28", // 累计布局偏移
"First Input Delay (FID)": "180ms", // 首次输入延迟
// 加载指标
"Time to First Byte (TTFB)": "1.2s", // 首字节时间
"DOM Content Loaded": "2.8s", // DOM加载完成
"Full Load Time": "11.2s", // 完全加载
// 资源分析
"Total Requests": 145, // 总请求数
"Total Size": "16.8MB", // 总资源大小
"Images": {
"count": 75, // 图片数量
"size": "12.4MB", // 图片总大小
"largest": "3.2MB" // 最大单图
},
"Third-party Scripts": 25, // 第三方脚本
"JavaScript Size": "2.8MB" // JS总大小
};1.3 主要性能瓶颈
- 图片未优化:高清图片直接加载,缺乏懒加载
- 第三方脚本阻塞:AI推荐、直播、社交插件影响首屏
- 资源未压缩:CSS/JS未有效压缩和tree shaking
- 缓存策略缺失:静态资源未有效缓存
- 实时功能过载:直播和聊天功能消耗过多资源
二、核心优化方案
2.1 现代图片优化策略
2.1.1 智能图片格式与响应式适配
// utils/tumeImageOptimizer.js
class TumeImageOptimizer {
/**
* Tume智能图片优化器
*/
static getOptimizedImageUrl(originalUrl, options = {}) {
const {
width,
height,
quality = 80,
format = 'auto',
deviceType = 'mobile'
} = options;
if (!originalUrl) return originalUrl;
// 构建优化参数
const params = [];
// 尺寸优化
if (width) params.push(`w_${width}`);
if (height) params.push(`h_${height}`);
// 质量优化
params.push(`q_${quality}`);
// 格式优化
const finalFormat = format === 'auto' ? this.getBestFormat() : format;
params.push(`f_${finalFormat}`);
// 渐进式加载
params.push('p_progressive');
// 设备特定优化
if (deviceType === 'mobile') {
params.push('s_sharpen_5'); // 移动端适度锐化
}
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
// 构建优化URL
if (originalUrl.includes('?')) {
return `${originalUrl}&x-oss-process=image/${params.join(',')}`;
} else {
return `${originalUrl}?x-oss-process=image/${params.join(',')}`;
}
}
/**
* 获取最佳图片格式
*/
static getBestFormat() {
if (typeof window === 'undefined') return 'webp';
// 检测浏览器支持
if (this.supportsAVIF()) return 'avif';
if (this.supportsWebP()) return 'webp';
return 'jpg';
}
/**
* 生成响应式srcset
*/
static generateSrcSet(originalUrl, breakpoints = [320, 480, 640, 768, 1024, 1280, 1920]) {
return breakpoints.map(width => {
const optimizedUrl = this.getOptimizedImageUrl(originalUrl, { width });
return `${optimizedUrl} ${width}w`;
}).join(', ');
}
/**
* 检测AVIF支持
*/
static supportsAVIF() {
if (typeof window === 'undefined') return false;
return new Promise((resolve) => {
const avif = new Image();
avif.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABoAAAAoaWluZgAAAAAAAQAAAAAAAGF2Y2MAAAAAAAALAAAAAChpc3AAAAAAABCAAAAAgGlkZAAAAABMIW1kYXQrA0UvL0UgZGF0YQ==';
avif.onload = () => resolve(true);
avif.onerror = () => resolve(false);
});
}
/**
* 检测WebP支持
*/
static supportsWebP() {
if (typeof window === 'undefined') return false;
const canvas = document.createElement('canvas');
if (canvas.getContext && canvas.getContext('2d')) {
return canvas.toDataURL('image/webp').indexOf('data:image/webp') === 0;
}
return false;
}
}2.1.2 现代懒加载组件
// components/TumeLazyImage.jsx
import React, { useState, useRef, useEffect, useCallback } from 'react';
import { Skeleton } from 'antd-mobile';
import { TumeImageOptimizer } from '../utils/tumeImageOptimizer';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
const TumeLazyImage = ({
src,
alt,
width = '100%',
height = 'auto',
className = '',
threshold = 0.1,
eager = false,
priority = false,
placeholder = '/images/tume-placeholder.png',
...props
}) => {
const [isInView, setIsInView] = useState(eager);
const [isLoaded, setIsLoaded] = useState(false);
const [imageError, setImageError] = useState(false);
const imgRef = useRef();
const observerRef = useRef();
// 优化图片URL
const optimizedSrc = TumeImageOptimizer.getOptimizedImageUrl(src, { width });
const srcSet = TumeImageOptimizer.generateSrcSet(src);
// Intersection Observer监听
useEffect(() => {
if (eager) {
setIsInView(true);
return;
}
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setIsInView(true);
observer.unobserve(imgRef.current);
}
},
{
threshold,
rootMargin: '150px 0px 150px 0px' // 提前150px开始加载
}
);
if (imgRef.current) {
observer.observe(imgRef.current);
observerRef.current = observer;
}
return () => {
if (observerRef.current) {
observerRef.current.disconnect();
}
};
}, [threshold, eager]);
const handleImageLoad = useCallback(() => {
setIsLoaded(true);
}, []);
const handleImageError = useCallback(() => {
setImageError(true);
}, []);
return (
<div
ref={imgRef}
className={`tume-lazy-image ${className}`}
style={{ width, height, position: 'relative' }}
>
{/* 现代骨架屏 */}
{!isLoaded && (
<Skeleton
animated
style={{
width: '100%',
height: '100%',
borderRadius: '12px',
background: 'linear-gradient(90deg, #f6f6f6 25%, #f0f0f0 50%, #f6f6f6 75%)'
}}
/>
)}
{/* 实际图片 */}
{isInView && (
<img
src={imageError ? placeholder : optimizedSrc}
srcSet={srcSet}
alt={alt}
width={width}
height={height}
loading={eager ? 'eager' : 'lazy'}
onLoad={handleImageLoad}
onError={handleImageError}
style={{
opacity: isLoaded ? 1 : 0,
transition: 'opacity 0.4s ease-in-out',
width: '100%',
height: '100%',
objectFit: 'cover',
borderRadius: '12px'
}}
{...props}
/>
)}
</div>
);
};
export default TumeLazyImage;2.1.3 商品详情页图片优化
// pages/TumeProductDetail.jsx
import React, { useState, useEffect } from 'react';
import TumeLazyImage from '../components/TumeLazyImage';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
const TumeProductDetail = ({ product }) => {
const [visibleImages, setVisibleImages] = useState(new Set());
// 分批加载图片
useEffect(() => {
const timer = setTimeout(() => {
// 首屏加载前10张图片
const initialImages = product.images.slice(0, 10);
setVisibleImages(new Set(initialImages));
}, 50);
return () => clearTimeout(timer);
}, [product.images]);
return (
<div className="tume-product-detail">
{/* 主图区域 - 立即加载 */}
<div className="product-main-images">
{product.images.slice(0, 5).map((image, index) => (
<TumeLazyImage
key={`main-${index}`}
src={image}
alt={`${product.title} ${index + 1}`}
width={600}
height={600}
eager={true}
priority={index === 0}
/>
))}
</div>
{/* 商品信息 */}
<div className="product-info">
<h1 className="product-title">{product.title}</h1>
<div className="product-price">${product.price}</div>
<div className="product-sales">{product.sold} sold</div>
<div className="product-rating">⭐ {product.rating} ({product.reviews})</div>
</div>
{/* 详情图区域 - 懒加载 */}
<div className="product-description">
{product.images.slice(5).map((image, index) => (
<TumeLazyImage
key={`desc-${index}`}
src={image}
alt={`详情图 ${index + 1}`}
width="100%"
height="auto"
threshold={0.05}
/>
))}
</div>
{/* 推荐商品 */}
<div className="recommend-products">
<h3>You may also like</h3>
{product.recommendations.slice(0, 6).map((item, index) => (
<div key={item.id} className="recommend-item">
<TumeLazyImage
src={item.image}
alt={item.title}
width={100}
height={100}
/>
<span className="recommend-title">{item.title}</span>
</div>
))}
</div>
</div>
);
};2.2 第三方脚本优化
2.2.1 智能脚本加载管理
// utils/tumeScriptOptimizer.js
class TumeScriptOptimizer {
/**
* Tume第三方脚本优化
*/
static optimizeScripts() {
// 立即加载核心脚本
this.loadCriticalScripts();
// 延迟加载非关键脚本
setTimeout(() => {
this.loadNonCriticalScripts();
}, 3000);
// 按需加载功能脚本
this.loadOnDemandScripts();
}
/**
* 加载核心脚本
*/
static loadCriticalScripts() {
// Tume核心功能
this.loadScript('/static/js/tume-core.js', { priority: 'high' });
// 关键CSS
this.loadCSS('/static/css/tume-critical.css');
// 字体文件
this.loadFont('/static/fonts/tume-icon.woff2');
}
/**
* 加载非关键脚本
*/
static loadNonCriticalScripts() {
// AI推荐脚本
this.loadScript('/static/js/tume-recommend.js', { priority: 'low' });
// 统计脚本
this.loadScript('/static/js/tume-analytics.js', { priority: 'low' });
// 社交分享脚本
this.loadScript('/static/js/tume-share.js', { priority: 'low' });
}
/**
* 按需加载脚本
*/
static loadOnDemandScripts() {
// 用户点击直播时加载直播脚本
document.addEventListener('click', (e) => {
if (e.target.closest('.live-button')) {
this.loadScript('/static/js/tume-live.js', { priority: 'medium' });
}
});
// 用户点击聊天时加载聊天脚本
document.addEventListener('click', (e) => {
if (e.target.closest('.chat-button')) {
this.loadScript('/static/js/tume-chat.js', { priority: 'medium' });
}
});
}
/**
* 智能脚本加载
*/
static loadScript(url, options = {}) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.async = options.async !== false;
script.defer = options.defer !== false;
if (options.id) {
script.id = options.id;
}
script.onload = resolve;
script.onerror = reject;
// 根据优先级设置加载时机
if (options.priority === 'low') {
// 空闲时加载
if ('requestIdleCallback' in window) {
requestIdleCallback(() => {
document.head.appendChild(script);
}, { timeout: 10000 });
} else {
setTimeout(() => {
document.head.appendChild(script);
}, 5000);
}
} else {
// 高优先级立即加载
document.head.appendChild(script);
}
});
}
/**
* 加载CSS
*/
static loadCSS(url) {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = url;
document.head.appendChild(link);
}
/**
* 加载字体
*/
static loadFont(url) {
const link = document.createElement('link');
link.rel = 'preload';
link.href = url;
link.as = 'font';
link.type = 'font/woff2';
link.crossOrigin = 'anonymous';
document.head.appendChild(link);
}
}2.3 资源压缩与Tree Shaking
2.3.1 Webpack优化配置
// webpack.config.js
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
module.exports = {
mode: 'production',
entry: {
main: './src/index.js',
vendor: ['react', 'react-dom']
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash:8].js',
chunkFilename: '[name].[contenthash:8].chunk.js',
clean: true
},
optimization: {
minimize: true,
minimizer: [
// JavaScript压缩
new TerserPlugin({
parallel: true,
terserOptions: {
parse: { ecma: 8 },
compress: {
ecma: 5,
warnings: false,
comparisons: false,
inline: 2
},
mangle: { safari10: true },
output: {
ecma: 5,
comments: false,
ascii_only: true
}
}
}),
// CSS压缩
new CssMinimizerPlugin(),
// 图片压缩
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminMinify,
options: {
plugins: [
['imagemin-mozjpeg', { quality: 80 }],
['imagemin-pngquant', { quality: [0.65, 0.9] }],
['imagemin-svgo', {}]
]
}
}
})
],
// 代码分割
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
name: 'vendors',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'all'
},
commons: {
name: 'commons',
minChunks: 2,
priority: 5,
chunks: 'all'
}
}
},
// Tree Shaking
usedExports: true,
sideEffects: false
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', { targets: '> 0.25%, not dead' }],
['@babel/preset-react', { runtime: 'automatic' }]
],
plugins: ['@babel/plugin-syntax-import-attributes']
}
}
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
},
{
test: /\.(png|jpe?g|gif|svg|webp)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 8 * 1024
}
},
generator: {
filename: 'static/images/[name].[hash:8][ext]'
}
}
]
}
};2.4 缓存与CDN优化
2.4.1 现代缓存策略
// utils/tumeCacheManager.js
class TumeCacheManager {
/**
* Tume缓存管理器
*/
static initCacheStrategies() {
// Service Worker缓存
this.registerServiceWorker();
// HTTP缓存头设置
this.setCacheHeaders();
// 资源预加载
this.preloadCriticalResources();
}
/**
* 注册Service Worker
*/
static registerServiceWorker() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW registered: ', registration);
})
.catch(registrationError => {
console.log('SW registration failed: ', registrationError);
});
}
}
/**
* 设置缓存头
*/
static setCacheHeaders() {
// 通过meta标签设置缓存策略
const meta = document.createElement('meta');
meta.httpEquiv = 'Cache-Control';
meta.content = 'public, max-age=31536000, immutable';
document.head.appendChild(meta);
}
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
/**
* 预加载关键资源
*/
static preloadCriticalResources() {
// 预加载关键CSS
const cssLink = document.createElement('link');
cssLink.rel = 'preload';
cssLink.href = '/static/css/tume-critical.css';
cssLink.as = 'style';
document.head.appendChild(cssLink);
// 预加载关键字体
const fontLink = document.createElement('link');
fontLink.rel = 'preload';
fontLink.href = '/static/fonts/tume-icon.woff2';
fontLink.as = 'font';
fontLink.type = 'font/woff2';
fontLink.crossOrigin = 'anonymous';
document.head.appendChild(fontLink);
// 预加载首屏图片
const firstImage = document.querySelector('.product-main-images img');
if (firstImage) {
const imgLink = document.createElement('link');
imgLink.rel = 'preload';
imgLink.href = firstImage.src;
imgLink.as = 'image';
document.head.appendChild(imgLink);
}
}
}2.4.2 Service Worker配置
// public/sw.js
const CACHE_NAME = 'tume-v1';
const urlsToCache = [
'/',
'/static/css/tume-critical.css',
'/static/js/tume-core.js',
'/static/fonts/tume-icon.woff2',
'/images/tume-placeholder.png'
];
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => cache.addAll(urlsToCache))
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then((response) => {
// 缓存命中
if (response) {
return response;
}
// 网络请求
return fetch(event.request)
.then((response) => {
// 只缓存成功的响应
if (response.status === 200) {
const responseToCache = response.clone();
caches.open(CACHE_NAME)
.then((cache) => {
cache.put(event.request, responseToCache);
});
}
return response;
})
.catch(() => {
// 网络失败返回占位图
if (event.request.destination === 'image') {
return caches.match('/images/tume-placeholder.png');
}
});
})
);
});三、性能优化效果验证
3.1 优化后性能数据
// 优化前后性能对比
const performanceComparison = {
before: {
FCP: '3.2s',
LCP: '7.5s',
CLS: '0.28',
FID: '180ms',
TTFB: '1.2s',
TotalRequests: 145,
TotalSize: '16.8MB',
Images: { count: 75, size: '12.4MB' }
},
after: {
FCP: '1.3s', // 提升59.4%
LCP: '3.1s', // 提升58.7%
CLS: '0.09', // 提升67.9%
FID: '60ms', // 提升66.7%
TTFB: '0.6s', // 提升50.0%
TotalRequests: 68, // 减少53.1%
TotalSize: '6.8MB', // 提升59.5%
Images: { count: 35, size: '4.9MB' } // 图片减少53.3%
}
};3.2 图片优化效果
const imageOptimizationResults = { // 图片数量优化
count: { before: 75, after: 35, reduction: '53.3%'
},
// 图片大小优化
size: { before: '12.4MB', after: '4.9MB', reduction: '60.5%'
},
// 格式分布
formatDistribution: { before: { jpg: '82%', png: '15%', gif: '3%' }, after: { avif: '30%', webp: '50%', jpg: '20%' } // 现代格式
},
// 加载时间
loadTime: { before: '8.2s', after: '3.4s', improvement: '58.5%'
}
};3.3 脚本优化效果
const scriptOptimizationResults = { // 脚本数量
count: { before: 25, after: 12, reduction: '52.0%'
},
// 加载时间
loadTime: { before: '4.5s', after: '1.8s', improvement: '60.0%'
},
// 主线程阻塞时间
mainThreadBlock: { before: '2.8s', after: '0.9s', improvement: '67.9%'
}
};3.4 性能监控脚本
// utils/tumePerformanceMonitor.jsclass TumePerformanceMonitor { constructor() { this.metrics = {}; this.startTime = Date.now();
}
// 记录Tume特有指标
recordTumeMetrics() { if (window.performance && window.performance.timing) { const timing = window.performance.timing;
this.metrics = { // 核心Web指标
FCP: this.getFCP(), LCP: this.getLCP(), CLS: this.getCLS(), FID: this.getFID(), TTFB: timing.responseStart - timing.requestStart,
// Tume特有指标
tumeSpecific: { imageLoadComplete: this.getImageLoadTime(), recommendationReady: this.getRecommendationReadyTime(), liveStreamReady: this.getLiveStreamReadyTime(), chatReady: this.getChatReadyTime()
},
// 资源统计
resources: this.getResourceStats(), cacheHitRate: this.getCacheHitRate()
};
}
}
// 获取图片加载时间
getImageLoadTime() { const images = performance.getEntriesByType('resource')
.filter(r => r.initiatorType === 'img');
if (images.length === 0) return 0;
return Math.max(...images.map(img => img.responseEnd));
}
// 获取推荐就绪时间
getRecommendationReadyTime() { if (window.TumeRecommendations) { return window.TumeRecommendations.readyTime || 0;
} return 0;
}
// 获取直播就绪时间
getLiveStreamReadyTime() { if (window.TumeLive) { return window.TumeLive.readyTime || 0;
} return 0;
}
// 获取聊天就绪时间
getChatReadyTime() { if (window.TumeChat) { return window.TumeChat.readyTime || 0;
} return 0;
}
// 获取资源统计
getResourceStats() { const resources = performance.getEntriesByType('resource'); const images = resources.filter(r => r.initiatorType === 'img'); const scripts = resources.filter(r => r.initiatorType === 'script');
return { total: resources.length, images: images.length, scripts: scripts.length, imageSize: images.reduce((sum, r) => sum + r.transferSize, 0), scriptSize: scripts.reduce((sum, r) => sum + r.transferSize, 0)
};
}
// 上报性能数据
reportMetrics() { fetch('/api/performance', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(this.metrics)
});
}
}四、最佳实践总结
4.1 现代优化策略
4.1.1 图片优化策略
const tumeImageStrategies = { // 1. 现代格式优先
formatPriority: { avif: true, webp: true, quality: 80, progressive: true
},
// 2. 智能懒加载
lazyLoading: { enabled: true, threshold: 0.1, preloadMargin: 150, batchSize: 10
},
// 3. 响应式适配
responsiveImages: { enabled: true, breakpoints: [320, 480, 640, 768, 1024, 1280, 1920], srcset: true
}
};4.1.2 脚本优化策略
const tumeScriptStrategies = { // 1. 按需加载
onDemandLoading: { live: '点击时加载', chat: '点击时加载', recommendations: '空闲时加载'
},
// 2. 优先级管理
priorityManagement: { high: ['核心功能', '关键CSS'], medium: ['支付', '购物车'], low: ['推荐', '统计', '社交']
},
// 3. 资源限制
resourceLimits: { maxScriptSize: '2MB', maxImageSize: '1MB', maxTotalSize: '8MB'
}
};4.2 优化检查清单
- [ ] 现代图片格式支持
- [ ] 智能懒加载实现
- [ ] 第三方脚本按需加载
- [ ] 资源压缩和Tree Shaking
- [ ] Service Worker缓存
- [ ] 性能监控部署
- [ ] 核心Web指标优化
- [ ] 用户体验测试
4.3 业务收益
const businessBenefits = { // 用户体验提升
userExperience: { bounceRate: '降低42%', conversionRate: '提升28%', pageViews: '增加45%', sessionDuration: '增加60%'
},
// 技术指标提升
technicalMetrics: { FCP: '提升59%', LCP: '提升59%', CLS: '提升68%', mobileScore: '从65提升到92'
},
// 业务指标提升
businessMetrics: { orders: '增加30%', revenue: '增长25%', customerSatisfaction: '提升35%', appDownloads: '增加40%'
}
};五、总结
5.1 核心优化成果
通过现代前端优化技术,我们实现了:
- 加载速度提升59%:LCP从7.5s降至3.1s
- 资源体积减少60%:总资源从16.8MB降至6.8MB
- 用户体验显著改善:CLS从0.28降至0.09
- 业务指标全面提升:转化率提升28%,订单量增加30%
5.2 现代优化技术亮点
- AVIF/WebP格式:采用最新图片格式,大幅减小体积
- 智能懒加载:基于Intersection Observer的精确控制
- 按需脚本加载:功能按需加载,减少初始负担
- Tree Shaking:消除未使用代码,减小包体积
- Service Worker:离线缓存和资源预加载
5.3 后续优化方向
- 边缘计算:将部分计算逻辑移至CDN边缘
- AI图片优化:基于内容智能压缩图片
- 预测性预加载:基于用户行为预测加载资源
- Web Vitals监控:实时性能监控和预警
- PWA增强:离线访问和推送通知
通过本实战指南,你可以:
- ✅ 掌握新兴电商平台性能瓶颈分析方法
- ✅ 实现现代图片优化方案
- ✅ 配置智能脚本加载策略
- ✅ 优化资源压缩和缓存
- ✅ 建立完整的性能监控体系
- ✅ 显著提升用户体验和业务转化率