武装你的小程序——开发流程指南
本篇文章你可以学到:
全文全部基于原生的小程序开发所阐述,各种第三方框架开发不在此列。并不会将整个项目的搭建流程细致的写出来,而是挑其中我认为在开发过程中存在的一些很重要的点进行详细陈述。 列举部分常见的
要解决工程化的问题,需要从两个角度入手:开发 && 部署。 Question
Program
对于目前常用的工程化方案,webpack,rollup,parcel等来看,都常用与单页应用的打包和处理,而小程序天生是 “多页应用” 并且存在一些特定的配置。根据要解决的问题来看,无非是文件的编译,修改,拷贝这些处理,对于这些需求,我们想到基于流的 gulp非常的适合处理,并且相对于webpack配置多页应用更加简单。所以小程序工程化方案推荐使用 gulp。 初始化一个项目,结构如下 src 为开发目录dist (开启编译后可见)为预览/上传目录.gitignore git上传忽略文件gulpfile.js 编译配置文件CHANGELOG.md 版本更新日志README.md 项目说明文件package.json 项目配置文件编译用到的插件 使用npm或yarn自行安装,安装过程不过多赘述,不会请自行搜索。 gulp配置打包sass非常简单,唯一需要注意的是@import的使用,wxss是支持样式导入的,但上面说到过小程序是天生的多页面应用,每一个页面都对应一个wxss,因此sass打包会把import的文件打包到当前文件,从而导致当前文件的体积变大。由于微信限制单包代码不能超过2M,因此当css越写越多的时候,这种打包方式势必会使样式文件越来越大。 那如何解决import的导入问题呢,其实也比较简单,说白了就是sass处理的时候,让其不处理import部分的语句就可以了。有两种方式可以做到,第一种是改写sass处理的源码,当遇到import语句时跳过。第二种是,在把文件交给sass处理前,我们先把import语句部分注释掉,这样sass处理的时候就会忽略了,当sass处理完成后,再把注释掉的语句打开即可。显然第一种成本比较高,也不好维护,所以我们采用第二种。 在处理import的时候,还有个地方是需要注意的。在sass中,import除了能引入css外,也可以引入变量,函数。因此,我们在处理的时候也需要注意区分,变量和函数最好有一个独立的文件目录存放,并且在import的时候,对于变量和函数,是必须交给sass处理的,也就是不能注释掉。因此我们单独配置了sass变量和函数存放的位置,这样我们在打包的时候,遇到这样的import语句,我们就跳过,交给sass处理,否则就代表其是引入了共用的样式文件,这样我们交给sass处理前,就先将其注释掉,sass处理完成后再把注释打开。 完整实现支持scss思路如下:
将生成的dist目录作为根目录丢进小程序开发工具即可实时刷新预览小程序,至此你的项目已经完全支持scss了,尽情的去浪吧。wx.request是小程序中最常用的api,在实际项目中会涉及到很多需要统一拦截/发送/处理,所以我们需要对wx.request进行二次封装用来支持各类需求,以实现代码的可维护性。小程序本身已经支持promise语法,
在此用 要做什么?
需要支持的功能
代码实现? <img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/1f03e854a49b1e48cc39140d924f47f8.jpg" alt="" width="957" height="886" src="https://www.52php.cn/res/2019/02-18/17/1f03e854a49b1e48cc39140d924f47f8.jpg" data-width="1280" data-height="1185"><img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/56ee11af3a83ae78ec103461c0a87da0.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/56ee11af3a83ae78ec103461c0a87da0.jpg" data-width="1244" data-height="1280">?<img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/2c3e523f5a21fd1b958379fa641935ce.jpg" alt="" width="962" height="251" src="https://www.52php.cn/res/2019/02-18/17/2c3e523f5a21fd1b958379fa641935ce.jpg" data-width="1280" data-height="333"> ?
调用方式?
在 <img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/c7014f234ffc6f53057fed9405a17fe2.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/c7014f234ffc6f53057fed9405a17fe2.jpg" data-width="914" data-height="58"><img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/4538a2b95fe1ed9e56af338dbf6970c7.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/4538a2b95fe1ed9e56af338dbf6970c7.jpg" data-width="1024" data-height="270"> 路由的封装主要是为了防止路由地址各个文件散落,无法集中管理的问题。 需要支持的功能
代码实现 定义出存路由地址的对象,使用时直接通过key值匹配 ?
实现一个parse方法解析参数为query拼接方式
?
?
定义一个push对象接收普通无参数path地址和有参数的option对象,option对象包含
path(路由地址)、query(参数),duration(跳转延时),openType(跳转方式) ;
?
?
通过openType结合原生api实现路由的几种跳转方法
?
?
调用方式 还是老规矩,直接挂载App对象通过getApp()获取直接调用
?
合理的Stroage方法封装可以使你更优雅的管理你的本地缓存。此功能需要支持三种常用的 setItem写入缓存 ?
getItem读取缓存
?
?
clear清除缓存?
?
?
调用方式 同上挂载App,使用方法如下:
?
读取
?
?
清除
?
API地址和ENV环境变量可以做为两个单独配置的文件进行配置,API文件只存接口路径,ENV存储多个环境变量,环境对象内配置当前环境各种域名,然后在 API ?
ENV
?
?
app.js
?
微信小程序提供了在小程序中内嵌HTML页面的能力,从微信小程序基础库1.6.4开始,可以在小程序内放置一个组件来链接HTML页面。有了就可以方便的将几端共用的h5页面集成到小程序内部,为我们减少了可观的工作量。 如果你有多个需要集成的webview页面实际上无需为每个页面都单独建一个文件,只需对一个公共的webview页面进行简单封装配合路由即可集中管理你的webview页面。 代码实现 wxml引入webview组件和加载中动画,webview组件接收地址,和加载成功回调。 <img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/f2eeac3fbf5bee50cc4ffbab6ac4421b.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/f2eeac3fbf5bee50cc4ffbab6ac4421b.jpg" data-width="1280" data-height="299"> 小程序不像h5网页只要部署到对应环境,就可以随意输入指定的环境域名进行测试,而小程序像app一样没有网址这一说,它本身只会存在一个预览版本,普通的流程是每次当测试同学需要在不同环境中测试时就需要找到开发同学手动更改环境并重新发布体验版。这样的流程是很不灵活的,所以我们需要想一个办法,让一个小程序版本自由的切换多个环境,而无需手动改代码配置发布。 如何实现? 实现的思路有很多种,主要需要解决的就是环境如何进行切换的问题,在这里我是通过利用小程序的重力感应api模拟摇一摇,将切换环境搓成一个一个隐藏的小彩蛋,测试人员只需要摇一摇弹出环境选项列表点击对应选项更改App对象的config内的env环境属性即可成功切换环境。 代码实现 <img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/76fa6c211dc0c29b351e6d7fe3d867fb.jpg" alt="" width="818" height="775" src="https://www.52php.cn/res/2019/02-18/17/76fa6c211dc0c29b351e6d7fe3d867fb.jpg" data-width="1280" data-height="1212"><img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/24cea14edfad9da334e73478325d0402.jpg" alt="" width="826" height="430" src="https://www.52php.cn/res/2019/02-18/17/24cea14edfad9da334e73478325d0402.jpg" data-width="1280" data-height="666"> ?
app.js也要进行处理,因为不能将该功能带到线上所以需要进行逻辑判断。
?
在这里其实还是要用到gulp这个神器,来实现不同环境的代码打包,配置起来很容易,无非就是通过gulp-replace在打包的时候对app.js的环境变量进行配置,但要配合微信开发工具的自定义处理命令每次在发版本审核的时候只需要开启该功能即可。 gulpfile.js <img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/c3ae6364e532c84d0640bfcc6b35ced2.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/c3ae6364e532c84d0640bfcc6b35ced2.jpg" data-width="1196" data-height="958"><img class="lazyload inited loaded" src="https://www.52php.cn/res/2019/02-18/17/90d388d233c0386c2b4d91c3946df93c.jpg" alt="" src="https://www.52php.cn/res/2019/02-18/17/90d388d233c0386c2b4d91c3946df93c.jpg" data-width="1220" data-height="210"> ?
project.config.json
?
?
开发者工具
?
以上列举了开发流程中常用的工程化解决方案,再此希望对大家有一个参考作用,如有问题欢迎指正。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |