React Native組件開發指南

React Native的組件開發一直處在一個比較尷尬的處境。在官方未給予相關示例與腳手架的情況下,社區中依然誕生了許許多多的React Native組件。因為缺少示例與規范,很多組件庫僅含有一個index.js文件。這種基礎的目錄結構也導致了一些顯而易見的問題,例如“如何測試”,“如何預覽”,“如何開發”......本文將為各位提供一種React Native組件開發的示例目錄結構相關配置指南

示例目錄結構

.
├── src
│   └── index.js
├── test
│   └── index.test.js 
├── demo
│   ├── .gitignore
│   ├── .watchmanconfig
│   ├── App.js
│   ├── app.json
│   ├── babel.config.js
│   ├── metro.config.js
│   └── package.json
├── .eslintrc.js
├── babel.config.js
├── README.md
├── .gitignore
└── package.json

目錄結構主要區分為4塊內容根目錄src目錄test目錄demo目錄

根目錄包含了eslint配置babel配置README, gitignore, package.json。其中babel配置package.json中依賴定義是為了運行測試用例而存在的。

src目錄包含了當前React Native組件的源碼,是組件開發最主要的目錄。

test目錄包含了當前React Native組件的測試相關代碼。

demo目錄包含了一個獨立的Expo項目,其中App.js文件是開發組件示例最主要文件,其中會引用src目錄中提供的組件來進行開發與展示。該目錄的配置詳情會在下文中繼續展開。

為什么用Expo來進行開發與展示?

Expo是一個基于React Native包裹的React Native應用開發框架。許多React Native的開發者對于Expo依然持懷疑態度。不可否認的是用Expo來開發React Native應用確實存在一些問題,例如:

  • 引入Expo SDK后,應用體積過大的問題
  • 缺乏應用在后臺運行的能力
  • ...

但是絕大多數Expo的弊端是我們在組件開發中不會遇到或者可以避開的,那么隨之而來的便是Expo的優點:

  • 快速安裝與上手
  • 快速在網頁、模擬器、實機上預覽或測試
  • 與React Native的無縫兼容性

相信開發過React Native的同學一定會抱怨它沉重的依賴安裝,與繁瑣的調試過程,而Expo正好輕量化了這兩個過程,不僅加速了我們的組件開發預覽,也在我們的組件目錄中去除了Native端相關的代碼,輕量化了我們的目錄結構

相關配置指南

引入Expo

為組件項目引入Expo可能沒有聽上去這么容易,因為我們在上文的目錄結構中將src目錄定義成與demo目錄平行的目錄結構,這就導致了metro(React Native打包工具)的默認配置將無法正常打包demo目錄中的React Native代碼。為了解決這個問題,我們就需要手動去調整metro的配置文件,而metro配置文檔又以“精簡”著稱,于是配置metro便成了一個極大的困難點。

準備工作

首先我們需要安裝Expo CLI工具

$ npm install -g expo-cli

在組件庫的根目錄中運行

$ expo init demo

然后選擇

  • blank template
  • managed workflow

你便在demo目錄中生成了一個可運行的Expo項目, 可以通過運行以下命令來預覽當前的Expo項目

$ cd demo
$ yarn start
配置metro
舊版本metro通常使用rn-cli.config.js作為配置文件名,而新版本則使用metro.config.js作為配置文件名。舊版本metro的配置文件格式也與新版本有較大的差別。本文將重點關注新版本metro的配置。

demo目錄中創建名為metro.config.jsmetro配置文件,并在Expo的應用配置文件app.json中添加如下字段用于重置項目根目錄配置與注入自定義的metro配置文件

"packagerOpts": {"projectRoots": "","config": "metro.config.js"
}

metro.config.js中添加如下內容

const path = require('path');
const blacklist = require('metro-config/src/defaults/blacklist');
const escapeRegexString = require('escape-regex-string');module.exports = {resolver: {blacklistRE: blacklist([new RegExp(`^${escapeRegexString(path.resolve(__dirname, '..', 'node_modules'))}\\/.*$`,),]),providesModuleNodeModules: ['react-native','react','prop-types',],extraNodeModules: {'@babel/runtime': path.resolve(__dirname, 'node_modules/@babel/runtime'),},},projectRoot: path.resolve(__dirname),watchFolders: [path.resolve(__dirname, '..'),],
};

來仔細解析一下上面的配置項

  • providesModuleNodeModules: 該配置項為當前項目提供額外的providesModule路徑解析名。providesModule簡單來說就是一個提供文件路徑別名的手段。例如在一個文件頭部添加如下的注釋,你就可以在項目別處通過import test from 'test'直接引入該文件。

    /**
*/
```

在這里我們將注入在src目錄中被引用的三個庫react-native, react, prop-types,使得src目錄中的引用能正確被metro解析。

  • extraNodeModules: 該配置旨在為當前項目提供額外引入的模塊,配置格式為[{ 模塊名 : 路徑 }]。我們在這里配置src目錄中需要的額外模塊,例如運行測試時所需要的@babel/runtime模塊。
  • blackListRE: 配置一個正則,打包時忽略掉正則匹配到的路徑。在這里我們將根目錄中的node_modules路徑下的所有內容忽略,目的是因為在根目錄下的node_modules中會存在與demo目錄node_modules中相同的庫,例如react-native, react, prop-types。這就會使得providesModule在解析時產生重名,從而導致jest-haste-map報錯。
  • projectRoot: 配置項目的根目錄。
  • watchFolders: 為項目引入除projectRoot外額外的目錄,在這里我們將上層的根目錄加入metro的關注列表。

配置完metro,即可在App.js中引入src目錄中的組件

import React from 'react';
import { StyleSheet, View } from 'react-native';
import Component from '../src';const App = () => (<View style={styles.container}><Component /></View>
);const styles = StyleSheet.create({container: {flex: 1,backgroundColor: '#fff',alignItems: 'center',justifyContent: 'center',},
});export default App;

現在運行yarn start,就能順利看到你的組件在Expo中展示了。

小結

本文主要提供了一種React Native組件的目錄結構,與“如何在一個React Native組件工程中引入一個含Expo工程的子目錄”的相關配置指南。這里還需要需要說明的一點是,React Native組件的目錄結構可以有千萬種,本文只是提供一種可行的思路供大家參考,如有更好的方案也歡迎交流與學習。本文將重點放在了引入Expo的配置指南上,如需查看該目錄結構的所有文件配置,請轉至Github。

相關

  • react-native-component-cli - 快速生成該目錄結構的腳手架工具
  • react-native-hsv-color-picker - 基于該目錄結構的組件案例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java activiti jbpm_activiti和jbpm工作流引擎哪個比較好?

原標題&#xff1a;activiti和jbpm工作流引擎哪個比較好&#xff1f;在常用的ERP系統、OA系統的開發中&#xff0c;工作流引擎是一個必不可少的工具。之前在選擇工作流引擎時曾經在activiti和jbpm之間有過比較&#xff0c;當時做出的決定是使用jbpm&#xff0c;但實際開發過程中…

C/C++中善用大括號

C/C中善用大括號轉載于:https://www.cnblogs.com/satng/archive/2010/12/17/2138840.html

識別人聲_演唱人聲的5個技巧

識別人聲什么是聲樂伴奏&#xff1f; (What is Vocal Comping?) Vocal comping describes the process of combining multiple vocal takes into one “supertake” that has the best parts of each. This is called a “composite track,” or comp for short. Many instrum…

你知道source map如何幫你定位源碼么?

大家好&#xff0c;我是若川。今天分享一篇我們經常會忽略的定位原始代碼位置原理的文章。文章不長&#xff0c;例子不錯&#xff0c;可以先收藏&#xff0c;有空時動手試試。學習源碼系列、年度總結、JS基礎系列前言我們知道&#xff0c;代碼上線前要經過壓縮&#xff0c;美化…

OOP 中的 方法調用、接口、鴨式辯型、訪問者模式

2019獨角獸企業重金招聘Python工程師標準>>> 方法調用的四種方式 直接調用&#xff1a;通過類或者實例直接調用其方法。接口調用或者轉型調用&#xff1a;通過將實例回調給一個接口對象&#xff0c;或者轉型為一個父類的實例&#xff0c;來調用間接調用&#xff1a;…

Substitution控件MethodName無法取到Session的解決辦法

Substitution是對緩存頁面實現動態顯示部分內容的控件&#xff0c;使用方法&#xff1a;在后臺頁面添加靜態方法&#xff0c;private static string MethodName(HttpContext context),經典的用法是動態顯示的是當前的登錄用戶名字&#xff08;非登錄用戶顯示其他的&#xff09;…

java中想要保留2位小數_java使double保留兩位小數的多方法 java保留兩位小數

mport java.text.DecimalFormat;DecimalFormat df new DecimalFormat("######0.00");double d1 3.23456double d2 0.0;double d3 2.0;df.format(d1);df.format(d2);df.format(d3);3個結果分別為:3.230.002.00java保留兩位小數問題&#xff1a;方式一&#x…

游戲 新手引導 設計_我認為每個新手設計師都應該知道什么

游戲 新手引導 設計重點 (Top highlight)I should probably have titled this article “What I wish I knew as a newbie designer.” Anyway, I’ve been doing this graphic design thing for a little over a year now, and I know now, a few things that could have made…

畢業年限不長的前端焦慮和突破方法

大家好&#xff0c;我是若川。今天周六&#xff0c;分享一篇相對輕松的文章。經作者耳東蝸牛 授權轉載鏈接&#xff1a;https://juejin.cn/post/6968002742321152014也可點擊文末閱讀原文直達本篇文章來源于&#xff1a;周五和團隊成員[20年畢業]的一次閑聊。畢業不到一年&…

開源自然語言處理工具包hanlp中CRF分詞實現詳解

CRF簡介 CRF是序列標注場景中常用的模型&#xff0c;比HMM能利用更多的特征&#xff0c;比MEMM更能抵抗標記偏置的問題。 [gerative-discriminative.png] CRF訓練 這類耗時的任務&#xff0c;還是交給了用C實現的CRF。關于CRF輸出的CRF模型&#xff0c;請參考《CRF模型格式說明…

java 素數歐拉篩選_[C++]歐拉素數篩的理解與實現

在傳統的素數篩法中&#xff0c;我們使用了對于每一個數n&#xff0c;在 1~(√n) 范圍內進行取模檢查&#xff0c;這樣逐一判斷的復雜度為n(√n)。但如果我們需要更快的篩法時怎么辦&#xff1f;于是著名的歐拉篩誕生了。它能將復雜度降為**O(n)**級別。1.關鍵理解&#xff1a;…

交互規則_您必須永不中斷的10條交互設計規則

交互規則重點 (Top highlight)In life, there are certain rules you must never break. If you do there will be hell to pay. In User Interface design there are also rules to live by. They are called “heuristics” or general principles that improve usability in…

一個幫助我100%拿offer的面試學習法

大家好&#xff0c;我是若川。今天周日&#xff0c;再分享一篇相對輕松的文章。文中說的面試學習法有一定的借鑒意義。另外我也推薦大家每隔一段時間不為跳槽的更新自己簡歷&#xff0c;也是對自己一階段的梳理總結&#xff0c;畢竟功在平時。哈嘍大家好&#xff0c;我是大圣&a…

2010年終總結

還有兩天2010就要結束了&#xff0c;寫下自己的年終總結吧&#xff0c;以總結自己&#xff0c;展望明年。2010對我來說是怎樣的一年呢&#xff1f;忙碌的一年&#xff0c;鴨梨更大的一年&#xff0c;折騰的一年&#xff0c;復雜的一年&#xff0c;夢游的一年&#xff0c;痛并快…

java獲取apk啟動activity_兼容 Android 10 啟動 APK 實現方案

背景我們想啟動 APK 程序&#xff0c;有很多種方法&#xff0c;可以使用 Intent&#xff0c;也可以使用 adb shell 命令來啟動&#xff0c;還有通過反射來啟動 APk 程序。我們這里主要討論通過反射的方式來啟動 apk 程序。Android10 之前&#xff0c;我們通過反射來啟動 APK&am…

Android Studio中解決jar包重復依賴導致的代碼編譯錯誤

在原本的代碼中已經使用了OKHTTP和rxjava&#xff0c;然后今天依賴retrofit的時候一直報錯 Program type already present: okhttp3.internal.ws.RealWebSocket$1.class 說是我重復添加了OKHTTP的包&#xff0c;但其實我直接把OKHTTP的依賴注釋掉都沒用&#xff0c;只要依賴ret…

面試被問項目經驗不用慌,按這個步驟回答絕對驚艷

大家好&#xff0c;我是若川。常有小伙伴問&#xff0c;面試時項目經驗怎么回答&#xff0c;經常會分享這篇文章給TA。本文經授權轉載。面試、學習源碼系列、年度總結、JS基礎系列前言本篇文章的作者是來自阿里淘系用戶增長前端團隊的“亦遜”&#xff0c;18年作為雙非本科生通…

使用概念模型 和心智模型的_為什么要使用模型?

使用概念模型 和心智模型的In a former life, I studied critical feminist theory. This included the field of Semiotics — the study of signs and the production of meaning, as well as Deconstruction —the unpacking of meaning to question assumptions.在過去的生…

長效密鑰與臨時密鑰JAVA判斷_MSBuild無法使用臨時密鑰簽署ClickOnce清單(錯誤MSB3326和MSB3321)...

我正在嘗試在Windows Server計算機上構建ClickOnce Windows Forms項目(.NET 3.5 / Visual Studio 2010) . (為了使用Hudson CI自動化構建過程 . )為了對ClickOnce清單進行簽名&#xff0c;我在Visual Studio中創建了一個臨時密鑰 temp.pfx . 我可以在我的工作站上從Visual Stud…

URL some

** 路由系統:URL配置(URLconf)就像Django所支撐網站的目錄. 本質是URL與該URL要調用的函數的映射表 基本格式 : from django.conf.urls import url urlpatterns [url(正則表達式,views視圖,參數,別名) ] 參數 -- 傳給函數視圖的默認參數 (字典形式) 別名 -- 一個可選的name參…