如果開(kāi)發(fā)者使用 Remax 官方模板開(kāi)始開(kāi)發(fā),應(yīng)該會(huì)注意到以下代碼:
Remax 本身沒(méi)有提供類 React DSL 或者自己去實(shí)現(xiàn) React。 開(kāi)發(fā)者應(yīng)該意識(shí)到你使用的就是 React 官方庫(kù),你可以自己選擇 React 版本,選擇 React 相關(guān)的 store 方案,表單管理方案等等。而像 React Hooks 等特性自然都可以正常使用。
小程序平臺(tái)不是 Web 環(huán)境,Remax 對(duì)標(biāo)的就是 React DOM / React Native。正如 web 平臺(tái)的類庫(kù)不能在 react native 中使用一樣,小程序中也應(yīng)該使用小程序的類庫(kù)。目前 React 在 小程序的生態(tài)圈還不夠完善,這也給了開(kāi)發(fā)者們很大的空間去發(fā)揮。
Remax 支持直接使用原生組件庫(kù)。具體請(qǐng)參考 指南 - 小程序自定義組件。目前得知社區(qū)中已有開(kāi)發(fā)者在開(kāi)發(fā) React 小程序組件庫(kù),值得期待。
支持,具體可參考 跨平臺(tái)開(kāi)發(fā)。
性能問(wèn)題在出現(xiàn)之前,都不是問(wèn)題。這是我們想先告訴開(kāi)發(fā)者的一個(gè)概念,提前考慮性能問(wèn)題是缺少實(shí)際場(chǎng)景的考慮。
由于 Remax 的實(shí)現(xiàn)在運(yùn)行時(shí)中做了很多事情,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)有一種黑盒的既視感,開(kāi)發(fā)者會(huì) 預(yù)設(shè) Remax 在處理很復(fù)雜的邏輯,性能 "一定" 也會(huì)受影響。關(guān)于這點(diǎn)我們會(huì)從三個(gè)方面來(lái)看:
小程序本身的文檔會(huì)有明確的關(guān)于性能的說(shuō)明,其中最重要的兩項(xiàng)是
React 的虛擬 DOM 機(jī)制在 Remax 中存在于邏輯層,小程序框架本身是不會(huì)理會(huì) React 的虛擬 DOM 的。因此如果開(kāi)發(fā)者本身沒(méi)有處理好 React Pure Render 這個(gè)事情,性能問(wèn)題會(huì)在小程序中被放大。
把 React 跑在小程序的邏輯層之上,是無(wú)可避免會(huì)增長(zhǎng)開(kāi)銷的,而渲染層的動(dòng)態(tài)模板邏輯相對(duì)靜態(tài)模板也會(huì)有一定損耗。但是 Remax 會(huì)對(duì) setData 的傳輸量做壓縮和精簡(jiǎn),保證每次更新只會(huì)修改變化的部分。
綜合上述來(lái)看,我們總結(jié)了一下目前開(kāi)發(fā)者遇到的性能問(wèn)題的幾個(gè) case:
如果使用了 Redux 的 connect ,請(qǐng)將 connect 的 option.forwardRef 設(shè)置為 true文檔。其它第三方庫(kù)的高階組件的處理方式也類似。原因如下。
對(duì)于使用 class 組件的頁(yè)面,Remax 會(huì)通過(guò) ref 獲取頁(yè)面生命周期。當(dāng)頁(yè)面組件被高階組件(有時(shí)被稱為 HOC)包裹時(shí),通過(guò) ref 取得的是 HOC 最外層的容器組件,而不是被包裹的組件 。我們需要 React.forwardRef
將 ref 轉(zhuǎn)發(fā)到內(nèi)部組件。
import React, { forwardRef } from 'react';import { View } from 'remax/alipay';class IndexPage extends React.Component {onReady() {console.log('onReady被調(diào)用');}render() {return <View>這是一個(gè)例子</View>;}}// HOC 的容器是一個(gè)函數(shù)式組件const HOC = Component => {const Wrapped = (props, ref) => {// 一些高階組件的邏輯return <Component {...props} ref={ref} />;};return forwardRef(Wrapped);};// 另一種情況,HOC 容器是一個(gè) class componentconst ClazzHOC = Component => {class Wrapped extends React.Component {// 另一些高階組件的邏輯render() {const { forwardRef, ...rest } = this.props;return <Component {...rest} ref={forwardRef} />;}}// 比起第一種情況,這里的處理要稍微麻煩一些return forwardRef((props, ref) => <Wrapped {...props} forwardRef={ref} />);};// 下面這三種方式導(dǎo)出的頁(yè)面都是可以按照預(yù)期調(diào)用 `onReady`export default ClazzHOC(IndexPage);// export default HOC(IndexPage);// export default IndexPage;
Remax 默認(rèn)為微信的每個(gè) host 組件定義了嵌套層數(shù)。其中 View
20 層,其他組件都在 1 ~ 5 層。如果出現(xiàn)形如下圖的情況,可以通過(guò)配置修改嵌套層數(shù)。
// remax.config.js{UNSAFE_wechatTemplateDepth: {button: 2, // 把 button 的嵌套層數(shù)修改為 2 層}}
更多建議: