一框架三端:基于Taro 探索PC、H5与小程序前端开发解决方案

前言

随着现在市面上端的形态多种多样,Web、H5、微信小程序等,大家肯定都遇到业务要求同时在不同的端上线。

然而大多数产品,不同端页面 UI 展示差异性比较大,团队大多数会选择不同端拆分成不同的项目 。但是也会有种情况,不同端页面 UI 差异比较小,那这种情况下编写一套代码 能够适配到多端就能极大的提高开发效率

背景

最近遇到一个项目,需要适配 PC,H5 和微信小程序 ,并且项目属于中后台管理系统,UI 差异性小,且 PC 端需要支持一些复杂的功能。

本人 React 框架比较熟练,仔各个社区搜了一波,目前大多的前端框架虽然适配多端,但是由于框架本身为了保证不同端的统一性以及稳定性,都不太符合项目的诉求。具体有以下几个问题:

  1. UI 组件库对于中后台管理系统,组件功能少;
  2. 框架更加侧重 C 端适配,对于中后台需要复杂的权限管理不太支持;

技术选型

在框架上选择了 Taro,但是针对以上两个问题,决定再引入两个 UI 库

  1. Antd-Design

💡 建议使用antd5,全面使用css-in-js 减少了公共样式的引入,可以按需加载,减少了打包项目体积。

  1. NutUI

问题汇总

页面路由配置

诉求:不同端入口不同,页面或者组件不同端定制化

不同端入口不同

tsx 复制代码
// app.config.ts
// PC端 移动端
if (process.env.TARO_ENV === 'h5') {
  CustomConfig = {
    // 入口文件
    entryPagePath: 'pages/main/home/index',
    pages: [
      'pages/main/home/index',
      'pages/main/login/index',
      'pages/main/signIn/index',
    ],
  };
} else {
  // 小程序
  CustomConfig = {
    // 入口文件
    entryPagePath: 'pages/index/index',
    pages: ['pages/index/index', 'pages/notice/index', 'pages/account/index'],
    // 小程序拆包
    subPackages: [
      {
        root: 'pages/main',
        pages: ['login/index', 'signIn/index'],
      },
    ],
    tabBar: {
      color: '#000000',
      selectedColor: '#0B4F4A',
      backgroundColor: '#ffffff',
      list: [
        {
          pagePath: 'pages/listing/index',
          text: '首页',
        },
        {
          pagePath: 'pages/dataCenter/index',
          text: '消息中心',
        },
        {
          pagePath: 'pages/account/index',
          text: '个人中心',
        },
      ],
    },
  };
}

页面或者组件不同端定制化

markdown 复制代码
├── src # 代码源文件,可以使用别名 `@` 引用该目录下的文件,如:
│ ├── components # 可复用组件
│ │ ├── Header # 页面组件 Header
│ │ │ └── index.tsx # 小程序组件
│ │ │ └── index.h5.tsx # H5 和 PC 端组件
│ │ └── Side  
│ │ └── index.tsx  
│ │ └── index.h5.tsx
│ ├── pages
│ │ ├── Login # 登陆页
│ │ │ └── index.tsx # 小程序
│ │ └── index.h5.tsx # H5 和 PC 端组件

PC 端 H5 小程序 样式适配

诉求:不同端统一的尺寸换算方式

统一 Root Size

jsx 复制代码
{
  mini: {
    postcss: {
      pxtransform: {
        enable: true,
        config: {
          selectorBlackList: ['nut-'],
          baseFontSize: 14,
          maxRootSize: 14,
        },
      },
    },
  },
  h5: {
    postcss: {
      pxtransform: {
        enable: true,
        config: {
          selectorBlackList: ['nut-'],
          baseFontSize: 14,
          maxRootSize: 14,
        },
      }
    }
  }
}

PC 端 H5 响应式布局

tsx 复制代码
<Row justify='center' gutter={24}>
	<Col xs={24} md={10} lg={10} xl={10}>
<Row>

媒体查询

scss 复制代码
@media (min-width: 756px) {
  // PC 端
}

💡 踩坑: 媒体查询在微信小程序上不生效,所以默认 UI 以 H 5为标准,再对 PC 端进行特殊处理

打包体积优化

诉求:两个 UI 库,避免包体积过大,按需加载

webpack-bundle-analyzer

jsx 复制代码
h5: {
    webpackChain(chain, webpack) {
      chain
        .plugin('analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, []);
	}
}

通过分析图得知,@nutui/icons-react-taro 被多次引入,即使页面中没有使用到 icon。

因此可以通过配置 webpack,进行拆包

jsx 复制代码
webpackChain(chain, webpack) {
      chain
        .plugin('analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, []);
      chain.merge({
        optimization: {
          splitChunks: {
            chunks: 'all',
            minSize: 30000,
            minChunks: 3, // 最少被引入 3 次
            automaticNameDelimiter: '.',
            cacheGroups: {
              vendor: {
                test: /[\/]node_modules[\/]/, // 分析 node_modules
                name: 'vendors',
                minSize: 30000,
                minChunks: 1,
                chunks: 'initial',
                priority: 1,
              },
            },
          },
        },
      });
  }

从图片可以看到,每个页面的体积都得到了有效的减少,项目体积也大大的减小

最后的最后,附上 项目地址

相关推荐
漂流瓶jz32 分钟前
Webpack如何实现万物皆可import?loader的使用/配置/手写实践
前端·javascript·webpack
ZC跨境爬虫1 小时前
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
前端·javascript·css·ui·交互
weelinking1 小时前
【产品】12_接入数据库——让数据永久保存
jvm·数据库·python·react.js·数据挖掘·前端框架·产品经理
修己xj2 小时前
告别手动存图!这款叫 Fatkun 的浏览器插件,简直是素材收集神器
前端
袋鼠云数栈2 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
AskHarries2 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment3 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
qcx233 小时前
【系统学AI】25 论文导读 ①:两篇改变 AI 的开山之作——Attention Is All You Need & ReAct
前端·人工智能·react.js·transformer
kyriewen4 小时前
大文件上传最全指南:分片、断点续传、秒传,一篇就够了
前端·javascript·面试
郑洁文5 小时前
基于Python的Web命令执行漏洞自动化检测系统
前端·python·网络安全·自动化