Remax One - 重新設計小程式的跨平臺開發

yesmeck發表於2020-07-20

跨平臺開發的挑戰

小程式作為一項非標準的技術,各個小程式平臺之間雖然大體上相似,但依然有非常多的差異。“一次開發多端執行”當然是非常美好的願望,但我們在設計 Remax 之初就意識到各個小程式平臺之間的差異是無法被抹平的,每家小程式平臺有太多的私貨,更沒有一個標準來指導我們該如何抹平這些差異。

所以我們在最開始,為每個小程式平臺提供了獨立的基礎元件。開發者如果要做跨平臺開發,需要自己去封裝基礎元件。但很快,我們也意識到這對開發者來說是一件很麻煩的事情,特別是後面我們要支援更多平臺的話。

Remax One

受 CSS 屬性名字首的啟發,我們重新設計了 Remax 的跨平臺方案。我們非常剋制地選取了 9 個基礎元件,統一了他們之間非平臺私有的屬性,並且以屬性名字首的方式來支援各個平臺私有的特性。我們希望開發者在做跨平臺開發時能清楚地意識到你寫下的這行程式碼只會在特定的平臺上生效。

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-的字首。

完整的示例專案

使用

從模板建立專案:

$ npx degit remaxjs/template-one my-app
$ cd my-app

或者在已有的專案中引入:

// remax.config.js
module.export = {
  // 通過設定 one: true 來開啟 Remax One。
  one: true,
  // 通過環境變數區分不同平臺的輸出目錄
  output: 'dist/' + process.env.REMAX_PLATFORM,
};

小程式配置

app.config.js以及頁面的config.js配置檔案支援多端配置方式:

// 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/...

相關文章