我已经接触小程序一段时间,总体来看,小程序的开发难度并不高,然而,对于其基础运作机制和内在原理,还是需要有一定的了解。
了解小程序的由来
在小程序问世之前,微信逐步演变成为移动网页的关键通道。随后,微信推出了完整的网页开发工具包,命名为JS-SDK。这一举措为众多Web开发者敞开了一扇全新的大门,使他们得以利用微信的固有功能,实现之前无法或难以实现的各种任务。
然而,JS-SDK的运作方式并未彻底解决移动网页使用过程中所遭遇的糟糕体验问题,诸如设备性能和网络速度的限制,可能导致页面出现无法加载的情况。为此,我们又研发了一款升级版的JS-SDK,即所谓的“微信Web资源离线存储”。尽管如此,在处理复杂页面时,依然存在白屏现象,其问题主要体现在页面切换显得生硬,以及点击操作响应迟缓。此时,迫切需要一款超越JS-SDK处理能力的系统,以提升用户的使用感受,于是小程序应运而生。
小程序与普通网页开发的区别
小程序的构建与一般网页制作有许多共通之处,它们的主要编程语言亦然,尽管如此,两者之间仍存在一些不同之处。
小程序运行机制
小程序的启动模式分为两种,即「冷启动」与「热启动」。若用户曾在一定期限内激活过某个小程序,后续再次启动时无需从头开始,只需将处于后台的小程序切换至前台即可,此过程即称为热启动;而冷启动则是指用户初次使用该小程序,或小程序被微信系统强制关闭后再次启动,此时小程序需重新进行加载和启动。
小程序更新机制
当小程序在冷启动过程中遇到新版本时,它会自动下载该版本的代码包,并且利用客户端现有的包来启动,这意味着新版本的小程序必须等到下一次冷启动后才能生效。若需立即使用最新版本,可通过wx. API进行相应操作。这也是导致当前小程序容器技术(例如: )备受App开发者热切关注的缘由,这其中包括了以下所述的小程序安全措施。
小程序安全
作为程序开发人员,不论是负责界面展示的前端工程师,抑或是处理数据交互的后端工程师,掌握常见的安全隐患及其应对策略显得尤为关键。
1.反编译
众多微信小程序的源代码,被技术专家运用逆向工程手段或相关工具进行了解析。自小程序问世以来,这种技术便始终存在。众多开发者通过这种手段进行项目学习,而部分企业则直接利用市场上已有的小程序进行反编译,以此迅速构建自家的产品,从中获利。
针对这类问题,微信官方并未采取过多的应对策略。原因在于小程序本质上是对浏览器的模仿,通常情况下,用户只需在浏览器端点击右键,便可以查看源代码,同时在控制台也能获取到网络请求等更为详尽的数据。
小程序的代码编写时,应避免嵌入任何敏感信息,所有敏感数据应集中存储于服务器端。当客户端需要访问这些数据时,应通过预设的接口发起请求。需要注意的是,反编译后的代码主要涉及前端样式,这部分内容并非关键。实际上,一个普通的前端开发者复制一个完整的小程序项目,不过是时间上的问题。
2.接口鉴权
开发者往往能轻松地利用抓包技术或第三方工具来获取小程序的网络请求信息。因此,在小程序的后台接口被调用之际,开发者必须对此次调用进行严格的权限验证,这包括对自建的后台接口和云函数的检查。若不进行这一步骤,将很可能引发越权操作和数据泄露的风险。
对涉及敏感信息和开发接口权限的鉴权操作需在后台进行,此类检验通常包括对IP地址、用户自定义登录状态等信息的核实。
鉴权的处理过程宜置于幕后操作,不宜通过小程序中的隐蔽页面或按钮等手段来替代。
常见的鉴权示例如下:
在自建的后台鉴权功能中,当执行删除操作时,首先获取POST请求中的项目ID和用户标识,同时记录访问者的IP地址和用户角色。若用户标识匹配特定值、IP地址固定且用户角色为管理员,则执行删除操作;否则,记录非法请求并返回错误码。
云函数鉴权模块中,exports.main函数被定义为异步执行,其参数包括事件和上下文。通过调用cloud.getWXContext()方法,可以获取到包含OPENID、APPID和UNIONID的对象。若OPENID的值为"xxx",则执行删除操作;否则,记录下非法请求的行为。
3.代码管理
在运用 git、svn 等版本控制系统进行操作时,会生成诸如 .git 这样的文件夹。同时,某些编辑器或应用程序在执行过程中亦会创建临时文件。若这些文件夹或文件不慎被引入生产环境,可能会导致源代码泄露的风险。
4.内容安全
在涉及用户输入内容的功能,例如评论、昵称更改或头像更换等,开发者必须主动使用信息过滤接口来评估内容是否存在违规情况。若小程序未设置此类功能,系统将发出警告并对其搜索功能实施限制。我过往开发的一款社区类型小程序便因这一原因,遭受了长时间的封禁。
5.敏感数据安全
针对存储于本地的诸如用户信息等关键数据,开发人员需自行进行加密处理以确保其安全存储。
小程序双线程架构
什么是双线程架构?
一个线程专门负责处理逻辑层面的任务,另一个线程则负责渲染层的处理。这两个线程之间通过层间的通信机制进行信息交流。
为什么要选择双线程架构?
1.最重要的点: 这个一个基于安全于管控的方案
2.其次:比纯web更好的交互体验,
原生版本更新更加方便,小程序采用的是原生组件的方式,这种方式不仅能够享受到页面构建的低门槛和在线更新便利,还能使用到一些流畅的原生组件。更重要的是,它能够在一定程度上对开发内容进行管控,而且在设计阶段就已经解决了安全问题。
为什么说小程序有着相对较好的交互体验呢?
小程序的交互感受自然无法与原生应用相提并论,原生应用在响应速度上无疑更为迅速。相较之下,H5网页在开发过程中,其渲染线程与脚本线程是相互排斥的,它们实际上是共用一个线程的。这就意味着,在执行脚本线程时,页面可能会出现无响应的情况。因此,我们在进行网页开发时,通常会倾向于将脚本引入放置在body标签的尾部,以确保在脚本执行前,页面上的节点已经完成渲染。在小程序中,渲染线程与逻辑(脚本)线程各自独立,彼此间无法直接相互干扰,并且它们能够并行运行。这不禁让人联想到,这种设计是否从根本层面就避免了因一次重大更新任务长时间占用当前线程资源而导致的页面响应迟缓等交互问题。
在版本迭代上小程序又有哪些优势呢?
原生渲染带来的卓越体验是众人皆知的,正因如此,我们见证了跨平台框架如weex的诞生,这些框架通过直接生成原生应用的方式进行开发。然而,小程序的存在依赖于宿主环境,其发布过程无法与微信的大版本更新同步迭代。若如此,我认为这与小程序分质治理的原则相悖,同时也会带来诸多不利因素,而且无法充分利用Web技术的优势。
那么,web的显著特点究竟是什么呢?——答案显而易见,那就是能够实现内容的实时更新。——(一旦出现任何问题,都可以立即修复!甚至产品经理都难以察觉!)同样,小程序也支持在线更新,然而它相较于h5还有一个额外的优势——那就是能够动态注入底层资源。在h5中,脚本资源需要通过请求来获取,获取后还需进行解析,之后才能执行实际的业务代码。在小程序初始化阶段,(原生层)便会将(设备信息、hls流视频处理工具、基础版本库等)动态加载并注入至新页面,得益于小程序的(快速渲染设计)技术,后续页面打开时,可直接从缓存中读取数据,从而省去了解析步骤。这些优化措施直接带来的效果是(应用程序包体积减小,缩短了网络请求SDK所需的时间)。
在当前小程序不断更新的机制中,若绕过微信的审核步骤,几乎能让99%的用户实现在线升级。然而,这种做法并非无懈可击,即便微信不对新版本进行强制更新,我们仍可在用户交互层面,通过强化提示引导用户进行更新。然而,由于某些未明原因(可能是用户所使用的微信版本与小程序基础库版本之间存在不兼容),我们无法实现100%的覆盖率,这一信息是通过后台监控的SDK反馈所得到的。