天天看點

如何在 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 {