小程序做爲一項非標準的技術,各個小程序平臺之間雖然大致上類似,但依然有很是多的差別。「一次開發多端運行」固然是很是美好的願望,但咱們在設計 Remax 之初就意識到各個小程序平臺之間的差別是沒法被抹平的,每家小程序平臺有太多的私貨,更沒有一個標準來指導咱們該如何抹平這些差別。react
因此咱們在最開始,爲每一個小程序平臺提供了獨立的基礎組件。開發者若是要作跨平臺開發,須要本身去封裝基礎組件。但很快,咱們也意識到這對開發者來講是一件很麻煩的事情,特別是後面咱們要支持更多平臺的話。git
受 CSS 屬性名前綴的啓發,咱們從新設計了 Remax 的跨平臺方案。咱們很是剋制地選取了 9 個基礎組件,統一了他們之間非平臺私有的屬性,而且以屬性名前綴的方式來支持各個平臺私有的特性。咱們但願開發者在作跨平臺開發時能清楚地意識到你寫下的這行代碼只會在特定的平臺上生效。github
Remax One 就是咱們提供的跨平臺解決方案。經過remax/one
提供跨平臺的組件。小程序
import * as React from 'react'; import { View, Button } from 'remax/one'; export default () => { const [count, setCount] = React.useState(0); return ( <View alipay-onAppear={() => console.log('Aha!')}> <View>{count}</View> <Button onTap={() => setCount(count + 1)}>+1</Button> </View> ); };
能夠看到,對於onTap
這樣通用的屬性咱們進行了統一,而支付寶獨有的onAppear
屬性,則須要加上alipay-
的前綴。api
完整的示例項目bash
從模板建立項目:微信
$ npx degit remaxjs/template-one my-app $ cd my-app
或者在已有的項目中引入:app
// remax.config.js module.export = { // 經過設置 one: true 來開啓 Remax One。 one: true, // 經過環境變量區分不一樣平臺的輸出目錄 output: 'dist/' + process.env.REMAX_PLATFORM, };
app.config.js
以及頁面的config.js
配置文件支持多端配置方式:ui
// app.config.js const title = '小程序標題'; const bgColor = '#fff'; const pages = ['pages/index/index']; // 支付寶 exports.alipay = { pages, window: { defaultTitle: title, titleBarColor: backgroundColor, }, }; // 微信 exports.wechat = { pages, window: { navigationBarTitleText: title, navigationBarBackgroundColor: backgroundColor, }, };
經過建立不一樣平臺的同名文件來封裝跨平臺組件和 API。例如:設計
// src/api/showToast/index.js import { showToast } from 'remax/alipay'; export default showToast; // src/api/showToast/index.wechat.js import { showToast } from 'remax/wechat'; export default options => { showToast({ ...options, title: options.content, }); }; // src/pages/index.js import { View } from 'remax-one'; import showToast from '@/api/showToast'; export default () => { return ( <View onClick={() => { showToast({ content: 'Hello World!' }); }} > CLICK ME! </View> ); };
remax-cli
會優先讀取[target].js
文件,這個規則針對 CSS 等其餘文件一樣有效。
如上面所說,咱們很是剋制謹慎地對remax/one
中提供的組件作了篩選和從新設計,只保留了咱們能保證在各個平臺之間行爲一致的組件和屬性。
若是須要使用某個平臺特有的組件,能夠直接從對應平臺導入。如:
import * as React from 'react'; import { View, Text } from 'remax/one'; import { ScrollView } from 'remax/wechat'; export default () => { return ( <ScrollView> <View>view</View> <Text>text</Text> </ScrollView> ); };
若是須要使用某個平臺特有的屬性,能夠經過{平臺前綴}-{平臺原生屬性名稱}
來設置,例如:
import * as React from 'react'; import { View, TapEvent } from 'remax-one'; export default () => { return ( <View id="id" className="class" alipay-onAppear={() => {}} wechat-bindanimationend={() => {}} wechat-disable-scroll={true} onTap={(event: TapEvent) => { console.log(event); }} > view </View> ); };
經過 Remax One 開發者能夠很是方便地構建跨小程序平臺的應用。
另外社區同窗開發的跨平臺組件也正在路上:https://github.com/AnnaSearl/...