网盘可以做网站空间吗,wordpress 百度经验主题,济南做网站公司电话,刷q币网站建设React Native 性能优化实践
React Native 是一个强大的跨平台移动应用开发框架#xff0c;但性能优化是确保应用流畅运行和提供良好用户体验的关键。本文将深入探讨如何优化 React Native 应用的性能#xff0c;涵盖以下四个方面#xff1a;
启动速度优化#xff1a;通过…React Native 性能优化实践
React Native 是一个强大的跨平台移动应用开发框架但性能优化是确保应用流畅运行和提供良好用户体验的关键。本文将深入探讨如何优化 React Native 应用的性能涵盖以下四个方面
启动速度优化通过启用 Hermes 引擎和利用 Fast Refresh 提升开发效率。渲染优化使用 FlatList、React.memo 和 shouldComponentUpdate 减少不必要的重新渲染。图片优化通过选择合适的图片格式、实现懒加载和使用 SVG 图像提升性能。本地存储优化使用 react-native-mmkv 替代 AsyncStorage以获得更快的读写速度。
以下是这些优化技术的简要概述和实现方法适合初学者和有经验的开发者。
关键要点
Hermes 提升启动速度Hermes 是一个为 React Native 优化的 JavaScript 引擎可显著减少应用启动时间和内存使用。Fast Refresh 优化开发Fast Refresh 提供近乎即时的代码更新反馈增强开发体验但不直接影响运行时性能。高效列表渲染FlatList 通过虚拟化技术优化大型列表的渲染减少内存占用和提高滚动流畅性。减少重新渲染React.memo 和 shouldComponentUpdate 帮助避免不必要的组件渲染提升性能。图片优化策略使用压缩图片、懒加载和 SVG 图像可减少加载时间和内存消耗。快速存储方案react-native-mmkv 提供比 AsyncStorage 快约 30 倍的性能适合高性能存储需求。
启动速度优化
Hermes 是一个开源 JavaScript 引擎专为 React Native 设计通过提前编译AOT生成高效字节码减少应用启动时间。自 React Native 0.70 起Hermes 默认启用无需额外配置。您可以通过检查 global.HermesInternal 确认是否启用 Hermes。Fast Refresh 则是一个开发工具允许在代码更改时快速更新界面而不丢失组件状态显著提高开发效率。
渲染优化
FlatList 是 React Native 中用于高效渲染列表的组件通过仅渲染可见区域的项来优化性能。关键优化包括避免内联函数、使用 getItemLayout 设置固定高度以及调整 initialNumToRender 和 windowSize 等属性。React.memo 可用于函数组件防止 props 未更改时的重新渲染。类组件则可以通过实现 shouldComponentUpdate 控制渲染行为。
图片优化
优化图片涉及选择合适的格式如 JPEG 或 PNG、压缩图片大小以及使用 react-native-fast-image 进行高效缓存。懒加载通过仅加载屏幕可见区域的图片来减少初始加载时间。SVG 图像因其矢量特性在不同分辨率下保持清晰且文件大小较小适合图标和简单图形。
本地存储优化
AsyncStorage 是 React Native 的内置存储方案但对于大型数据集性能较差。react-native-mmkv 是一个高性能替代方案利用 C 和 JSI 提供约 30 倍于 AsyncStorage 的读写速度适合存储用户数据、设置或缓存。
下一步
通过本文的代码示例您可以开始在 React Native 项目中应用这些优化技术。建议尝试优化一个包含列表和图片的应用并使用 react-native-mmkv 替换 AsyncStorage以体验性能提升。 React Native 是一个功能强大的跨平台移动应用开发框架允许开发者使用 JavaScript 和 React 构建同时运行在 iOS 和 Android 上的应用。然而随着应用复杂度的增加性能问题可能成为用户体验的瓶颈例如启动时间过长、列表滚动卡顿或图片加载缓慢。本文将深入探讨 React Native 应用的性能优化实践涵盖启动速度优化Hermes 和 Fast Refresh、渲染优化FlatList、React.memo 和 shouldComponentUpdate、图片优化包括懒加载和 SVG 使用以及本地存储优化使用 react-native-mmkv 替代 AsyncStorage。通过详细的代码示例和最佳实践您将能够显著提升 React Native 应用的性能打造流畅、专业的用户体验。
1. 引言React Native 性能优化的重要性
性能优化是 React Native 开发中的关键环节直接影响应用的启动速度、界面流畅性和用户满意度。在移动设备上资源如内存和 CPU有限优化不仅能提升用户体验还能减少电量消耗和崩溃风险。本文将重点探讨以下四个优化领域
启动速度优化通过 Hermes 引擎和 Fast Refresh 提升应用启动速度和开发效率。渲染优化利用 FlatList、React.memo 和 shouldComponentUpdate 减少不必要的重新渲染。图片优化通过选择合适的图片格式、实现懒加载和使用 SVG 图像优化加载时间。本地存储优化使用 react-native-mmkv 替代 AsyncStorage提供更快的读写性能。
这些优化技术适用于从简单应用到复杂企业级项目的各种场景。无论您是初学者还是有经验的开发者本文都将提供实用的指导和代码示例帮助您在 React Native 项目中实现高效性能。
2. 启动速度优化
启动速度是用户对应用的第一印象过长的启动时间可能导致用户流失。React Native 提供了 Hermes 引擎和 Fast Refresh 功能来优化启动性能和开发体验。
2.1 Hermes优化的 JavaScript 引擎
Hermes 是一个为 React Native 设计的开源 JavaScript 引擎通过提前编译AOT生成高效字节码显著提升应用性能。Hermes 的主要优势包括
更快的启动时间通过预编译 JavaScript 代码为字节码减少运行时解析开销。更低的内存使用优化内存分配适合资源受限的设备。更小的应用体积生成紧凑的字节码减少包大小。
自 React Native 0.70 起Hermes 默认启用无需额外配置。您可以通过以下代码检查 Hermes 是否启用
const isHermes () !!global.HermesInternal;
console.log(Hermes Enabled:, isHermes());2.1.1 启用 Hermes
如果您的项目使用的是旧版 React Native 0.70可以手动启用 Hermes
Android编辑 android/app/build.gradle设置
project.ext.react [enableHermes: true
]iOS编辑 ios/Podfile添加
use_react_native!(:path ../node_modules/react-native,:hermes_enabled true
)然后运行 cd ios pod install。
2.1.2 验证 Hermes 效果
要验证 Hermes 的性能提升建议在发布模式下构建应用并比较启动时间
npx react-native run-android --moderelease根据 React Native 文档Hermes 可将启动时间缩短 20%-50%具体取决于应用复杂度和设备性能。
2.1.3 注意事项
版本兼容性确保 Hermes 版本与 React Native 版本匹配避免崩溃。调试支持Hermes 支持 Flipper 和 React Native Debugger但某些高级调试功能可能受限。禁用 Hermes如果需要切换回 JavaScriptCore可将 hermesEnabled 设置为 false。
2.2 Fast Refresh提升开发效率
Fast Refresh 是 React Native 的开发工具允许在代码更改时快速更新界面而不丢失组件状态。它取代了旧的 Hot Reloading 和 Live Reloading提供更可靠的体验。
2.2.1 Fast Refresh 的工作原理
Fast Refresh 在以下情况下工作
组件更改编辑组件代码如样式、逻辑或事件处理时仅更新相关模块。非组件模块编辑非组件模块如工具函数时更新导入该模块的组件。错误恢复在出现语法错误时自动回退到完整重载。
Fast Refresh 默认启用可通过开发者菜单摇晃设备或运行 adb shell input keyevent 82切换“Enable Fast Refresh”。
2.2.2 示例
假设您有一个计数器组件
import React, { useState } from react;
import { View, Text, Button } from react-native;const Counter () {const [count, setCount] useState(0);return (ViewText计数: {count}/TextButton title增加 onPress{() setCount(count 1)} //View);
};export default Counter;更改 Text 的样式后Fast Refresh 会更新界面而 count 状态保持不变。
2.2.3 注意事项
开发环境Fast Refresh 仅影响开发体验不影响生产环境的启动速度。局限性不支持更改组件的导出结构如从默认导出改为命名导出。性能在大型项目中Fast Refresh 可能略微增加 Metro Bundler 的内存使用。
3. 渲染优化
渲染性能直接影响应用的流畅性尤其是在处理大型列表或复杂组件树时。以下是三种关键的渲染优化技术FlatList、React.memo 和 shouldComponentUpdate。
3.1 FlatList高效列表渲染
FlatList 是 React Native 中用于渲染大型列表的组件通过虚拟化技术仅渲染屏幕可见区域的项显著减少内存占用和提高滚动性能。
3.1.1 基本用法
以下是一个简单的 FlatList 示例
import React from react;
import { FlatList, Text, View, StyleSheet } from react-native;const data Array.from({ length: 100 }, (_, i) ({ id: i.toString(), title: 项目 ${i 1} }));const Item ({ title }) (View style{styles.item}Text{title}/Text/View
);const App () (FlatListdata{data}renderItem{({ item }) Item title{item.title} /}keyExtractor{(item) item.id}/
);const styles StyleSheet.create({item: {padding: 16,borderBottomWidth: 1,borderBottomColor: #ccc,},
});export default App;3.1.2 优化技巧
根据 React Native 文档以下是优化 FlatList 的关键属性
属性描述推荐值getItemLayout指定项的高度跳过动态计算{ length: 50, offset: 50 * index, index }initialNumToRender初始渲染的项数10视屏幕大小调整maxToRenderPerBatch每次渲染的最大项数10windowSize渲染窗口大小以视口高度为单位21默认值通常无需调整removeClippedSubviews移除视口外的视图true
示例优化 FlatList
const App () (FlatListdata{data}renderItem{({ item }) Item title{item.title} /}keyExtractor{(item) item.id}getItemLayout{(data, index) ({length: 50,offset: 50 * index,index,})}initialNumToRender{10}maxToRenderPerBatch{10}windowSize{21}removeClippedSubviews{true}/
);3.1.3 避免内联函数
内联函数如 renderItem{({ item }) Item title{item.title} /}会在每次渲染时重新创建导致性能下降。使用 useCallback 优化
import React, { useCallback } from react;const App () {const renderItem useCallback(({ item }) Item title{item.title} /, []);return (FlatListdata{data}renderItem{renderItem}keyExtractor{(item) item.id}/);
};3.1.4 最佳实践
固定高度为列表项设置固定高度使用 getItemLayout。避免复杂逻辑在 renderItem 中避免昂贵的计算使用 useMemo。优化项组件确保 Item 组件使用 React.memo见下文。
3.2 React.memo优化函数组件
React.memo 是一个高阶组件用于包装函数组件防止 props 未更改时的重新渲染。
3.2.1 示例
import React, { memo } from react;
import { View, Text } from react-native;const Item memo(({ title }) {console.log(渲染 Item:, title);return (View style{styles.item}Text{title}/Text/View);
});const App () {const [count, setCount] useState(0);return (ViewText计数: {count}/TextButton title增加 onPress{() setCount(count 1)} /Item title静态项目 //View);
};说明当 count 更新时Item 不会重新渲染因为其 props 未更改。
3.2.2 自定义比较函数
默认情况下React.memo 使用浅比较。您可以提供自定义比较函数
const Item memo(({ title, id }) (View style{styles.item}Text{title}/Text/View
), (prevProps, nextProps) prevProps.id nextProps.id);3.2.3 注意事项
适用场景仅在组件频繁渲染且 props 很少变化时使用。避免滥用过多的 memo 可能增加内存开销。与 FlatList 结合在 FlatList 的 renderItem 中使用 memoized 组件。
3.3 shouldComponentUpdate优化类组件
在类组件中shouldComponentUpdate 允许开发者控制是否重新渲染。
3.3.1 示例
import React from react;
import { View, Text } from react-native;class Item extends React.Component {shouldComponentUpdate(nextProps) {return this.props.title ! nextProps.title;}render() {console.log(渲染 Item:, this.props.title);return (View style{styles.item}Text{this.props.title}/Text/View);}
}class App extends React.Component {state { count: 0 };render() {return (ViewText计数: {this.state.count}/TextButton title增加 onPress{() this.setState({ count: this.state.count 1 })} /Item title静态项目 //View);}
}说明当 count 更新时Item 不会重新渲染因为 title 未更改。
3.3.2 使用 PureComponent
React.PureComponent 自动实现浅比较的 shouldComponentUpdate
class Item extends React.PureComponent {render() {return (View style{styles.item}Text{this.props.title}/Text/View);}
}3.3.3 注意事项
适用场景类组件中 props 或 state 变化不频繁时。性能权衡自定义比较逻辑可能增加计算开销。现代趋势函数组件和 Hooks 更常见优先使用 React.memo。
4. 图片优化
图片是移动应用中常见的性能瓶颈。优化图片加载可以显著减少内存使用和加载时间。
4.1 选择合适的图片格式
JPEG适合照片压缩率高但不支持透明。PNG支持透明适合图标或需要高质量的图像。WebP结合 JPEG 和 PNG 的优点提供高质量和较小的文件大小。
推荐优先使用 WebP需在 Android 的 android/app/build.gradle 中启用支持
dependencies {implementation com.facebook.fresco:webpsupport:2.5.0
}4.2 压缩图片
压缩图片以减少文件大小
工具使用 ImageOptim 或 TinyPNG 压缩图片。建议保持图片大小低于 100KB适合移动设备。
4.3 使用 react-native-fast-image
react-native-fast-image 是一个高性能图片组件基于 SDWebImageiOS和 GlideAndroid。
安装
npm install react-native-fast-image
cd ios pod install示例
import FastImage from react-native-fast-image;const App () (FastImagestyle{{ width: 200, height: 200 }}source{{uri: https://example.com/image.jpg,priority: FastImage.priority.normal,}}resizeMode{FastImage.resizeMode.contain}/
);优势
高效缓存减少重复加载。支持优先级设置和预加载。减少闪烁和加载延迟。
4.4 懒加载图片
懒加载通过仅加载屏幕可见区域的图片来优化性能。结合 FlatList 实现
import React from react;
import { FlatList, View, Text } from react-native;
import FastImage from react-native-fast-image;const data Array.from({ length: 100 }, (_, i) ({id: i.toString(),uri: https://example.com/image${i}.jpg,
}));const ImageItem ({ uri }) (FastImagestyle{{ width: 100, height: 100, margin: 5 }}source{{ uri }}resizeMode{FastImage.resizeMode.cover}/
);const App () (FlatListdata{data}renderItem{({ item }) ImageItem uri{item.uri} /}keyExtractor{(item) item.id}initialNumToRender{5}/
);说明initialNumToRender{5} 限制初始加载的图片数量减少启动时的内存占用。
4.5 SVG 使用
SVG可缩放矢量图形适合图标和简单图形因其矢量特性在不同分辨率下保持清晰且文件大小较小。使用 react-native-svg
安装
npm install react-native-svg
cd ios pod install示例
import Svg, { Circle } from react-native-svg;const App () (Svg height100 width100Circle cx50 cy50 r45 fillblue //Svg
);优势
无需为不同分辨率提供多张图片。支持动态调整大小和颜色。文件大小小适合移动设备。
注意事项
复杂 SVG 可能增加解析开销。确保 SVG 文件经过优化如使用 SVGO。
5. 本地存储优化react-native-mmkv 替代 AsyncStorage
本地存储用于持久化数据如用户设置或缓存。AsyncStorage 是 React Native 的内置存储方案但性能较差尤其是在处理大型数据集时。react-native-mmkv 是一个高性能替代方案基于 WeChat 的 MMKV 框架。
5.1 AsyncStorage 的局限性
异步操作所有操作需使用 async/await增加代码复杂性。性能瓶颈读写速度慢处理大型数据时可能导致延迟。数据限制适合小型数据1MB不适合复杂对象。
5.2 react-native-mmkv 的优势
高性能约 30 倍于 AsyncStorage 的读写速度使用 C 和 JSIJavaScript Interface直接绑定。同步调用无需 async/await简化代码。加密支持提供安全存储选项适合敏感数据。多实例支持允许创建多个存储实例分离用户数据和全局数据。
5.3 安装与配置
安装
npm install react-native-mmkv
cd ios pod install对于 React Native 0.75需启用新架构Fabric。编辑 android/app/build.gradle
project.ext.react [enableNewArchitecture: true
]5.4 示例
以下是使用 react-native-mmkv 存储和检索数据的示例
import { MMKV } from react-native-mmkv;const storage new MMKV();const App () {// 存储数据storage.set(user, JSON.stringify({ name: 小明, id: 1 }));// 检索数据const user storage.getString(user);console.log(用户:, user ? JSON.parse(user) : null);// 删除数据storage.delete(user);return (ViewText使用 MMKV 存储/Text/View);
};5.5 迁移从 AsyncStorage
迁移步骤
安装 react-native-mmkv。将 AsyncStorage 的键值对迁移到 MMKV
import AsyncStorage from react-native-async-storage/async-storage;
import { MMKV } from react-native-mmkv;const storage new MMKV();const migrateData async () {try {const keys await AsyncStorage.getAllKeys();const items await AsyncStorage.multiGet(keys);items.forEach(([key, value]) {storage.set(key, value);});await AsyncStorage.clear();} catch (error) {console.error(迁移失败:, error);}
};更新代码将 AsyncStorage 调用替换为 MMKV。
5.6 最佳实践
选择性存储仅存储必要数据避免存储大型对象。加密敏感数据使用 MMKV 的加密功能存储令牌等敏感信息。调试支持结合 flipper-plugin-react-native-mmkv 调试存储。
6. 综合示例
以下是一个综合示例展示如何结合上述优化技术构建一个高效的 React Native 应用
import React, { memo, useState, useCallback } from react;
import { FlatList, View, Text, StyleSheet } from react-native;
import FastImage from react-native-fast-image;
import { MMKV } from react-native-mmkv;const storage new MMKV();const data Array.from({ length: 100 }, (_, i) ({id: i.toString(),title: 项目 ${i 1},image: https://example.com/image${i}.jpg,
}));const Item memo(({ title, image }) (View style{styles.item}FastImagestyle{styles.image}source{{ uri: image, priority: FastImage.priority.normal }}resizeMode{FastImage.resizeMode.cover}/Text{title}/Text/View
));const App () {const [cachedData, setCachedData] useState(null);const loadCachedData useCallback(() {const data storage.getString(data);if (data) {setCachedData(JSON.parse(data));}}, []);const renderItem useCallback(({ item }) (Item title{item.title} image{item.image} /), []);return (FlatListdata{data}renderItem{renderItem}keyExtractor{(item) item.id}getItemLayout{(data, index) ({length: 120,offset: 120 * index,index,})}initialNumToRender{5}maxToRenderPerBatch{10}removeClippedSubviews{true}/);
};const styles StyleSheet.create({item: {flexDirection: row,padding: 16,borderBottomWidth: 1,borderBottomColor: #ccc,},image: {width: 100,height: 100,marginRight: 10,},
});export default App;说明
使用 Hermes默认启用优化启动速度。FlatList 优化列表渲染结合 getItemLayout 和 initialNumToRender。Item 组件使用 React.memo 避免不必要渲染。使用 react-native-fast-image 优化图片加载。使用 MMKV 存储缓存数据。
7. 结论
React Native 性能优化是构建流畅、用户友好应用的关键。通过启用 Hermes 引擎您可以显著减少启动时间Fast Refresh 提升开发效率FlatList、React.memo 和 shouldComponentUpdate 优化渲染性能图片优化和懒加载减少加载时间react-native-mmkv 提供高效的本地存储。这些技术结合使用可以让您的应用在资源受限的移动设备上表现出色。
7.1 挑战与解决方案
挑战解决方案启动时间长启用 Hermes优化 JavaScript 代码列表滚动卡顿使用 FlatList设置 getItemLayout 和 initialNumToRender不必要重新渲染使用 React.memo 或 shouldComponentUpdate图片加载慢使用 react-native-fast-image实施懒加载和 SVG本地存储性能差替换 AsyncStorage 为 react-native-mmkv 文章转载自: http://www.morning.wqpr.cn.gov.cn.wqpr.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.kpgbz.cn.gov.cn.kpgbz.cn http://www.morning.mrfnj.cn.gov.cn.mrfnj.cn http://www.morning.ychrn.cn.gov.cn.ychrn.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn http://www.morning.swkpq.cn.gov.cn.swkpq.cn http://www.morning.lnbcg.cn.gov.cn.lnbcg.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.wqpb.cn.gov.cn.wqpb.cn http://www.morning.gbfzy.cn.gov.cn.gbfzy.cn http://www.morning.zlkps.cn.gov.cn.zlkps.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.kghhl.cn.gov.cn.kghhl.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.demoux.com.gov.cn.demoux.com http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.gfrtg.com.gov.cn.gfrtg.com http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.mxmdd.cn.gov.cn.mxmdd.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.qgwdc.cn.gov.cn.qgwdc.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn http://www.morning.smcfk.cn.gov.cn.smcfk.cn http://www.morning.frcxx.cn.gov.cn.frcxx.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.nhrkl.cn.gov.cn.nhrkl.cn http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.ldzxf.cn.gov.cn.ldzxf.cn http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.mpnff.cn.gov.cn.mpnff.cn http://www.morning.ndmh.cn.gov.cn.ndmh.cn http://www.morning.llyjx.cn.gov.cn.llyjx.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.nrjr.cn.gov.cn.nrjr.cn http://www.morning.yxmcx.cn.gov.cn.yxmcx.cn http://www.morning.bwfsn.cn.gov.cn.bwfsn.cn http://www.morning.lwtld.cn.gov.cn.lwtld.cn http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.lzqdd.cn.gov.cn.lzqdd.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.nlgmr.cn.gov.cn.nlgmr.cn http://www.morning.wphfl.cn.gov.cn.wphfl.cn http://www.morning.fdmtr.cn.gov.cn.fdmtr.cn http://www.morning.tclqf.cn.gov.cn.tclqf.cn http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn http://www.morning.cjcry.cn.gov.cn.cjcry.cn http://www.morning.mnkhk.cn.gov.cn.mnkhk.cn http://www.morning.wyrkp.cn.gov.cn.wyrkp.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.zgqysw.cn.gov.cn.zgqysw.cn http://www.morning.bwxph.cn.gov.cn.bwxph.cn