自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在React Native中寫(xiě)一個(gè)自定義模塊

開(kāi)發(fā) 前端
在 React Native 項(xiàng)目中可以看到 node_modules 文件夾,這是存放 node 模塊的地方,Node.js 的包管理器 npm 是全球最大的開(kāi)源庫(kù)生態(tài)系統(tǒng)。提到npm,一般指兩層含義:一是 Node.js 開(kāi)放式模塊登記和管理系統(tǒng),另一種是 Node.js 默認(rèn)的模塊管理器,是一個(gè)命令行軟件,用來(lái)安裝和管理 node 模塊。本文旨在探討如何在 React Native 中寫(xiě)一個(gè)自定義的 npm 模塊(類(lèi)似于插件),并上傳到 npm 上供他人使用。

前言

在 React Native 項(xiàng)目中可以看到 node_modules 文件夾,這是存放 node 模塊的地方,Node.js 的包管理器 npm 是全球***的開(kāi)源庫(kù)生態(tài)系統(tǒng)。提到npm,一般指兩層含義:一是 Node.js 開(kāi)放式模塊登記和管理系統(tǒng),另一種是 Node.js 默認(rèn)的模塊管理器,是一個(gè)命令行軟件,用來(lái)安裝和管理 node 模塊。本文旨在探討如何在 React Native 中寫(xiě)一個(gè)自定義的 npm 模塊(類(lèi)似于插件),并上傳到 npm 上供他人使用。

npm 使用介紹

npm 是一個(gè) Node.js 模塊,安裝 Node.js 會(huì)默認(rèn)安裝 npm,可以在終端中使用以下命令來(lái)查看 npm 的版本:

  1. npm -v 

升級(jí) npm:

  1. sudo npm install npm -g 

安裝模塊(安裝完畢后會(huì)產(chǎn)生一個(gè)node_modules目錄,其目錄下就是安裝的各個(gè)node模塊):

  1. npm install <ModuleName> 

查看 npm 配置:

  1. npm config list 

設(shè)置代理:

  1. //設(shè)置 http 代理 
  2. npm config set proxy http://server:port 
  3. //設(shè)置 https 代理 
  4. npm config set https-proxy http://server:port 

 

上面介紹了一些 npm 基本命令,接下來(lái)就可以在本地創(chuàng)建一個(gè)模塊啦。 首先打開(kāi)終端中新建一個(gè)你想在此創(chuàng)建自定義模塊的文件夾,然后在命令行中登錄 npm。輸入以下命令:

  1. npm adduser 

接下來(lái)會(huì)提示你輸入用戶(hù)名和密碼還有郵箱,一一完成后就可以輸入以下命令來(lái)查看當(dāng)前 npm 用戶(hù)了:

  1. npm whoami 

如果正確顯示了剛才注冊(cè)的用戶(hù)名,說(shuō)明登錄成功了。然后就使用以下命令來(lái)創(chuàng)建 npm 模塊:

  1. npm init 

執(zhí)行上述命令后,會(huì)引導(dǎo)你創(chuàng)建一個(gè)package.json文件,包括名稱(chēng)、版本、作者這些信息等。

創(chuàng)建模塊

這里要提一下,為什么要寫(xiě)一個(gè)自定義模塊。因?yàn)?React Native 雖然實(shí)現(xiàn)了很多 Native 組件,并且提供了豐富的 API,但是有些原生庫(kù)還是不支持的,而且有很多開(kāi)源的組件和庫(kù)是面向原生的,因此要想在 React Native 中使用這些組件和庫(kù)就需要自己定義一個(gè)模塊,這樣也方便別人集成。接下來(lái)我們直接進(jìn)入正題。寫(xiě)一個(gè) React Native 中可以使用的自定義模塊。在命令行中執(zhí)行

  1. react-native init AwesomeProject 

初始化一個(gè) React Native 項(xiàng)目。這里以 Android 為例,用 Android Studio 選擇菜單 File->open 打開(kāi) AwesomeProject 文件夾下的 android 文件夾,然后選擇 File -> New -> New Module,選擇創(chuàng)建一個(gè) Android Library,如圖:

如圖所示,這里新建了一個(gè) Library module,接下來(lái)點(diǎn)擊 finish 就可以看到如下的目錄結(jié)構(gòu):

 

 

 

然后將所需要依賴(lài)的 jar 放到 libs 目錄下,這里以使用 jpush-sdk 為例,將官網(wǎng)上下載的 libs 復(fù)制到 libs 下,把相關(guān)的資源文件放到 res 文件夾下,再把 AndroidManifest 文件內(nèi)容復(fù)制過(guò)來(lái),更改一下包名,***在 build.gradle 中配置一把,如下(這里要注意把 targetSdkVersion 改成 22,在23上運(yùn)行可能會(huì)閃退):

  1. apply plugin: 'com.android.library' 
  2. android {     
  3.   compileSdkVersion 23     
  4.   buildToolsVersion "23.0.2"     
  5.   defaultConfig {         
  6.     minSdkVersion 16         
  7.     targetSdkVersion 22         
  8.     versionCode 1         
  9.     versionName "1.0"         
  10.     manifestPlaceholders = [                 
  11.       JPUSH_APPKEY: "yourAppKey",  //在此修改JPush的AppKey                     
  12.       APP_CHANNEL: "developer-default"      //應(yīng)用渠道號(hào)         
  13.     ]     
  14.   }     
  15.   lintOptions {         
  16.     abortOnError false         
  17.     warning 'InvalidPackage'     
  18.   }     
  19.   sourceSets {         
  20.     main {             
  21.       jniLibs.srcDirs = ['libs']         
  22.     }     
  23. repositories {     
  24.   mavenCentral() 
  25.  
  26. dependencies {     
  27.   compile fileTree(dir: 'libs', include: ['*.jar'])     
  28.   compile "com.facebook.react:react-native:+" 

 

到此為止,我們已經(jīng)完成了***步操作,接下來(lái)需要寫(xiě) Native 和 JS 交互的代碼,可以參考我的這篇文章中 JS 調(diào)用 Native 以及 Native 調(diào)用 JS 部分,這里不再贅述。假設(shè)我們已經(jīng)完成了 Native 部分代碼,我們?nèi)绾尾拍茉?JS 中讓他人能夠通過(guò) import 的方式調(diào)用我們的 JS 代碼,從而調(diào)用 Native 呢?首先進(jìn)入 my-react-library 文件夾,然后在終端執(zhí)行

  1. npm init 

生成 package.json 文件(注意這里的 name 字段,這里是別人引用你的模塊的名字),然后再創(chuàng)建一個(gè) index.js 文件,這是 node 模塊的 JS 入口,這里推薦使用 Sublime Text 進(jìn)行 JS 的編寫(xiě)。這里以 jpush-react-native 為例:

jpush-react-native/index.js 部分代碼

  1. import {NativeModules, Platform, DeviceEventEmitter} from 'react-native'
  2.  
  3. // 通過(guò) NativeModules 找到我們?cè)?nbsp;Native 定義的 JPushModule 類(lèi) 
  4. const JPushModule = NativeModules.JPushModule; 
  5.  
  6. export default class JPush { 
  7.  
  8.     /** 
  9.      * Android only 
  10.      * 初始化JPush 必須先初始化才能執(zhí)行其他操作 
  11.     */ 
  12.     static initPush() { 
  13.         JPushModule.initPush(); 
  14.     } 
  15. } 

 

上面定義了一個(gè) initPush 方法,initPush 實(shí)際上調(diào)用了 JPushModule 中定義的 initPush 方法,其他方法與此類(lèi)似,本質(zhì)上都是通過(guò) NativeModules 調(diào)用了 Native 提供的方法。

發(fā)布

到此為止,我們已經(jīng)完成了 React Native 自定義模塊?,F(xiàn)在可以發(fā)布我們的自定義模塊了。在 package.json 所在的目錄下執(zhí)行

  1. npm publish 

就可以把我們的自定義模塊上傳到 npm 庫(kù)了。每次更新版本時(shí),需要改動(dòng) package.json 中的 version 值,然后再執(zhí)行 npm publish 即可。

使用

在 React Native 目錄下,執(zhí)行:

  1. npm install my-react-library --save 

安裝完成后就會(huì)把這個(gè)模塊保存到 node_modules 文件夾下,由于我們的模塊是一個(gè) Android Library 項(xiàng)目,所以在 Native 中還需要配置一下。主要是添加項(xiàng)目依賴(lài):

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

  1. dependencies {     
  2.   compile fileTree(dir: "libs", include: ["*.jar"])     
  3.   compile "com.android.support:appcompat-v7:23.0.1"     
  4.   compile "com.facebook.react:react-native:+"  // From node_modules    
  5.   // 在 dependecies 中加入自定義模塊  
  6.   compile project(':my-react-library'

 

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

someone's react-native project/settings.gradle

  1. include ':app'':my-react-library' 
  2. project(':my-react-library').projectDir = new File(rootProject.projectDir, '../node_modules/my-react-library/android'

 

在 MainActivity 中將自定義的 Package 添加進(jìn)去:

MainActivity.java

  1. ... 
  2. mReactInstanceManager = ReactInstanceManager.builder()                 
  3. .setApplication(getApplication())                 
  4. .setBundleAssetName("index.android.bundle")                 
  5. .setJSMainModuleName("react-native-android/index.android")                 
  6. .addPackage(new MainReactPackage()) 
  7. //添加自定義的 package 
  8. .addPackage(new MyReactPackage()) 
  9. ... 

 

如果是 RN 0.29.0 以上版本,則應(yīng)在 MainApplication 中添加:

MainApplication.java

  1. @Overrideprotected List<ReactPackage> getPackages() {     
  2. return Arrays.<ReactPackage>asList(             
  3.     new MainReactPackage(),             
  4.     new MyReactPackage()     
  5.   ); 

 

到此為止我們完成了 Native 部分的配置(完成后 sync 一下),接下來(lái)就可以使用了。 別人要使用我們的模塊時(shí),就可以這樣寫(xiě):

someone.js

  1. //這里的 'my-react-library'是在 package.json 定義的 name 
  2. // 這樣就可以 
  3. import MyModule from 'my-react-library' 
  4.  
  5. export default class SomeClass  extends React.Component { 
  6.     componentDidMount() { 
  7.       // 調(diào)用 index.js 中定義的 doSomething() 
  8.       MyModule.doSomething(); 
  9.     } 
  10. } 

 

責(zé)任編輯:龐桂玉 來(lái)源: 極光推送的博客
相關(guān)推薦

2022-06-06 09:28:36

ReactHook

2012-11-19 11:07:42

IBMdw

2019-12-02 21:29:45

Keras神經(jīng)網(wǎng)絡(luò)TensorFlow

2021-07-01 11:07:49

Swift 自定義操作符

2016-11-23 16:48:20

react-nativandroidjavascript

2021-07-16 11:00:40

Django用戶(hù)模型Python

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2020-11-19 10:50:43

ImportPython代碼

2009-07-03 18:20:45

VSTS 2010網(wǎng)絡(luò)

2023-01-29 08:00:00

Instagram濾鏡圖片編輯

2009-04-28 13:25:36

Ajax函數(shù)Java

2021-03-09 15:23:45

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2016-12-07 17:45:44

Linux文件

2024-04-11 08:30:05

JavaScript數(shù)組函數(shù)

2024-08-01 17:20:55

2020-09-18 10:12:24

KotlinTCP網(wǎng)絡(luò)協(xié)議

2013-03-28 16:59:56

Android開(kāi)發(fā)自定義TitleBar

2021-07-26 09:00:08

ReactHooks 項(xiàng)目

2011-08-09 17:16:56

CoreAnimati動(dòng)畫(huà)

2021-11-23 15:06:42

Kubernetes 運(yùn)維開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)