Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React Native 项目 Web 端同构初探

React Native 项目 Web 端同构初探

作者头像
胡琦
发布于 2021-09-09 02:34:18
发布于 2021-09-09 02:34:18
3.6K00
代码可运行
举报
文章被收录于专栏:胡琦胡琦
运行总次数:0
代码可运行

“使用 JavaScript 来开发移动端 App 似乎是众多小厂比较普遍的选择,作为拷贝经验丰富的 Copy 工程师,我所在的小作坊采用的是 React Native。尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期。“Learn once, write anywhere”,完全不影响 React Native 沦为“不会 JavaScript 也能用”的框架,那如何将在 React Native 项目中引入 react-native-web 呢? ”

react-native-web 简介

仓库地址:https://github.com/necolas/react-native-web

react-native-web 是由 前 Twitter 现 Facebook 工程师 Nicolas Gallagher 实现并维护的开源项目,是一个使 React Native 组件和 API 能运行在 Web 上的库,其和 React Native Windows, React Native macOS 等库将 React Native 拓展到一个又一个新的平台。目前推特、expo、大联盟足球、Flipkart、优步、《泰晤士报》、DataCamp 以及我们小作坊都在生产中使用了 react-native-web。Chrome、Firefox、Edge,Safari 7 +、IE 10+都支持通过 react-native-web 构建的 web 应用。当然值得注意的是,官方文档明确表示不支持 React Native 中不推荐使用的组件和 API,因此如果您项目中的某些功能依赖第三方库,可能那部分的功能在 web 端同构时需要额外处理。

浅显地认为react-native-web就是把React Native的组件和API都用适用于Web的标签和API再适配实现一遍,使其在Web上的行为和在原生应用上尽量保持一致,从文档中提到的 Alert 和 Setting 模块以及其对应的源码中大概能感受到一二,比如TextInput:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  switch (keyboardType) {
    case 'email-address':
      type = 'email';
      break;
    case 'number-pad':
    case 'numeric':
      inputMode = 'numeric';
      break;
    case 'decimal-pad':
      inputMode = 'decimal';
      break;
    case 'phone-pad':
      type = 'tel';
      break;
    case 'search':
    case 'web-search':
      type = 'search';
      break;
    case 'url':
      type = 'url';
      break;
    default:
      type = 'text';
  }
  if (secureTextEntry) {
    type = 'password';
  }

因此也借鉴了 React Native 的一些代码,作为适配的依据。

如果您想基于 React Native 实现多端统一化方案,可参考去哪儿前端团队的实现方案:跨端开发, 仓库地址:https://github.com/qunarcorp/qrn-remax-unir

添加到React Native项目

一般来说新建 React Native 项目时可以选用 expo-cli 或者 react-native-cli 来创建。expo-cli 中已经预置了对web的支持,如下图所示.

expo-cli web

而我们实际开发中可能用 react-native-cli脚手架来构建项目比较多些,那么如何引入 react-native-web呢?

我们先初始化项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx react-native init rn_web
# 当然也可以使用模板,如
# npx react-native init rn_web --template react-native-template-typescript

此时我们的项目并不支持在web中使用:

为了项目能在web环境中运行,我们需要借助今天的主角--react-native-web,有请主角出台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd rn_web
yarn add react-native-web
yarn add -D babel-plugin-react-native-web webpack webpack-cli webpack-dev-server html-webpack-plugin react-dom babel-loader url-loader @svgr/webpack

接着我们施展Copy大法,将我们初始化能用到的App.web.jsxindex.htmlindex.web.jswebpack.config.js这几个文件一把 down下来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -L https://gist.github.com/hu-qi/bde8a6d2b45325d93b1665174f938faa/download | tar -xvz --strip-components=1

react-native-web

然后在package.json中添加buildweb的脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"build": "rm -rf dist/ && webpack --mode=production --config webpack.config.js",
"web": "webpack serve --mode=development --config webpack.config.js"

yarn run

就和 expo-cli 初始化的项目一样可以执行yarn web,这时会在本地8080端口运行一个服务,这时我们分别执行yarn iosyarn android就能看到在ios模拟器和Android模拟器中显示和web端一模一样的页面,一次 react-native-web 的多端同构 Hello World 就成功实现了,当然这也意味着我们还可能编译成小程序,后续有机会一起探讨探讨!

react-native-web

此处的注意点:

  1. 代码能得以成功拷贝全靠**当然也可以选择去网页下载;
  2. Android能得以成功运行,全靠给权限sudo 755 android/gradlew;
  3. React Native 入口文件需修改为 App.web,不然只有Web端才能读取App.web.js;
  4. 适当执行./gradlew clean重新yarn android等多年经验积累骚操作排除故障.

探究代码

关键的操作在于那行Copy代码的命令,那究竟上文中提到到下载了4的文件到底做了啥呢?Copy攻城狮心中也有一个大大的问号,Talk is cheap, show me the code,打开文件看看那些代码吧!

index.html常见的单页面应用入口,像下面代码中的 div 我们称其为“根” DOM节点,因为其中的所有内容都将由React DOM进行管理。在当前案例中,我们只是设置一些基本样式以使主体div具有完整的高度和宽度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <html> 
... 
... 
  <body> 
    <div id =“ app-root”> </ div> 
  </ body> 
</ html>

index.web.js

使用index.web.js可以在Web和移动端之间区分开来,通过.web.js扩展名可以使该文件仅在Web上使用,其他一些可用的扩展如.native.js.ios.js.android.js适用于移动端。当然,如果您希望将本不同端的代码都保存在一个index.js文件中,则可以使用import { Platform } from 'react-native'来按照条件区分不同平台的代码。可以参考React Native官方文档中有关平台特定代码的更多信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index.web.js:
... 
...
AppRegistry.runApplication(appName,{ 
  initialProps:{},
  rootTag:document.getElementById('app-root'),
};

这与我们移动端的index.js非常相似,不过它还将您的应用程序挂载到根目录中index.html的div上。

webpack.config.js

webpack虽然是重点内容,但此处不过过多介绍,请前往官方文档或掘金社区阅读更加详细的内容,此案例中我们用到了三个插件:

  • HtmlWebpackPlugin创建HTML;
  • DefinePlugin定义变量,例如__DEV__NODE_ENVreact-native-web

App.web.tsx

该文件是临时添加的文件,用于在使用React Native Web 同构之前验证我们的设置是否正常运行。最终,您可以删除此文件,因为App的入口js文件可以在移动端运行,也能在Web端运行。不过为了处理某些在Web上能运行而在移动端不能运行的业务,需要将代码抽离出来存放在``.web.js`为后缀的文件中。

后记

结合上述的简单案例,在后续实际业务中,我们可以逐步尝试同构业务到Web并逐步进行验证。

希望这篇文章对您有所启发,也请各位大佬多多指教!评论区始终为您敞开!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 胡琦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes微服务常见概念及应用
两类角色:master节点和worker节点。master用于调度和管理集群资源,worker节点是资源的提供者。worker节点提供的资源单位叫pod,可以理解为k8s云平台提供的虚拟机,pod中存放的是应用容器,比如docker容器。容器是cpu和内存的资源隔离单位,大部分情况下一个pod中只住一个应用容器,也有一个主容器多个辅助容器的情况,一个pod内的容器共享网络栈和存储资源。
才浅Coding攻略
2022/12/12
1.3K0
Kubernetes微服务常见概念及应用
kubernetes 权威指南学习笔记(2) -- 基本概念和术语
Master 只的是集群控制节点,每个集群需要一个检点来负责整个集群的管理和控制。 基本上所有控制命令都发给它,它来负责具体的执行过程。
solate
2019/07/22
9650
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
可以使用 kubectl 命令行创建对象,也可以编写 .yaml 格式的文件进行创建
Lansonli
2022/06/07
1.3K0
【云原生 | Kubernetes篇】深入Kubernetes(k8s)概念(四)
kubernetes入门-概念篇
Kubernetes is an open-source platform for automating deployment, scaling, and operations of application containers across clusters of hosts, providing container-centric infrastructure.
王磊-字节跳动
2019/05/28
2.5K0
Kubernetes整理
一般做法:容器A共享容器B$ docker run --net=B --volumes-from=B --name=A image-A ...,这种做法会存在一个问题,容器AB的关系从对等变成了拓扑。
铭丶
2021/03/12
7440
kubernetes(八) kubernetes的使用
1、[preflight] 检查环境是否满足条件 2、[kubelet-start] 启动kubelet 3、[certs] /etc/kubernetes/pki 生成apiserver和etcd两套证书 4、[kubeconfig] 连接apiserver的配置文件 5、[control-plane] 静态Pod /etc/kubernetes/manifests 6、[etcd] 静态pod启动etcd 7、[upload-config] 将kubeadm配置存放到kube-system configmap 8、[kubelet] 将kkubelet配置存放到kube-system configmap 9、[mark-control-plane] node-role.kubernetes.io/master='' 说明master节点不调度pod 10、[bootstrap-token] 为kubelet自动颁发证书机制 11、安装插件 CoreDNS kube-proxy
alexhuiwang
2020/09/23
7860
kubernetes(八) kubernetes的使用
云原生基础设施之Kubernetes
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
山河已无恙
2023/03/02
1.4K0
云原生基础设施之Kubernetes
kubernetes | 存储
基于centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0
Amadeus
2022/10/25
4650
kubernetes | 存储
Kubernetes之Pod、 Replicaset、 Service、Deployment和Label
deploy控制RS,RS控制Pod,这一整套,向外提供稳定可靠的Service。
菲宇
2019/06/12
1K0
Kubernetes之Pod、 Replicaset、 Service、Deployment和Label
kubernetes中其他控制器之PodSecurityPolicy
PodSecurityPolicy是集群级别的Pod安全策略,自动为集群中的Pod和Volume设置Security Context。
极客运维圈
2020/03/23
1.6K2
6-Kubernetes入门基础之服务发现Service介绍
描述: K8s中的Service实际上是微服务框架中的微服务,Service定义了一个服务的访问入口,可以通过该入口访问其背后一组的有Pod副本组成的集群实例;
全栈工程师修炼指南
2022/09/29
2.8K0
6-Kubernetes入门基础之服务发现Service介绍
kubernetes 功能介绍
每个Node 节点上都运行着以下一组关键进程 - 1. kubelet:负责pod对应的容器创建、启停等任务,同时与master 节点密切协作,实现集群管理的基本功能。 - 2. kube-proxy:实现kubernetes Service 的通信与负载均衡机制的重要组件。 - 3. Docker Engine: Docker 引擎,负责本机的容器创建和管理工作。
菲宇
2019/06/15
1.7K0
关于 Kubernetes中一些基本概念和术语笔记
Kubernetes中的大部分概念如Node, Pod,Replication Controller, Service等都可以看作一种“资源对象”几乎所有的资源对象都可以通过Kubernetes提供的kubect工具(或者API编程调用)执行增、删、改、查等操作并将其保存在etcd中持久化存储。从这个角度来看,Kubernetes其实是一个高度自动化的资源控制系统,它通过`跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错的高级功能。
山河已无恙
2023/03/02
1K0
关于 Kubernetes中一些基本概念和术语笔记
Kubernetes服务访问
通过 Deployment 来创建一组 Pod 来提供具有高可用性的服务。虽然每个 Pod 都会分配一个单独的 Pod IP,然而却存在如下两个问题:
cuijianzhe
2022/06/14
6450
Kubernetes服务访问
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5.1K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
Kubernetes容器集群管理环境 - Prometheus监控篇
一、Prometheus介绍 之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana。Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的。自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有一个非常活跃的开发者和用户社区。它现在是一个独立的开放源码项目,并且独立于任何公司,为了强调该点并澄清项目的治理结构,Prometheus在2016年加入了云计算基金会,成为继Kubernetes之后的第二个托管项目。 Prometheus是用来收集数据的,同时本身也提供强大的查询能力,结合Grafana即可以监控并展示出想要的数据。
洗尽了浮华
2019/07/10
2.1K0
Kubernetes容器集群管理环境 - Prometheus监控篇
Kubernetes学习笔记
Pod: kubernetes管理的主要对象,可以由一个或者共享资源的一组容器组成 kubelet: 管理worker node和master node之间的通信 kube-proxy: 运行在work node上,用于管理Node和Pod的网络通信 API Server: 提供API服务 Scheduler: 选择worker node运行Pod Controller: 监控Pod数量,控制worker node Worker node: 运行Pod的机器或者虚拟机 Master node: 运行Control Plane的机器或者虚拟机
宅蓝三木
2024/10/09
1150
Kubernetes学习笔记
kubernetes-核心概念及创建应用(六)
•Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。 •K8S用于容器化应用程序的部署,扩展和管理。 •K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。 •Kubernetes目标是让部署容器化应用简单高效。 官方网站:http://www.kubernetes.io
yuezhimi
2020/09/30
3850
kubernetes-核心概念及创建应用(六)
Kubernetes之Pod, Replicaset, Deployment, Label, Service
Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namespace,是Kubernetes调度的基本单位。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务.
jwangkun
2021/12/23
2830
Kubernetes容器集群管理环境 - 完整部署(下篇)
在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程:
洗尽了浮华
2022/03/29
7580
Kubernetes容器集群管理环境 - 完整部署(下篇)
相关推荐
Kubernetes微服务常见概念及应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验