在得物的小程序生态实践
目录
一、前言
二、小程序运行机制
三、开发阶段
1. 跨平台框架选型
2. 包体积优化
2.1 主包/分包配置
3. 分仓开发
4. 提效工具
4.1 API环境切换功能
4.2 DEV面板
5. 自动化发布
四、发布后的数据分析
1. 稳定性监控
2.JS错误分析
五、总结思考
一
前言
事实上,“小程序”这种技术架构并非微信首创,但无疑微信小程序是目前生态建设最完整、用户量最大的小程序生态。
二
小程序运行机制
目前小程序在渲染层上已经有了基于"Skyline渲染线程"的新型架构,减少了双线程架构之间的通信开销和内存占用,理论上拥有更好的性能,需要单独开启,可自行查阅相关文档。
三
开发阶段
整个小程序所有分包大小不超过20M(开通虚拟支付后的小游戏不超过30M); 单个分包/主包大小不能超过2M。
主包:小程序默认启动页面/TabBar页面的构建产物,以及一些所有分包都需用到公共资源/JS脚本;
分包:为了提高初始化加载速度,开发者可以划分以页面为维度的分包,分包只包含一些子级页面的代码。
跨平台框架选型
包体积优化
主包/分包配置
├── ...├── bin // 构建命令├── loaders├── src│ ├── assets // 静态资源│ ├── components // 通用组件│ ├── pages // 主包目录│ ├── product // product分包目录│ ├── order // order分包目录│ ├── ...│ ├── sdk // 外部SDK│ ├── store // 全局状态│ ├── style // 样式文件│ ├── utils // 通用方法│ └── wxcomponents // 小程序原生组件├── ...
// app.json{// 主包页面"pages": ["pages/index/index","pages/xxxxx/index",],// 分包配置页面"subPackages": [{"root": "product","pages": ["xxxxx/index",]},],"window": {// 全局相关配置},"tabBar": {// tabBar相关配置}}
分仓开发
打开IDE,打开项目代码; 运行微信平台构建命令:npm run mp-weixin; 运行字节平台构建命令:npm run mp-bytedance; 运行QQ平台构建命令:npm run mp-qq; 运行Web构建命令:npm run h5; 打开微信开发者工具、字节开发者工具、QQ开发者工具、Chrome浏览器,在不同工具中预览页面。
上古时期的噩梦
提效工具
API环境切换功能
<view v-if="!IS_PRODUCTION" class="changeServiceEnv"><view class="changeTitle">环境切换</view><radio-group @change="radioChange"><radiov-for="item in ENV_Array":key="item":value="item":checked="item === SERVICE_ENV"class="radio-info">{{ item }}</radio></radio-group></view>
radioChange(e) {let { value } = e.detailthis.$store.commit('SET_SERVICE_ENV', value)uni.showToast({ title: `当前环境是${this.SERVICE_ENV}` })}
DEV面板
分析小程序页面配置,计算并得到路由表,这一步具体怎么实现跟选用的框架相关; loader的上下文环境this.resourcePath指向真实的文件路径,将它和上一步拿到路由表进行匹配,如果未命中,则不做任何操作; 分析命中路由表的文件,从中找到模版代码,紧随第一个标签,在其后方插入全局组件代码: 这一步可以用正则,也可以用AST; 对于我们的项目来说,在.vue文件的<template/>标签中查找第一个标签用正则很方便,所以我们直接正则替换。
// 全局loader主要代码function modifyTemplateString(inputString, customTag) {// 查找 <template> 标签内容let templateStartif (inputString.indexOf('<template>') > -1) {templateStart = inputString.indexOf('<template>') + '<template>'.length}const templateEnd = inputString.indexOf('</template>')const templateContent = inputString.substring(templateStart, templateEnd).trim()let modifiedTemplateContent = ''// 在 <template> 第一个元素开头插入自定义标签modifiedTemplateContent = templateContent.replace(/(^\s*<\w+(?:-\w+)*\b(?:\s+(?:"[^"]*"|'[^']*'|[^>"])+)?\s*>)/, `$1\n${customTag}`)// 替换原始字符串中的 <template> 和 <script> 内容return inputString.replace(templateContent, () => modifiedTemplateContent)}module.exports = function loader(source) {const relPath = path.relative(path.join(__dirname, '../', './src'), this.resourcePath)// <devPanel>是已经在全局中注册过的全局组件return modifyTemplateString(source, '<devPanel></devPanel>')}
自动化发布
// 打包机执行的命令#!/usr/bin/env nodeconst shell = require('shelljs')const signale = require('signale')const { Signale } = signaleconst ci = require('miniprogram-ci')async function main() {const interactive = new Signale({ interactive: true })interactive.pending(task)// 执行构建命令const result = shell.exec(`npm run build`)if (result.code !== 0) {// 如果构建失败了 退出interactive.error(task)process.exit(1)} else {const project = new ci.Project({type: 'miniProgram',projectPath: '/dist/dev/mp-weixin',ignores: ['node_modules/**/*'],})// 将构建产物上传至微信服务器ci.upload({project,}).then(res => {console.log('上传成功')// 通过IM通知相关测试/研发验证体验版小程序}).catch(err => {console.log('上传失败')interactive.error(task)process.exit(1)})}}main()
miniprogram-ci是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。
使用前需要使用小程序管理员身份访问"微信公众平台-开发-开发设置"后下载代码上传密钥,并配置IP白名单,才能进行上传、预览操作。
miniprogram-ci从1.0.28开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异。
节省手动操作的时间和精力; 集成到CI/CD流程:可以集成到持续集成/持续部署(CI/CD)流程中,实现自动化构建和部署; 可编程性:可以通过脚本编程控制上传代码的过程,实现定制化的部署流程。
四
发布后的数据分析
稳定性监控
“性能数据”面板,可以看到当前小程序性能综合表现,也可以看到更详细的“白屏分析”、“网络请求分析”等:
“实时日志”面板,可以根据关键词查找小程序运行中产生的日志,以此排查业务逻辑等:
JS错误分析
五
总结思考
https://developers.weixin.qq.com/miniprogram/introduction/
https://segmentfault.com/a/1190000019131399
https://juejin.cn/post/7087041847700226062
https://developers.weixin.qq.com/ebook?action=get_post_info&docid=0000286f908988db00866b85f5640a
https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html
https://uniapp.dcloud.net.cn/
https://docs.taro.zone/docs/
https://www.npmjs.com/package/miniprogram-ci
往期回顾
1. 浅析Spring中Async注解底层异步线程池原理|得物技术
2. 客服测试流水线编排设计思路和准入准出应用|得物技术
3. 深入剖析时序Prophet模型:工作原理与源码解析|得物技术
4. 深入理解Babel - 项目管理工具lerna解析|得物技术
5. 星创编辑器在投放业务中的落地|得物技术
文 / Zyqy 航飞
关注得物技术,每周一、三、五更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
未经得物技术许可严禁转载,否则依法追究法律责任。
“
扫码添加小助手微信
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信: