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.mzph.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;但实际开发过程中…

识别人声_演唱人声的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;…

游戏 新手引导 设计_我认为每个新手设计师都应该知道什么

游戏 新手引导 设计重点 (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模型格式说明…

交互规则_您必须永不中断的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…

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.在过去的生…

什么?在 VSCode 里也能用 Postman了?

大家好&#xff0c;我是若川。VSCode中有很多好用的插件&#xff0c;今天推荐 Postcode。面试、学习源码系列、年度总结、JS基础系列以前一直在用postman做API测试&#xff0c;如果你同时在使用vscode开发时&#xff0c;每次切出去可能比较烦&#xff0c;其实就是太懒了。。。作…

英语 动画 教学 字母_字母形式在阅读教学中的作用

英语 动画 教学 字母Note: this essay may also be found on Design Observer.注意&#xff1a;这篇文章也可以在 Design Observer 上找到 。 My first-grade reading tutor gave the best stickers. Puffy, smelly, sparkly — she even had a few that were fuzzy. At that …

java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....

1.1.1.1: SDK表单概要说明&#xff1a;我们把流程引擎与表单引擎统称为ccbpm&#xff0c;但是有一些用户并不想使用表单引擎&#xff0c;而是用自己的表单&#xff0c;仅仅使用流程引擎&#xff0c;这样的方式就要采用ccbpm的sdk表单开发模式。关于ccbpm的SDK:ccbpm的sdk就是cc…

乘风破浪的前端小姐姐,是如何一步步走向成功的?

大家好&#xff0c;我是若川。名校毕业的被删大佬也经历了社会的毒打&#xff0c;但她没有放弃。面试、学习源码系列、年度总结、JS基础系列王贝珊&#xff0c;腾讯高级工程师&#xff0c;腾讯 AlloyTeam 成员&#xff0c;现腾讯文档网络层技术负责人。毕业于中山大学。工作 6 …

如何创建和谐的色彩系统

拥有和谐的色彩系统的好处 (The benefits of having a harmonious color system) Consistent branding express across all platform 在所有平台上表达一致的品牌 The consistent interface creates a better user experience 一致的界面创建了更好的用户体验 More productive …

老姚浅谈:怎么学JavaScript?

大家好&#xff0c;我是若川。当初我就是看本文深受启发&#xff0c;开始看书读源码。所以现在联系了作者老姚 授权转载分享给大家。我按照文中的做法敲完了《JavaScript语言精粹 修订版》&#xff0c;在2017年7月23日写出了我的第一篇文章《读书笔记》。看完了《JavaScript面向…

JavaScript 如何使用闭包

闭包基本上是内部函数可以访问其范围之外的变量&#xff0c;可用于实现隐私和创建函数工厂 定义一个数组&#xff0c;循环遍历这个数组并在延迟3秒后打印每个元素的索引 先看一个不正确的写法&#xff1a; const arr [10, 12, 15, 21]; for (var i 0; i < arr.length; i) …