React Native 全栈开发实战班 - 项目最佳实践之模块化开发

模块化开发 是指将应用程序分解为独立、可重用的模块,每个模块负责特定的功能或业务逻辑。模块化开发有助于提高代码的可维护性、可扩展性和复用性,并使团队协作更加高效。本章节将介绍 React Native 项目中的模块化开发,包括模块划分、模块间通信、模块管理以及最佳实践。


1.4.1 模块划分

在 React Native 项目中,模块化开发的第一步是将应用划分为多个模块。每个模块应具有明确的职责和边界,模块之间应尽量减少耦合,提高内聚性。

常见的模块划分方式:

  1. 按功能划分(Feature-Based Modules):

    • 将应用按功能模块划分,每个模块包含相关的组件、容器、服务、状态等。
    • 适用于大型应用,可以提高模块的内聚性和可复用性。

    示例:

    /src
      /features
        /auth
          /components
            LoginForm.js
            SignupForm.js
          /containers
            LoginContainer.js
            SignupContainer.js
          /services
            authService.js
          /store
            authReducer.js
            authActions.js
            authSelectors.js
        /home
          /components
            HomeHeader.js
            HomeCard.js
          /containers
            HomeContainer.js
          /services
            homeService.js
          /store
            homeReducer.js
            homeActions.js
            homeSelectors.js
        /profile
          /components
            ProfileHeader.js
            ProfileCard.js
          /containers
            ProfileContainer.js
          /services
            profileService.js
          /store
            profileReducer.js
            profileActions.js
            profileSelectors.js
      /components
        Button.js
        Header.js
        Card.js
      /services
        api.js
        storage.js
        utils.js
      /store
        rootReducer.js
        store.js
      App.js
    
  2. 按技术划分(Technology-Based Modules):

    • 将应用按技术模块划分,例如 UI 组件、状态管理、网络请求等。
    • 适用于中小型应用,结构简单,易于理解。

    示例:

    /src
      /components
        Button.js
        Header.js
        Card.js
      /containers
        HomeContainer.js
        ProfileContainer.js
      /services
        api.js
        storage.js
        utils.js
      /store
        authStore.js
        homeStore.js
        profileStore.js
      App.js
    
  3. 按页面划分(Page-Based Modules):

    • 将应用按页面模块划分,每个页面模块包含相关的组件、容器、服务、状态等。
    • 适用于页面较多的应用,结构清晰,易于导航。

    示例:

    /src
      /pages
        /Home
          HomeScreen.js
          HomeContainer.js
          HomeHeader.js
          HomeCard.js
        /Profile
          ProfileScreen.js
          ProfileContainer.js
          ProfileHeader.js
          ProfileCard.js
        /Settings
          SettingsScreen.js
          SettingsContainer.js
          SettingsHeader.js
          SettingsCard.js
      /components
        Button.js
        Header.js
        Card.js
      /services
        api.js
        storage.js
        utils.js
      /store
        rootReducer.js
        store.js
      App.js
    
1.4.2 模块间通信

模块间通信是模块化开发中的重要环节。React Native 提供了多种方式来实现模块间通信:

  1. Props 和 Callback:

    • 通过组件的 props 和 callback 函数实现组件间的通信。

    示例:

    // ParentComponent.js
    import React from 'react';
    import { View, Text, Button, StyleSheet } from 'react-native';
    import ChildComponent from './ChildComponent';
    
    const ParentComponent = () => {
      const handlePress = (message) => {
        console.log('Child message:', message);
      };
    
      return (
        <View style={styles.container}>
          <ChildComponent onPress={handlePress} />
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
      },
    });
    
    export default ParentComponent;
    
    // ChildComponent.js
    import React from 'react';
    import { View, Text, Button, StyleSheet } from 'react-native';
    
    const ChildComponent = ({ onPress }) => {
      const handleButtonPress = () => {
        onPress('Hello from Child');
      };
    
      return (
        <View style={styles.container}>
          <Button title="Press Me" onPress={handleButtonPress} />
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        margin: 10,
      },
    });
    
    export default ChildComponent;
    
  2. Context API:

    • 通过 React Context API 实现全局状态共享。

    示例:

    // ThemeContext.js
    import React from 'react';
    
    export const themes = {
      light: {
        backgroundColor: '#fff',
        textColor: '#000',
      },
      dark: {
        backgroundColor: '#000',
        textColor: '#fff',
      },
    };
    
    export const ThemeContext = React.createContext(themes.light);
    
    // App.js
    import React, { useState } from 'react';
    import { ThemeContext, themes } from './ThemeContext';
    import ParentComponent from './ParentComponent';
    
    const App = () => {
      const [theme, setTheme] = useState(themes.light);
    
      return (
        <ThemeContext.Provider value={theme}>
          <ParentComponent />
          <Button title="Toggle Theme" onPress={() => setTheme(theme === themes.light ? themes.dark : themes.light)} />
        </ThemeContext.Provider>
      );
    };
    
    export default App;
    
    // ParentComponent.js
    import React, { useContext } from 'react';
    import { View, Text, StyleSheet } from 'react-native';
    import { ThemeContext } from './ThemeContext';
    
    const ParentComponent = () => {
      const theme = useContext(ThemeContext);
    
      return (
        <View style={[styles.container, { backgroundColor: theme.backgroundColor }]}>
          <Text style={{ color: theme.textColor }}>Hello, World!</Text>
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
      },
    });
    
    export default ParentComponent;
    
  3. 状态管理库:

    • 使用 Redux、MobX 或其他状态管理库实现全局状态管理。

    示例:使用 Redux

    // store.js
    import { configureStore } from '@reduxjs/toolkit';
    import authReducer from './reducers/authReducer';
    import userReducer from './reducers/userReducer';
    
    const store = configureStore({
      reducer: {
        auth: authReducer,
        user: userReducer,
      },
    });
    
    export default store;
    
    // ChildComponent.js
    import React from 'react';
    import { useDispatch } from 'react-redux';
    import { Button } from 'react-native';
    
    const ChildComponent = () => {
      const dispatch = useDispatch();
    
      const handleButtonPress = () => {
        dispatch({ type: 'LOGIN', payload: { username: 'user', password: 'pass' } });
      };
    
      return (
        <Button title="Login" onPress={handleButtonPress} />
      );
    };
    
    export default ChildComponent;
    
1.4.3 模块管理

模块管理是指对模块进行版本控制、依赖管理、发布等操作。React Native 项目可以使用 npm 或 yarn 进行模块管理。

最佳实践:

  1. 版本控制:

    • 使用语义化版本控制(Semantic Versioning),例如 1.0.0, 1.1.0, 2.0.0 等。
    • 使用 package.json 文件管理版本依赖。
  2. 依赖管理:

    • 使用 package.json 文件管理项目依赖。
    • 定期更新依赖包,避免使用过时的包。
  3. 发布模块:

    • 将可复用的模块发布到 npm 或私有 npm 仓库。
    • 使用 npm publish 命令发布模块。
  4. 模块隔离:

    • 每个模块应尽量独立,避免模块之间的耦合。
    • 使用 importexport 语句管理模块依赖。
  5. 模块文档:

    • 为每个模块编写详细的文档,说明模块的功能、使用方法、API 等。
1.4.4 模块化开发最佳实践
  1. 单一职责原则:

    • 每个模块应只负责一个功能或业务逻辑,避免模块过于复杂。
  2. 高内聚低耦合:

    • 模块内部应具有高内聚性,模块之间应尽量减少耦合。
  3. 复用性:

    • 模块应设计为可复用的,可以被多个组件或容器组件使用。
  4. 可测试性:

    • 模块应易于测试,可以通过单元测试和集成测试进行验证。
  5. 命名规范:

    • 模块命名应遵循命名规范,例如使用 PascalCase 命名文件夹和文件,使用 camelCase 命名变量和函数。
  6. 文档化:

    • 为模块编写详细的文档,说明模块的功能、使用方法、API 等。

1.5 总结

本章节介绍了 React Native 项目中的架构设计,包括组件化设计、状态管理、代码分层以及模块化开发。通过合理的架构设计,可以提高项目的可维护性、可扩展性和团队协作效率。


课后作业

  1. 尝试将一个 React Native 项目按功能模块划分,并实现模块间通信。
  2. 使用 Redux 或 MobX 实现全局状态管理。
  3. 编写自定义 Hooks,提高代码复用性。
  4. 阅读 React Native 官方文档,深入了解组件化设计和状态管理。
  5. 阅读 react-native-code-push 官方文档,了解更多热更新功能。

作者简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶之激光雷达

这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪

这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧&#xff0c;谢谢了附录coco80类名称 笔记本 华为m…

Laravel对接SLS日志服务

Laravel对接SLS日志服务&#xff08;写入和读取&#xff09; 1、下载阿里云的sdk #通过composer下载 composer require alibabacloud/aliyun-log-php-sdk#对应的git仓库 https://github.com/aliyun/aliyun-log-php-sdk2、创建sdk请求的service <?phpnamespace App\Ser…

uniapp接入高德地图

下面代码兼容安卓APP和H5 高德地图官网&#xff1a;我的应用 | 高德控制台 &#xff0c;绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…

初识WGCLOUD - 监测磁盘空间还能使用多久

WGCLOUD是一款免费开源的运维监控软件&#xff0c;性能优秀&#xff0c;部署简单&#xff0c;轻巧使用&#xff0c;支持大部分的Linux和Windows、安卓、MacOS等平台安装部署 最近发布的新版本 v3.5.4&#xff0c;WGCLOUD新增了可以自动计算每个磁盘剩余空间的可使用天数&#x…

【Xbim+C#】创建圆盘扫掠IfcSweptDiskSolid

基础回顾 https://blog.csdn.net/liqian_ken/article/details/143867404 https://blog.csdn.net/liqian_ken/article/details/114851319 效果图 代码示例 在前文基础上&#xff0c;增加一个工具方法&#xff1a; public static IfcProductDefinitionShape CreateDiskSolidSha…

数据结构 ——— 堆排序算法的实现

目录 前言 向下调整算法&#xff08;默认建大堆&#xff09; 堆排序算法的实现&#xff08;默认升序&#xff09; 前言 在之前几章学习了如何用向上调整算法和向下调整算法对数组进行建大/小堆数据结构 ——— 向上/向下调整算法将数组调整为升/降序_对数组进行降序排序代码…

图像预处理之图像滤波

目录 图像滤波概览 均值滤波&#xff08;Mean Filter&#xff09; 中值滤波&#xff08;Median Filter&#xff09; 高斯滤波&#xff08;Gaussian Filter&#xff09; 双边滤波&#xff08;Bilateral Filter&#xff09; 方框滤波&#xff08;Box Filter&#xff09; S…

Qt-多元素控件

Qt中的多元素控件 Qt提供的多元素控件有&#xff1a; 这里的多元素控件都是两两一对的。 xxWidget和xxView的一个比较简单的理解就是&#xff1a; xxView是更底层的实现&#xff0c; xxWidget是基于xxView封装来的。 可以说&#xff0c;xxView使用起来比较麻烦&#xff0c;但…

<Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作

前言 本文是在websocket进行通讯的基础,添加数据库进行数据的存储,数据库软件使用的是sqlite。 环境配置 系统:windows 平台:visual studio code 语言:javascript、html 库:nodejs、sqlite 概述 此前,我们实现在利用websocket和socket,将网页端与下位控制器如PLC进行…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

主IP地址与从IP地址:深入解析与应用探讨

在互联网的浩瀚世界中&#xff0c;每台联网设备都需要一个独特的身份标识——IP地址。随着网络技术的不断发展&#xff0c;IP地址的角色日益重要&#xff0c;而“主IP地址”与“从IP地址”的概念也逐渐进入人们的视野。这两个术语虽然看似简单&#xff0c;实则蕴含着丰富的网络…

【Linux】文件IO的系统接口 | 文件标识符

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 最近真的任务拉满了&…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

OpenAI 助力数据分析中的模式识别与趋势预测

数据分析师的日常工作中&#xff0c;发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型&#xff08;如 GPT-4&#xff09;&#xff0c;我们可以轻松完成这些任务&#xff0c;无需深厚的编程基础&#xff0c;也能快速上手。 在本文中&#xff0…

基于深度学习的点云分割网络及点云分割数据集

点云分割是根据空间、几何和纹理等特征对点云进行划分&#xff0c;使得同一划分内的点云拥有相似的特征。点云的有效分割是许多应用的前提&#xff0c;例如在三维重建领域&#xff0c;需要对场景内的物体首先进行分类处理&#xff0c;然后才能进行后期的识别和重建。 传统的点…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化&#xff0c;植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础&#xff0c;也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

MySQL 没有数据闪回?看 zCloud 如何补齐MySQL数据恢复能力

ENMOTECH 上一篇文章为大家介绍了某金融科技企业通过 zCloud 多元数据库智能管理平台的告警中心“警警”有条地管理告警并进行敏捷处置的实践案例。本篇跟大家继续分享该案例客户如何利用 zCloud 备份恢复模块下的Binlog解析功能补齐 MySQL 数据恢复能力&#xff0c;让运维人员…

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…