基於React語法,將RN項目轉化爲小程序項目css
該小程序能同時在 微信小程序 和 支付寶小程序這兩個平臺運行html
能將已有RN項目轉化爲微信小程序的工具, 好比 Alita ,但它不能轉成支付寶或其餘小程序vue
從零開發的多端框架,好比Taro(京東),chameleon(滴滴), uni-app等等,問題在於:不少框架,好比uni-app,chameleon是基於Vue語法的,沒法適用咱們React項目的狀況react
專門設計的微信小程序框架(mpvue,webpy) ,問題也是和上面相似,Vue的語法,並且只是針對微信小程序的git
Alita介紹:它是京東的ARES多端技術團隊,開發的React Native一鍵轉化爲微信小程序的工具。不過只能轉成微信小程序,不能專成支付寶小程序github
Alita的特性: Alita不是新的框架,也沒有提出新的語法規則,她只作一件事,就是把你的React Native代碼運行在微信小程序端。因此Alita的侵入性很低,選用與否,並不會對你的原有React Native開發方式形成太大影響。web
Taro介紹:它是由京東凹凸實驗室開發的多端框架json
Taro的定位:它和Alita不一樣,不是既有項目的轉化工具,而是從零開始開發的多端框架。redux
Taro特性:使用 Taro,咱們能夠只書寫一套代碼,再經過 Taro 的編譯工具,將源代碼分別編譯出能夠在不一樣端(微信/百度/支付寶/字節跳動/QQ小程序、快應用、H五、React-Native 等)運行的代碼。小程序
alita -i rnProject -o wxProject
// 修改前的 good style import React, {Component } from 'react'; // 修改後的 bad style import React, {Component as BadComponent} from 'react'; export default class C extends BadComponent { }
A類問題
這些不符合eslint的代碼是會有警告的
高階組件限制,也就是路由深度不大於5層
動畫組件要使用alita的
靜態限制
global變量不容許使用
一個文件最多隻能定義一個組件
React Native基本組件不支持屬性展開
this.props.xxComponent 要寫徹底
使用高階組件
B類問題
這些問題,eslint插件沒有提示,同時根據咱們的使用習慣,有可能會這樣用的代碼風格
路由組件須要用@areslabs/router
ref 必須是方法,不支持字符串
不支持 onLayout 方法
代碼體積限制:壓縮的代碼小於 4M,分包 8M,大於的話就不行
函數組件在定義時候沒有同時導出
C類問題
這些約束,eslint插件沒有提示,可是咱們通常都不會這麼寫,除非做死
for循環中返回組件,key不指定
做爲props的組件進行多層級傳遞
從外部引用JSX片斷
Taro其實也有一個叫eslint-config-taro 的eslint插件幫助檢查各類不符合Taro要求的代碼風格,總結以下
改造難度從上往下遞減,上面難,下面簡單
P1. Animation, 原平生臺組件和第三方組件Taro是不支持的,須要尋找方法規避轉化問題
P2. 設計稿的單位,尺寸匹配問題等問題須要修改解決的思路
P3. RN用的樣式編碼方式和引用方式須要修改
P4. 路由系統要修改成Taro自帶的路由系統 和 API
P5. 網絡請求要修改,fetch/Ajax 等原生的要改爲Taro的Taro.request這一API
P6. 引用圖片、音頻、字體等文件的方式要改
P7. 部分RN樣式屬性值Taro是沒有的,並且部分樣式屬性的默認值RN和Taro不一致
P8.由於小程序的特殊需求,致使部分代碼不符合Taro的編碼規範,總結以下
P9. aync/await的使用要經過導入taro的包來開啓
P10.redux的使用改成 @tarojs/redux
若是是小範圍的改動,能夠經過平臺變量process.env.TARO_ENV去規避(值有 weapp/alipay/h5/rn)
若是是大範圍的改動,能夠經過腳本後綴名差別的方式區分小程序和RN平臺(xxx.weapp.js和xxx.js)
設計稿的單位要修改, Taro彷佛不支持純數字的長度,因此要改爲rem或者Px
設計稿尺寸匹配問題,Taro默認是根據750的設計稿匹配的,能夠在配置文件的designWidth屬性中進行修改
若是是行內長度樣式,那麼要作手動轉換:Taro.pxTransform(10)
RN是經過向style中導入對象的方式引入樣式,而Taro是經過className結合import樣式文件的方式引入樣式
RN的屬性命名方法是駝峯,而Taro是短橫線
react-native的樣式編碼方式
class App extends React.Component { render () { return () } } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#000', opacity: 0.6 } })
Taro的樣式編碼方式(相似傳統的CSS編碼方式)
// index.js import "index.css" class App extends React.Component { render () { return () } } // index.css .bar { height: 10Px; background-color:'10px' }
P4.路由系統要修改成Taro自帶的路由系統 和 API
import Taro from '@tarojs/taro'
Taro.navigateTo(params).then(...)
P5. 網絡請求要修改,fetch/Ajax 等原生的要改爲Taro的Taro.request這一API
import Taro from '@tarojs/taro' Taro.request({ url: 'http://localhost:8080/test', data: { foo: 'foo' }, header: { 'content-type': 'application/json' } }).then( res => console.log(res.data) )
RN用的是<Image source={...} />和<ImageBackground source />
Taro用的是<Image src={...} />
// 引用文件 import namedPng from '../../images/path/named.png' // 使用 <View> <Image src={namedPng} /> </View>
P7. 部分RN樣式屬性值Taro是沒有的,並且部分樣式屬性的默認值RN和Taro不一致
部分屬性值存在差別,例如marginVertical,paddingVertical等等,RN有,可是Taro沒有
部分屬性的默認值存在區別,在RN中,flexDirection默認是column,而在其餘的平臺中,flexDirection默認是row
// 錯誤 const element = <View bindtap={this.onTag} /> // 正確 const element = <View onClick={this.onTag} />
(2)不能對this.props.children作任何操做
// 錯誤的兩種寫法 this.props.children && this.props.children this.props.children[0]
(3)不能使用 Array#map 以外的方法操做 JSX 數組
// 錯誤,JSX數組不能用非Map方法,普通數組才能夠 const components = [<Component />...]; components.find(component => { return component === <View /> })
P9. aync/await的使用要經過導入taro的包來開啓
import '@tarojs/async-await' // 下面就能夠正常使用async/await了
參考資料
Alita官網 https://github.com/areslabs/alita Taro官網 https://taro.aotu.io/