大型程序是如何开发的_大型小程序如何研发提效

d74be5d18e6a06647291502527be2c1a.png

作者:王梦君

微信公众号:滴滴顺风车技术

出处:https://mp.weixin.qq.com/s/M1VArJ_ORY-eXSKzD6ysQw

导读:

自2016年小程序诞生以来,小程序以其“用完即走”的设计理念,以及简单易上手的开发模式,吸引了大批的小程序使用者以及开发者,随着小程序市场越来越大,相应的小程序开发者也越来越多,与此同时出现的各类小程序开发第三方框架也层出不穷。

一、小程序开发模式

小程序开发模式整体来说有两种,一种是原生小程序开发,一种是第三方框架开发。

e3375b18dde18dd9b0a842b0f1a5023e.png

整体来看小程序原生开发只能适配在对应的单独App中运行,不能提供比较全面的可以跨多端的开发能力,在有多端小程序应用需求的情况下,比较浪费人力

另外一种方案则是利用跨端框架,这种方案开发的应用一般可以达到“一套代码,多端运行”的基本目标,可以大量的节省人力,提高效率。

跨端框架开发小程序固然有很多优点,但是这种开发模式也会有一些问题,比如核心问题就是编译耗时长、开发体验差、前后端耦合等

本篇文章主要分享使用 Chameleon 框架在开发业务小程序应用过程中遇到的痛点问题,以及如何解决的心路历程。

同时也欢迎大家多多关注我们 ,Github地址:https://github.com/didi/chameleon

二、业务开发面临的痛点问题

1.业务开发面临的痛点问题

我们在小程序开发中遇到的痛点问题主要包括两方面

  • 场景构造难:强依赖后端接口和手动操作流程
  • 编译耗时长:第三方框架编译和开发者工具编译耗时极长
8a634cc8a99482a9cabb7f27200cdefb.png

【场景构造难】

我们的业务开发中很多场景,包括发单场景、收到邀请场景、等待车主邀请场景、被多个车主邀请场景、各种管控策略场景等,都强依赖后端接口以及强依赖人工操作某些流程,从乘客发单到被车主接单,需要乘客账号、车主账号(某些场景下需要多个手机多个账号)进行协助构造某些场景,甚至很多情况下, 构造场景耗时间占用开发50%的时间,严重影响开发流程和开发效率 。

814557e33e96639e142b265c99360b11.png

极端情况下,可能几十行代码的增减,就需要耗费一天的时间,大量的人力浪费在构造场景、多个手机发单接单等等本不应该有的流程上,令人痛苦不堪。

【编译耗时长】

从开发者第一次启动项目开发,到编码之后保存热更新编译,Chameleon框架编译的源码在小程序开发者工具会再次消耗编译耗时。

小程序原生开发过程中,编译耗时主要集中在 小程序开发者工具 这一个过程。

而第三方框架开发,编译耗时则主要集中在 框架编译 + 小程序开发者工具 这两个过程。

同时 第三方框架编译的源码的大小 也会直接的影响 小程序开发者工具编译耗时

42b76fdf398b7f23cfeb77c05078afa4.png

对于编译耗时长的问题,特别是前端开发而言,需要实时查看代码变更到UI的效果,多次保存就会多次构建,即使仅仅写了一行代码,甚至一个空格的变更,保存之后都会引起重新编译

这个编译是让很容易让人抓狂和崩溃的,最宝贵的开发时间都浪费在了等待上,项目再紧急也要等着这些令人难以忍受的编译过程一直转圈圈, 严重影响开发效率,严重浪费人力成本,严重影响项目进度。

2.如何解决业务上的痛点问题?

针对场景构造难的问题,核心原因是

  • 前后端强耦合,各种场景强依赖开发人员人工操作复现
  • 前端缺少基本的数据体系建设,对于各种场景的后端数据结构缺少基本的收集规整

针对编译耗时长的问题,核心原因是

  • 从代码开发到小程序开发者工具展示要经历框架编译和小程序开发者工具编译两个过程
  • 对于业务代码量大的情况下,编译的文件个数和文件体积会更多更大,同时会进一步影响这两个构建编译的耗时

那么如何解决上述核心痛点问题呢?

我们团队采用了 "微型前端应用" 这样的思路进行单点突破,化解面临的棘手问题,逐个击破,成功的解决了开发效率极低,人力成本极为浪费,开发体验极差的情况。

3.解决方案

  • 服务层:构建本地数据体系,规整各种状态数据结构,建设开发规范,梳理开发文档
  • 应用层+业务层:将应用层的代码和业务层的抽象进行对应,支持路由和分包的自动化配置,支持按需构建要开发的单页面,这样从源头上解决了要构建编译大量代码而引起的编译耗时长的问题

同时团队进行了历史问题梳理,文档建设,数据体系梳理等,将以往阻塞开发的问题一一扫除,最终开发效率得以提升 50% ~ 80%

4507fae2b27122a87e778185f69d23c0.png

三、解决场景构造难

95d6cf53540d6aeda6053d75c899de48.png

对于小程序开发中很多页面强依赖人工操作和严重缺失前端数据体系这样的问题,我们通过

  • 建立本地数据体系,前后端分离
  • 区分开发环境和生产环境请求域名
    • 开发环境下支持配置请求的域名,请求转发,支持切换请求环境
    • 生产环境下则请求线上环境
3a9666e82b0c3230c40c8e7620495f1c.png

我们可以看下改造前后的前后端交互和开发模式上的一些不同点

前后端分离,彻底解决原来前后端强耦合情况

9261698ee3a7828bea8083e4c4cd9df6.png

自建前端数据体系中心, 开发页面直达 ,免除诸多人工操作进行场景复现等繁琐流程

6240b76bf32e8f9ed53b5394cdc03fec.png
3008552cec21a0bcb9bdaf7c1d9c8401.png

参考:

https://github.com/chameleon-team/cml-best-practice/tree/master/mock

4ca3be227fa9b9253151db5d3dbe6a3e.png

四、解决编译耗时长

802bc07825218c02b0019fd3043cc261.png

【编译层适配优化】

编译耗时长的根源是【框架编译】+【开发者工具编译耗时】

a64507a698b0548b69178e38a29301e6.png

编译层的优化,并不能大幅度提升开发效率

【业务层适配优化】

那么业务层是否能够有优化手段呢?

189ae772923b1da9a6b47cc9c0bfadd0.png

根据上面的分析可以看到,当我们所有的业务代码全部参与构建的时候,会严重影响框架编译的速度和开发者工具二次编译的速度,能否从业务层,对各个模块进行拆分,独立构建呢?

业务层原来的构建模式:

所有的业务代码都参与构建,各个模块之间强耦合,前后端强耦合,每次构建极为耗时,严重影响开发效率、开发体验,甚至影响开发进度。

e0d6e00505ae7216ab2e7bbbbe959d23.png

业务层优化后的构建模式:

依赖于自建前端数据中心,前后端分离,使得前端页面可以以“微型前端应用”的思想进行单独构建,大大减少了要编译构建的内容,大幅度提高了开发效率。

d1b78d0c70a4abaa4243d6c516bc525f.png

参考

https://github.com/chameleon-team/cml-best-practice/blob/master/dev-optimize.js

基本的思路就是通过脚本自动化配置要参与构建的路由,每次开发的时候只将要开发的页面配置到路由表中,这样可以大大降低要参与构建的内容。

最终,我们的编译耗时问题得以有效地解决

7a15eed7362496a407c33e833723d339.png

以上介绍了基本的实现思路和优化方案,同时我也整理了一个简单实现案例,方便给大家参考

https://github.com/chameleon-team/cml-best-practice

五.总结

日常开发中,我们面临的问题无非是 开发提效、业务开发、性能优化

其中 开发效率 会直接影响后续的 业务开发以及性能优化 等后续工作。

日常开发中的效率提升要重点注意和优化, 任何阻塞开发的流程和痛点问题都要及时解决 ,绝对不要忍受项目开发中的各种低效率问题, 万不可听之任之, 等到项目复杂庞大到无法变更、无法优化、甚至无法开发的地步,那个时候再想去优化开发效率将会更加棘手。

作者:王梦君

微信公众号:滴滴顺风车技术

出处:https://mp.weixin.qq.com/s/M1VArJ_ORY-eXSKzD6ysQw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数码时钟代码_Python+Pyqt实现简单GUI电子时钟

本文实例为大家分享了PythonPyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQt5.QtGui import * from PyQt5.QtCore im…

【WebRTC---入门篇】(八)WebRTC核心之RTP Medio 媒体控制与数据统计

RTCPeerConnection底层是通过RTP Medio实现的,处理真正数据传输,编码流量各种控制的实现。 Receiver 通过 getReceivers 可以获取一组RTCRtpReceiver对象,用于接收数据 Sender 通过getSenders 可以获取一组RTCRtpSender对象,用于发送数据,每个对象对应一个媒体轨 RTCR…

python语言中的单行注释语句_Python 1基础语法一(注释、行与缩进、多行语句、空行和代码组)...

#第一个注释 print ("Hello, Python!") #第二个注释 输出结果为:RESTART: E:/python/change.py Hello, Python! 多行注释可以用多个 # 号,还有 和 """:实例如下: #第一个注释#第二个注释 第三注释 第四…

【WebRTC---入门篇】(九)WebRTC网络基础:P2P/STUN/TURN/ICE

NAT 作用:内网地址转公网地址 STUN 作用:中介将公网信息彼此交换 TURN 作用:P2P不成功的话在云端架设服务器,双方进入同一房间。可以在一起进行数据交互 ICE 作用:打包以上取最优,先尝试P2P。如果P2P不通再选择TURN。ICE尝试所有可能性 Relay是TURN Server,大多数情况…

antlr4例子_ANTLR和网络:一个简单的例子

antlr4例子网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序。 因此,我非常习惯在自己的机器上安装工具。 但是在2016年,网络无处不在,因此那里也可能需要我们的语言。 可能的情况: ANTLR 也在…

【WebRTC---入门篇】(十)NAT

NAT主要用于内网穿透 NAT产生原因 NAT的种类 NAT穿越原理 完全锥型:内网主机先向外发送一个请求形成IP和port

maven java1.7_本周Java技巧#7 – Maven慢吗?

maven java1.7本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗? 从Maven 3开始,您可以并行运行构建。 根据构建机器和项目结构的不同,…

【WebRTC---入门篇】(十一)STUN协议

STUN作用:用于NAT穿越;它是典型的CS模式 RFC STUN规范 STUN header STUN Header格式

mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

这是一个.net下操作数据库(结构数据库)的工具类,支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意:它并不是一个orm工具(常见的orm框架如:EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【H.264/AVC视频编解码技术】第二章【H264码流分析】

H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输。 VCL层,视频数据编码层。 VCL结构关系 NALU NAL Header (1B)+ RBSP H264码流中NALU sps pps IDR帧的理解 概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称…

android相册管理,Piktures - 最优雅的相册管理 - Android 应用 - 【最美应用】

多维度管理,美到每一个细节Piktures 的优雅,首先在于其浏览、管理的维度设计上。Android 原生相册最为人所诟病的就是其乱糟糟的浏览体验,所有带图片的文件夹都毫无章法地直接呈现。而 Piktures 则做了全面的改进。左滑即开打开文件夹管理模式…

【H264码流分析】 SPS/PPS/Slice Header

SPS中相关 H264 Profile 对视频压缩特性的描述,Profile越高,就说明采用了越高级的压缩特性 H264 Level Level是对视频的描述,Levrl越高,视频的码率,分辨率,fps越高 分辨率 帧相关 帧率计算 PPS Slice Header

access update语句执行_SQL Server与Access数据库sql语法十大差异

本文总结了SQL Server与Access数据库sql语法的十大差异。ACCESS结构简单容易处理,而且也能满足多数的应用程序要求,也是初学者的试牛刀。随着时间的推移,大多数数据库应用程序都会发展,变得更复杂,并且需要支持更多用户…

junit测试起名字规则_如何在JUnit 5中替换规则

junit测试起名字规则最近发布的JUnit 5(又名JUnit Lambda) alpha发行版引起了我的兴趣,在浏览文档时,我注意到规则以及运行程序和类规则都消失了。 根据文档,这些部分竞争的概念已被单个一致的扩展模型取代。 多年来&…

android照片编辑软件,照片编辑免费软件下载-照片编辑软件app下载 v7.45最新版_5577安卓网...

照片编辑免费软件app下载,提供给你全新的图片处理工具,这是软件包含了丰富的功能内容,软件一键即可轻松对各种照片組合、编辑和拼貼,那么有需要图片处理的用户下载该app使用吧!【软件特色】【 拼图编辑:强大…

扩展 junit 框架_JUnit 5 –扩展模型

扩展 junit 框架我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在,让我们看一下JUnit 5扩展模型,该模型将允许库和框架将自己的实现添加到JUnit中。 总览 建立 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找…

【WebRTC---入门篇】(十二)WebRTC传输协议

浏览器协议栈(左图传统HTTP 右图WebRTC) RTP/SRTP RTP是未加密的数据,SRTP是加密后的数据。 RTP协议

springcloud官方文档_通俗易懂!Spring Cloud简介:官方文档翻译版

什么是微服务?"微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通…

【RTMP协议分析与抓包实测】

传输协议 RTMP基本通讯 RTMP基于TCP之上传输 TCP三次握手,相关文章链接,TCP三次握手流程 进行握手 c- --> s 发送c0c1 c ---> s 发送c2 s ---> c 发送s0s1s2 建立RTMP连接 真实建立连接的场景 c- --> s RTMP发送connect建立连接 s ---> c 协商(滑动…

【WebRTC---入门篇】(十三)WebRTC音视频数据采集

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束