墨夫当关——巨型小程序分布式开发与自动化管理
如果无法正常显示,请先停止浏览器的去广告插件。
1. 墨夫当关
巨型小程序分布式开发与自动化管理
刘帅
2. 11
新浪
阿里巴巴
腾讯
百度
小米
2次创业
3本技术书籍
2017回归
小程序多团队协同开发解决方案
3.
4. 2018年,3月
帅,广州有个政务小程序项
目,你过去支援一下,去两
个星期就回来
好的
5. 供应商
首页+用户中心
公共模块
首页 社保 交管 婚姻 出入境 公积金 婚姻 社保 交管 生活缴费
护照 生活缴费 …… 出入境 公积金 护照 ……
广东政务小程序矩阵
6. 2018.03 我加入项目
2018.05.21 粤省事上线
两个月
现在
7.
8. 您带了多少人马?
9. 2人?
2人
10.
11. 小程序矩阵的问题
12. 体验问题:不同模块间切换需要跳转小程序
跳转 跳转
跳转 跳转
13. 体验问题:最近浏览记录会被各模块小程序侵占
14. 实地调研:广东地税办事小程序相关二维码
15. 任务目标:小程序矩阵合并成一个小程序
公积金 社保 交管
婚姻 出入境 公积金
护照 生活缴费 ……
16. 数十家供应商如何有序协同开发?
17. 架构层面:隔离 & 总控
18. 政务小程序需求
首页+用户中心
公共模块
公积金
社保
粤省事
婚姻
……
19. 小程序矩阵有隔离&分治,但没有总控&合并
开发
……
提交
开发
社保仓库
提交
开发
主程序仓库
提交
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
独立仓库,独立小程序
完美的隔离&分治
各模块小程序独立注册&审核&发布
没有合并的场景和总控的手段
20. 没有总控,管理失控
亲,你们的模块没通过代码 亲们,公共模块发新版啦,
质量校验诶,需要改一下哦 大家及时更新一下哈
噢?功能都OK吗?
功能都OK的
现在工期这么紧,要不先缓
缓?
诶,…,似乎有道理……
代码质量管理难以推行
更新好麻烦,新功能还用不
上,先缓缓
同上
同上
?
公共模块更新总是滞后
21. 选择合并方案时,答案一目了然
22. 源码阶段合并 v.s 集成阶段合并
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
…….git
// 主程序代码
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
main.git
// 婚姻代码
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
合并成一份源码
├──
├──
├──
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
└──
app.js
app.json
app.wxss
gongjijin
└── pages
├── cat
└── dog
shebao
└── pages
├── apple
└── banana
hunyin
└── pages
├── apple
└── banana
churujing
└── pages
├── apple
└── banana
…
└── pages
├── …
└── …
pages
├── common
├── index
└── logs
utils
all-in-one.git
branch/feature/
main-featureA
branch/feature/
main-featureB
拉分支
branch/feature/
shebao-featureA
合并
branch/fix/
shebao-bugA
branch/feature/
hunyin-featureA
branch/feature/
hunyin-featureB
hunyin.git
源码阶段合并,有合并,但总控弱;有分治,但没有隔离
23. 源码阶段合并 v.s 集成阶段合并
开发
……
提交
开发
主程序仓库
提交
开发
婚姻仓库
提交
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
// 主程序代码
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
// ……
├── app.js
├── app.json
├── app.wxss
├── pages
│
├── index
│
└── logs
└── utils
工具自动合并完成小程序
├──
├──
├──
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
├──
│
│
│
└──
app.js
app.json
app.wxss
gongjijin
└── pages
├── cat
└── dog
shebao
└── pages
├── apple
└── banana
hunyin
└── pages
├── apple
└── banana
churujing
└── pages
├── apple
└── banana
…
└── pages
├── …
└── …
pages
├── common
├── index
└── logs
utils
all-in-one.git
集成阶段合并,已有的隔离 & 分治现状;工具实现合并,自带总控手段
24. 合并结构:小程序分包加载机制
{
├──
├──
├──
├──
│
│
│
├──
│
│
│
├──
│
│
└──
"pages":[
"pages/index",
"pages/logs"
],
"subpackages": [
{
"root": "packageA",
"pages": [
"pages/cat",
"pages/dog"
]
}, {
"root": "packageB",
"name": "pack2",
"pages": [
"pages/apple",
"pages/banana"
]
}
]
app.js
app.json
app.wxss
packageA
└── pages
├── cat
└── dog
packageB
└── pages
├── apple
└── banana
pages
├── index
└── logs
utils
}
分包模式目录结构
分包模式app.json配置
25. 分包加载机制没有模块级全局概念,
如何处理?
26. 模块级全局=模块内全部页面引用
27. 业务模块小程序全局样式&全局配置合并
小程序
{
"window": {
"navigationBarTitleText": "交管",
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#F8F8F8",
"navigationBarTextStyle": "black"
}
app.json
模块A
模块B
模块C
……
}
app.wxss
保留留在模块根目目录下
{
"navigationBarTitleText": "⻋车辆预约查询",
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#F8F8F8",
"navigationBarTextStyle": "black"
<page>.json
页面
页面
页面
页面
}
<page>.wxss
@import "/jiaoguan_uroad/app.wxss";
28. 业务模块小程序生命周期函数合并
小程序
app.js
模块A
模块B
模块C
……
<page>.js
页面
页面
页面
页面
// app.js
App({
onLaunch (options) {
// Do something initial when launch.
},
onShow (options) {
// Do something when show.
},
onHide () {
// Do something when hide.
},
onError (msg) {
console.log(msg)
},
// ...
})
// page-b.js
Page({
onLoad: function(options) {
// ⻚页面面创建时执行行行
App.onLaunch
},
onShow: function() {
// ⻚页面面出现在前台时执行行行
App.onShow
},
onHide: function() {
// ⻚页面面从前台变为后台时执行行行
App.onHide
},
// ...
})
29. 自动化集成合并小程序
……
weshop
小程序自动化生产车间
合并小程序
集成报告
30. 优先杜绝 及早暴露 简化关系 非急勿扰
31. 优先杜绝
别人人的 别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
模块
别人人的 别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
模块
别人人的 别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
模块
别人人的 别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
模块
别人人的 别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
模块
别人人的 别人人的 别人人的 别人人的 别人人的
模块
模块
模块
模块
模块
保密要求
我的
模块
代码冗余
源码阶段合并方案存在的问题,从源头彻底杜绝
代码冲突
32. 及早暴露
更新公共模块 代码质量校验
合并小程序
每一次合并前置更新公共模块并进行代码质量校验,及早暴露问题,及早修复
集成报告
33. 简化关系
出入境
主程序 公共模块 交管
婚姻 出入境 公积金
护照 生活缴费 ……
主程序
交管
婚姻
公积金
护照
……
生活缴费
模块间的相互影响关系由错乱的网状变为有序的中心辐射,平级模块不应相互影响
34. 非急勿扰
问题优先自动解决,不能解决才爆出
35. 化繁为简 明确清晰 假力于己
36. 化繁为简
Git技能有限?
那就让有限技能够用
37. 化繁为简
weshop boss
weshop assemble
获取主包代码并进入
需要在主程序目录下执行
weshop assemble
老板不懂技术细节?
那就让他不需要懂
38. 化繁为简
你好,我的模块有个链接要
跳转到外部模块,路径怎么
填呢?
你好,我的模块有个链接要
跳转到外部模块,路径怎么
填呢?
你要跳转的是主模块还是子
模块?主模块的话不用加前
缀,子模块的话要加上模块
名前缀
外部模块路径统一加上模块
名前缀
好的
诶,……,子模块?主模块?
区分外部链接规则费神?
那就让他不要区分
39. 明确清晰
问题模块
问题代码出处
责任人
哪个模块有问题?
问题代码在哪?
责任人是谁?
如何解决?
结论
错误原因及解决办法
40. 假力于己
分包加载
独立小程序天然分治环境
小程序分包加载机制作为合并基础
ESLint社区成熟规范
41. WESHOP的迭代演化
环境变量
……
主程序
……
代码重复率检测
打点注入
代码质量评分
集成报告
42. 89
~400
2018.03 我加入项目
2018.05.21 粤省事上线
现在
43. 应用案例
粤省事
数智贵阳
国务院客户端
国家政务服务平台
海关总署旅客通关
粤税通
北京通
信用中国移动端
……
44. WESHOP
Taro
COMING SOON……
45. 前端开发的门槛越来越低,
需要对架构与设计模式的思考越来越多
46. Thanks