大纲

  • 为什么需要 React Native Module
  • 如何创建一个 React Native的模块
  • 编写 Android Toast 功能模块
  • 如何调试 React Native 模块---------官方文档中未提及或者我没有找到,这里是我自己探索的
  • npm 发布一个 React Native 模块(外链接)

为什么需要 React Native Module

各位使用 React Native 时候是否会有碰到仅用React Native 提供的现有API 无法实现的功能。如微信登录、微信/支付宝支付,访问App的数据库SQLite,还有针对性能的提升等等。这些东西在使用React Native 现有的功能无法实现的时候,将需要开发React Native Moduel。当然也可以使用社区中第三方库,这些三方库也是 React Native Module 。

总之,React Native Module 是可以给JS层扩展一些新的功能,这些功能是现有React Native API无法实现的功能,需要与原生代码进行交互的部分。

如何创建一个 React Native的模块

通过官方文档的查阅和学习,知道可以使用 react-native-create-library 这个库来快速创建一个包含Android ,IOS,Windows 系统下的模块,这个模块并且可以直接使用react-native link 快速链接到现有的 React Native 的应用中。

下面将简单介绍如何安装使用 react-native-create-library。

  • 安装 react-native-create-library
# npm
npm install -g react-native-create-library# yarn
yarn add -g react-native-create-library

  • 创建一个 React Native Module 模块
# 这样将创建一个具有 Android ios  windows 3个模块的 React Native Module
react-native-create-library demo # 这样将仅创建一个具有 Android ios 2个模块的 React Native Module
react-native-create-library demo --platforms android,ios

上面就是创建一个React Native Module 的简单介绍,更多关于 react-native-create-library 的使用请移步GitHub官方仓库。

编写 Android Toast 功能模块

这里是参考官网【Android 原生模块】,可以点击查看详情,下面是简单介绍。

  • 所有的Android 原生模块都是继承于ReactContextBaseJavaModule类。
  • ReactContextBaseJavaModule.getName 方法是将当前这个模块暴露给JavaScript层的名字
  • ReactContextBaseJavaModule.getContants 返回的Map对象,是暴露给JavaScript层的一些常量
  • 在ReactContextBaseJavaModule类中使用 @ReactMethod 注解导出一个方法给JavaScript
// 这是上面几个步骤的共同代码// 这里定义一个类继承 ReactContextBaseJavaModule
public class RNToastModule extends ReactContextBaseJavaModule {private final ReactApplicationContext reactContext;public RNToastModule(ReactApplicationContext reactContext) {super(reactContext);this.reactContext = reactContext;}/*** 这里导出的字符串为当前模块的 JS 名称* 在js中获取到当前模块中如下获取到当前模块:* NativeModules.RNToast* NativeModules 为 import { NativeModules } from 'react-native'; 中的 NativeModules* @return*/@Overridepublic String getName() {return "RNToast";}/*** 这里返回的值会被JS模块当做常量来使用* 使用方式为** NativeModules.RNToast.SHORT === Toast.LENGTH_SHORT* NativeModules.RNToast.LONG === Toast.LENGTH_LONG** @return*/@Nullable@Overridepublic Map<String, Object> getConstants() {final Map<String, Object> constants = new HashMap<>();constants.put("SHORT", Toast.LENGTH_SHORT);constants.put("LONG", Toast.LENGTH_LONG);return  constants;}/*** 这里暴露一个方法给 React Native** 在JS中使用方式为:** NativeModules.RNToast.show(msg, duration); // duration 可以使用上面 getConstants 方法暴露出来的常量** @param msg* @param duration*/@ReactMethodpublic void show( String msg, int duration ){Toast.makeText(getReactApplicationContext(), msg, duration).show();}
}

  • 封装一个JavaScript模块
import { NativeModules } from "react-native";
// 下一句中的ToastExample即对应上文
// public String getName()中返回的字符串
export default NativeModules.RNToast;

经过上面几个简单的步骤就开发好了一个 React Native Module 模块,但是这里有一个重要的问题,开发的React Native Module 不可能每个都像Toast这个模块如此简单,应该如何在开发的过程中调试是一个重要的问题,不可能每次都发布到npm上来进行调试,每次发布调试也将影响他人正常使用该模块,而且也给开发带来了非常多不必要的麻烦,因此需要一个非常有效的调试方式,接下来将介绍如何调试React Native 模块。

如何调试 React Native 模块

基本思路为:既然是要调试 React Native 模块,就需要一个 React Native App,然后将自己写的React Native Module模块导入React Native App 中,并且启动App,修改Module,再次安装调试,这样一系列的操作。具体步骤如下:

  • 创建 React Native App
# 创建一个名为 toast_demo 的工程
react-native init toast_demo
# 等待命令的执行,执行完后安装依赖,启动服务,安装app到模拟器或者真机,这样完成了一个react native app的创建

  • 将 React Native Module 模块导入现有的App
# 先在 toast 工程中, yarn link 命令可以将toast工程导入全局,
# 在别的工程中使用yarn link react-native-toast 就可以使用当前的toast工程
# 为什么是 react-native-toast 而不是 toast,可以点开 toast > package.json文件
# 将会发现 toast 工程的 name 是 react-native-toast,
# 前缀 react-native 是由 react-native-create-library 加上的。
# 因此这里是 react-native-toast 而不是 toast。
yarn link# 在 toast_demo 工程中敲击yarn link react-native-toast,
# 再点开 toast_demo 工程下的node_modules 会发现 react-native-toast被
# 加载到toast_demo/node_modules里面了
yarn link react-native-toast# react-native link 命令不用多说
react-native link react-native-toast

上面的事情都做完了你很开心的启动你的工程,并安装到手机上调试的时候会发现下面这个问题(unable to resolve module 'react-native-toast')

这个问题主要导致的原因是React Native工程不支持 symlinks。怎么解决这个问题呢?

这里使用 haul , 这是一个用于开发 React Native App 的命令行工具。它可以很好的使用 Webpack 生态,以及支持热更新,不用每修改等待React Native 来重新编译,当然它也支持 symlinks ,所以可以使用 haul 来解决上面遇到的这个问题,具体使用方式可以查看官方 GitHub仓库,下面是简单介绍:

# 安装 haul
yarn add --dev haul# 初始化 haul和安装haul的依赖,但是npx 不会准确的安装所有的依赖,因此在使用haul的时候可能会提示漏掉了某些库,
# 只要根据提示安装完所有的依赖即可
yarn haul init
# npm >= 5.2.0 :
npx haul init
# npm < 5.2.0 :
npm install -g npx
npx haul init# 然后启动 haul 相关服务
yarn haul start --platform ios
# Or:
npx haul start --platform ios

我是使用 haul^1.0.0-rc.15 这个版本的 haul,会碰到这个issue中的问题,haul的作者有提供解决方案,修改haul.config.js 为一下内容。

import { createWebpackConfig } from "haul";export default {webpack: env => {const config = createWebpackConfig({entry: './index.js',})(env);config.module.rules.some(rule => {if (rule.test && rule.test.source.includes('js')) {rule.use = [{loader: require.resolve('babel-loader'),options: {presets: [['module:metro-react-native-babel-preset', { enableBabelRuntime: false }]],plugins: [require.resolve('haul/src/utils/fixRequireIssues')],},},];return true;}});return config;}
};

然后重新启动 haul, 将能够正常的运行React Native App 了。

修改 Android Studio 中 react-native-toast 中的代码将会直接映射到 toast 工程中,这是 symlinks 的功能,这个功能非常的方便调试和修改module。

(官方文档中未提及调试这块或者我没有找到,这里是我自己探索的,有更好的方式请各位告知)

开发好一个module,希望别人可以使用或者自己在下次工程中使用,这该怎么办呢?当然是将当前的react native module 发布到 npm 上,怎么发布请继续往下看。

npm 发布一个 React Native 模块(外链接)

这是其他博主写的npm包的创建和发布流程,主要使用 npm publish来发布和更新一个npm包,发布的npm包他人将可以使用npm或者yarn 进行下载和安装使用你写的模块。

以上就是开发一个 React Native Android Module 的过程,如果是IOS也可以类比这个流程来开发调试。

toast 工程样例

toast_demo 工程样例

【参考】

  • Native Modules Setup
  • React Native 中文官方文档 Android 原生模块
  • React Native: npm link local dependency, unable to resolve module
  • haul - Attempted to assign to readonly property

怎么安装aptdaemon模块_自己开发一个React Native 模块相关推荐

  1. react的导出是怎么实现的_从零开始开发一个 React

    这个是从零开始开发一个 React 系列的第七篇.想要访问之前的内容可以点击下方的链接进行访问: 最简单的实现,包括 vdom 结构,createElement,ReactDOM.render 增加 ...

  2. android 申请拍照权限,React Native模块之Permissions权限申请的实例相机

    React Native模块之Permissions权限申请的实例相机 发布时间:2020-09-03 23:49:26 来源:脚本之家 阅读:280 作者:lqh React Native模块之Pe ...

  3. 构建了我的第一个React Native应用程序之后,我现在确信这是未来。

    by Taylor Milliman 泰勒·米利曼(Taylor Milliman) 构建了我的第一个React Native应用程序之后,我现在确信这是未来. (After building my ...

  4. 我如何为我的第一个自由客户构建第一个React Native应用程序

    by Charlie Jeppsson 查理·杰普森(Charlie Jeppsson) 我如何为我的第一个自由客户构建第一个React Native应用程序 (How I built my firs ...

  5. 如何添加MySQL插件_如何开发一个自定义的MySQL插件

    MySQL自带了很多插件,比如半同步插件.审计插件.密码验证插件等等,甚至MySQL存储引擎也是以插件方式实现的.MySQL开放的插件接口,为开发者开发自定义插件提供了便利.本文将介绍如何快速开发一个 ...

  6. python 查看已经安装的模块_教你用Python查看模块的帮助文档,方法和帮助信息...

    这里介绍下python自带的查看帮助功能,可以在编程时不中断地迅速找到所需模块和函数的使用方法 查看方法 通用帮助函数help() python中的help()类似unix中的man指令,熟悉后会对我 ...

  7. mysql独立开发_独立开发一个 App 是一种怎样的体验?

    我要回答一下这样孤单的问题.哈哈哈. 我做过2个已经上线的APP. 第一个<仅仅电影>(已经下线了): 那时候年轻,想做一个独立的电影影单类的APP,推荐很多好看电影.然后想法立了就开始做 ...

  8. flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件

    在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...

  9. 级联选择组件_如何开发一个 Antd 级联多选控件

    本文也同步发在掘金上, https:// juejin.cn/post/69149942 41940750343 Intro 这篇文章将从零开始介绍如何开发一个 Antd 的级联多选选择器.先看效果: ...

最新文章

  1. SVN版本控制系统使用
  2. PyTorch踩过的12坑 | CSDN博文精选
  3. python dlib学习(一):人脸检测
  4. [CentOS Python系列] 六.阿里云搭建Django网站详解
  5. SSIS数据转换组件_复制转换、数据转换、行计数
  6. Luogu P2101 命运石之门的选择(分治+搜索)
  7. python学习第22天
  8. bzoj2751 [HAOI2012]容易题(easy)
  9. 使用 pyinstaller 打包 py 文件成 exe 程序
  10. html+css+js中的小知识点汇聚(无序 停更)
  11. 幕墙计算软件_案例BIM在玻璃幕墙参数化设计的应用
  12. 深度装机大师一键重装_电脑重装系统步骤
  13. 精心整理的10套最美Web前端新年特效---提前祝大家新年快乐(文末送书)
  14. 数字图像处理笔记(八)彩色图像和彩色图像直方图均衡化
  15. https利用360cdn实现网站加速
  16. oracle 取记录最大的那条记录_相机记录高三备考生的一天,看哭万人: 读书虽苦,却是最容易的那条路!...
  17. python爬取凤凰新闻网_爬取网易,搜狐,凤凰和澎湃网站评论数据,正负面情感分析...
  18. arduino开发板安装驱动
  19. CC2530芯片介绍
  20. Flutter 数字增加动画

热门文章

  1. pppcloud云主机内LINUX用户安全管理2
  2. 银联在线支付---利用测试案例代码模拟支付应用(修改)
  3. Android开发之Java集合类性能分析
  4. Ubuntu安装Gems报错的解决办法
  5. windows下的_mkdir函数
  6. Source Server + Symbol Server
  7. linux的常用操作——程序调试gdb
  8. Hanlp的安装和配置
  9. statement的增删改查和动态的增删改查
  10. 管理系统 c++图形界面_锁螺母ERP系统,一站式各国语言管理系统