怎么安装aptdaemon模块_自己开发一个React Native 模块
大纲
- 为什么需要 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 模块相关推荐
- react的导出是怎么实现的_从零开始开发一个 React
这个是从零开始开发一个 React 系列的第七篇.想要访问之前的内容可以点击下方的链接进行访问: 最简单的实现,包括 vdom 结构,createElement,ReactDOM.render 增加 ...
- android 申请拍照权限,React Native模块之Permissions权限申请的实例相机
React Native模块之Permissions权限申请的实例相机 发布时间:2020-09-03 23:49:26 来源:脚本之家 阅读:280 作者:lqh React Native模块之Pe ...
- 构建了我的第一个React Native应用程序之后,我现在确信这是未来。
by Taylor Milliman 泰勒·米利曼(Taylor Milliman) 构建了我的第一个React Native应用程序之后,我现在确信这是未来. (After building my ...
- 我如何为我的第一个自由客户构建第一个React Native应用程序
by Charlie Jeppsson 查理·杰普森(Charlie Jeppsson) 我如何为我的第一个自由客户构建第一个React Native应用程序 (How I built my firs ...
- 如何添加MySQL插件_如何开发一个自定义的MySQL插件
MySQL自带了很多插件,比如半同步插件.审计插件.密码验证插件等等,甚至MySQL存储引擎也是以插件方式实现的.MySQL开放的插件接口,为开发者开发自定义插件提供了便利.本文将介绍如何快速开发一个 ...
- python 查看已经安装的模块_教你用Python查看模块的帮助文档,方法和帮助信息...
这里介绍下python自带的查看帮助功能,可以在编程时不中断地迅速找到所需模块和函数的使用方法 查看方法 通用帮助函数help() python中的help()类似unix中的man指令,熟悉后会对我 ...
- mysql独立开发_独立开发一个 App 是一种怎样的体验?
我要回答一下这样孤单的问题.哈哈哈. 我做过2个已经上线的APP. 第一个<仅仅电影>(已经下线了): 那时候年轻,想做一个独立的电影影单类的APP,推荐很多好看电影.然后想法立了就开始做 ...
- flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...
- 级联选择组件_如何开发一个 Antd 级联多选控件
本文也同步发在掘金上, https:// juejin.cn/post/69149942 41940750343 Intro 这篇文章将从零开始介绍如何开发一个 Antd 的级联多选选择器.先看效果: ...
最新文章
- SVN版本控制系统使用
- PyTorch踩过的12坑 | CSDN博文精选
- python dlib学习(一):人脸检测
- [CentOS Python系列] 六.阿里云搭建Django网站详解
- SSIS数据转换组件_复制转换、数据转换、行计数
- Luogu P2101 命运石之门的选择(分治+搜索)
- python学习第22天
- bzoj2751 [HAOI2012]容易题(easy)
- 使用 pyinstaller 打包 py 文件成 exe 程序
- html+css+js中的小知识点汇聚(无序 停更)
- 幕墙计算软件_案例BIM在玻璃幕墙参数化设计的应用
- 深度装机大师一键重装_电脑重装系统步骤
- 精心整理的10套最美Web前端新年特效---提前祝大家新年快乐(文末送书)
- 数字图像处理笔记(八)彩色图像和彩色图像直方图均衡化
- https利用360cdn实现网站加速
- oracle 取记录最大的那条记录_相机记录高三备考生的一天,看哭万人: 读书虽苦,却是最容易的那条路!...
- python爬取凤凰新闻网_爬取网易,搜狐,凤凰和澎湃网站评论数据,正负面情感分析...
- arduino开发板安装驱动
- CC2530芯片介绍
- Flutter 数字增加动画