• 1. 修改配置
  • 2. 封装组件
  • 3. 封装小程序原生 API
  • 5 封装 React Hooks
  • 4. 让页面逻辑更像是在写 React DSL
  • 5. 修改 script

    在开始多端开发之前,我们建议开发者循序渐进:

    • 先实现一端的业务
    • 在另一端新建一个 Remax 项目,而不是立即开启多端解决方案
    • 观察业务中的相似处和不同处,加深对产品的理解,构思可复用的逻辑,组件及架构。
    • 时机合适时融合 Remax 项目,整合出属于自己的跨多端解决方案。

    你可以使用脚手架快速开始:

    1. npx degit remaxjs/template-universe my-app
    2. # typescript
    3. npx degit remaxjs/template-universe-typescript my-app

    现在让我们来看看如何利用 Remax 打造多端解决方案。(以微信和支付宝为例)

    1. 修改配置

    改造 app.config.js 以及页面的 config.js 配置文件:

    1. // app.config.js
    2. const title = '小程序标题';
    3. const bgColor = '#fff';
    4. const pages = ['pages/index/index'];
    5. // 微信
    6. exports.wechat = {
    7. pages: ['pages/wechat/index', ...pages],
    8. window: {
    9. navigationBarTitleText: title,
    10. navigationBarBackgroundColor: baColor,
    11. },
    12. };
    13. // 支付宝
    14. exports.alipay = {
    15. pages: ['pages/alipay/index', ...pages],
    16. window: {
    17. defaultTitle: 'Alipay Todo App',
    18. titleBarColor: backgroundColor,
    19. },
    20. };
    21. // 头条
    22. exports.toutiao = {
    23. pages: ['pages/toutiao/index', ...pages],
    24. window: {
    25. defaultTitle: 'Toutiao Todo App',
    26. titleBarColor: backgroundColor,
    27. },
    28. };

    如果没有默认导出,Remax 会去读取对应平台的配置信息,通过 config.js,开发者还可以复用多端共用的配置逻辑。

    2. 封装组件

    建立你自己的组件库

    1. // src/components.js
    2. // 为了方便示例,这里将逻辑都写在一起,实际中开发者可以根据自己的需要合理规划代码
    3. import * as React from 'react';
    4. import { View as WechatView, Text as WechatText } from 'remax/wechat';
    5. import { View as AlipayView, Text as AlipayText } from 'remax/alipay';
    6. import { View as ToutiaoView, Text as ToutiaoText } from 'remax/toutiao';
    7. import { Platform } from 'remax';
    8. export function View(props) {
    9. switch (Platform.current) {
    10. case 'wechat': {
    11. // 封装微信端的 View 组件逻辑,处理微信端的样式
    12. ...
    13. return <WechatView {...props} />;
    14. }
    15. case 'alipay': {
    16. // 封装支付宝端的 View 组件逻辑,处理支付宝端的样式
    17. ...
    18. return <AlipayView {...props} />;
    19. }
    20. case 'toutiao': {
    21. // 封装头条端的 View 组件逻辑,处理头条端的样式
    22. ...
    23. return <ToutiaoView {...props} />;
    24. }
    25. }
    26. }
    27. export function Text(props) {
    28. switch (Platform.current) {
    29. case 'wechat': {
    30. // 封装微信端的 Text 组件逻辑,处理微信端的样式
    31. ...
    32. return <WechatText {...props} />;
    33. }
    34. case 'alipay': {
    35. // 封装支付宝端的 Text 组件逻辑, 处理支付宝端的样式
    36. ...
    37. return <AlipayText {...props} />;
    38. }
    39. case 'toutiao': {
    40. // 封装头条端的 Text 组件逻辑, 处理支付宝端的样式
    41. ...
    42. return <ToutiaoText {...props} />;
    43. }
    44. }
    45. }

    Remax 已经为开发者准备了每个平台的 React 支持,开发者拥有了“手”和“脚”,就可以根据自己的业务特点,打造属于自己的跨多端组件,保持最佳的灵活性和可维护性,一切对开发者都是透明的。 你可以以一端为标准,抹平多端差异,或者建立自己的组件接口,这一切都将有开发者灵活掌控

    3. 封装小程序原生 API

    和组件一样,开发者可以封装属于自己的 API 逻辑

    1. // src/api.js
    2. // 为了方便示例,这里将逻辑都写在一起,实际中开发者可以根据自己的需要合理规划代码
    3. import * as React from 'react';
    4. import { navigateTo as wechatNavigateTo } from 'remax/wechat';
    5. import { navigateTo as alipayNavigateTo } from 'remax/alipay';
    6. import { navigateTo as toutiaoNavigateTo } from 'remax/alipay';
    7. import { Platform } from 'remax';
    8. export function navigateTo(...params) {
    9. switch (Platform.current) {
    10. case 'wechat': {
    11. // 封装微信端的 navigateTo 逻辑
    12. ...
    13. return wechatNavigateTo(...params);
    14. }
    15. case 'alipay': {
    16. // 封装支付宝端的 navigateTo 逻辑
    17. ...
    18. return alipayNavigateTo(...params);
    19. }
    20. case 'alipay': {
    21. // 封装头条端的 navigateTo 逻辑
    22. ...
    23. return toutiaoNavigateTo(...params);
    24. }
    25. }
    26. }
    27. export function getUserinfo(...params) {
    28. switch (Platform.current) {
    29. case 'wechat': {
    30. ...
    31. // 封装微信端的 getUserinfo 逻辑
    32. }
    33. case 'alipay': {
    34. ...
    35. // 封装支付宝端的 getUserinfo 逻辑
    36. }
    37. case 'toutiao': {
    38. ...
    39. // 封装头条端的 getUserinfo 逻辑
    40. }
    41. }
    42. }

    和组件一样,API 也做同样的封装,这里以微信小程序为标准,统一封装了 getUserinfo API 行为

    5 封装 React Hooks

    同样是多态封装的思想,这里不再赘述。

    4. 让页面逻辑更像是在写 React DSL

    有了组件, API,Hooks 的多态支持,我们可以写跨多端的页面了。由于我们对基础支持做了很好的封装,页面可以专注于业务逻辑,就好比在写 React DSL 一般,这不仅有助于做跨多端开发,对整体项目的一致性,可维护性都有极大的帮助,甚至你都很简单地将 Remax 切换成其他框架!

    1. // page.js
    2. import * as React from 'react';
    3. // Remax 默认支持 '@/' 别名
    4. import { View, Text } from '@/components';
    5. import { getUserinfo } from '@/api';
    6. import { useMyHook } from '@/hooks';
    7. export default () => {
    8. useMyHook();
    9. React.useEffect(() => {
    10. getUserinfo(...params);
    11. // do sth...
    12. });
    13. return (
    14. <View>
    15. <Text>我是跨多端统一页面</Text>
    16. </View>
    17. );
    18. };

    跨多端页面搭建成功!你可以看到这是一个非常专注于业务的页面,除了 React 和业务逻辑没有多余的概念,非常便于维护和升级

    5. 修改 script

    修改 package.json 中的命令

    1. {
    2. "scripts": {
    3. "dev": "remax build -w -t",
    4. "build": "NODE_ENV=production remax build -t"
    5. }
    6. }

    现在可以编译到不同平台了

    1. npm run build wechat
    2. npm run build alipay
    3. npm run build toutiao
    4. ...

    完成!

    通过这篇指南,我们想告诉开发者,跨平台开发更考验的是对业务的理解和整合,这本质上是从编程思想去思考的事情,因此 Remax 专注于提供 React 支持,给开发者保留最大的灵活性