天天看点

如何在 React Native 中写一个自定义模块

前言

在 react native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm,一般指两层含义:一是 node.js 开放式模块登记和管理系统,另一种是 node.js 默认的模块管理器,是一个命令行软件,用来安装和管理 node 模块。本文旨在探讨如何在 react native 中写一个自定义的 npm 模块(类似于插件),并上传到 npm 上供他人使用。

npm 使用介绍

npm 是一个 node.js 模块,安装 node.js 会默认安装 npm,可以在终端中使用以下命令来查看 npm 的版本:

sudo npm install npm -g<code>`</code>

安装模块(安装完毕后会产生一个node_modules目录,其目录下就是安装的各个node模块):

npm config list<code>`</code>

设置代理:

npm adduser<code>`</code>

接下来会提示你输入用户名和密码还有邮箱,一一完成后就可以输入以下命令来查看当前 npm 用户了:

npm init<code>`</code>

执行上述命令后,会引导你创建一个package.json文件,包括名称、版本、作者这些信息等。

创建模块

这里要提一下,为什么要写一个自定义模块。因为 react native 虽然实现了很多 native 组件,并且提供了丰富的 api,但是有些原生库还是不支持的,而且有很多开源的组件和库是面向原生的,因此要想在 react native 中使用这些组件和库就需要自己定义一个模块,这样也方便别人集成。接下来我们直接进入正题。写一个 react native 中可以使用的自定义模块。在命令行中执行

如何在 React Native 中写一个自定义模块

初始化一个 react native 项目。这里以 android 为例,用 android studio 选择菜单 file-&gt;open 打开 awesomeproject 文件夹下的 android 文件夹,然后选择 file -&gt; new -&gt; new module,选择创建一个 android library,如图: 如图所示,这里新建了一个 library module,接下来点击 finish 就可以看到如下的目录结构:

如何在 React Native 中写一个自定义模块

然后将所需要依赖的 jar 放到 libs 目录下,这里以使用 jpush-sdk 为例,将官网上下载的 libs 复制到 libs 下,把相关的资源文件放到 res 文件夹下,再把 androidmanifest 文件内容复制过来,更改一下包名,最后在 build.gradle 中配置一把,如下(这里要注意把 targetsdkversion 改成 22,在23上运行可能会闪退):

生成 package.json 文件(注意这里的 name 字段,这里是别人引用你的模块的名字),然后再创建一个 index.js 文件,这是 node 模块的 js 入口,这里推荐使用 sublime text 进行 js 的编写。这里以 jpush-react-native 为例:

npm publish<code>`</code>

就可以把我们的自定义模块上传到 npm 库了。每次更新版本时,需要改动 package.json 中的 version 值,然后再执行 npm publish 即可。

使用

在 react native 目录下,执行:

someone's react-native project/some module/build.gradle

dependencies {

compile filetree(dir: "libs", include: ["*.jar"])

compile "com.android.support:appcompat-v7:23.0.1"

compile "com.facebook.react:react-native:+" // from node_modules

// 在 dependecies 中加入自定义模块

compile project(':my-react-library')

}<code>`</code>

然后在 settings.gradle 中也要配置一下:

mainactivity.java

...

mreactinstancemanager = reactinstancemanager.builder()

.setapplication(getapplication())

.setbundleassetname("index.android.bundle")

.setjsmainmodulename("react-native-android/index.android")

.addpackage(new mainreactpackage())

//添加自定义的 package

.addpackage(new myreactpackage())

...<code>`</code>

如果是 rn 0.29.0 以上版本,则应在 mainapplication 中添加:

someone.js

//这里的 'my-react-library'是在 package.json 定义的 name

// 这样就可以

import mymodule from 'my-react-library'

export default class someclass extends react.component {