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

  • 先实现一端的业务
  • 在另一端新建一个 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 支持,给开发者保留最大的灵活性