好久没有接触过小程序开发,上一次项目级的开发还是基于原生js。当前大环境下typescript已经深入到前端开发的各个角落,我们熟悉的三大框架也逐渐直接使用ts,或者可以通过架构配置已经能很好的兼容typescript。那么ts在小程序中的体验如何呢,带着这个疑惑demo搞起。
闲谈ts的优缺点:
作为对比,在说ts之前,我们应该先想到js的一些主要特征:js是一种解释性语言、基于面向对象的脚本语言、弱类型、跨平台、安全性。个人的理解是ts的出现主要是弥补js语言弱类型带来的一些问题。这并不是说弱类型是个缺点,对于很多喜欢js开发的人员来说,弱类型使得代码开发更加的灵活。但是弱类型也会带来一些问题,js变量数据类型的动态性,只有执行的时候才会确认变量的类型,因此一定程度上降低了开发效率。同时ts中的类型机制,能根据开发者个人需要控制类型,ts能在代码编译前就提示类型使用等错误,减少类型使用错误或者减少类型判断处理等问题。
因此总结一下:
优点:增强代码的可读性和可维护性,类型系统使得代码在编码和编译的时候就能发现大部分的错误;是js的超集,js文件可以直接改后缀变成ts文件,具有良好的包容性;ts中引入了模块概念;
缺点:类型维护增加开发的复杂度;对一些外部库的兼容问题;
ts小程序问题,包括但不限于ts问题:
问题1:创建page页面的时候,.ts文件需要手动创建,编译的时候会自动地编译成对应的js。
问题2:wx.request 不支持对jonp请求的处理,需对返回的字符串特殊处理。
问题3:App({})等对象或方法中的 如IAppOption等内置接口的定义,可能会影响属性的添加修改等操作,可进入对应的文件进行修改。如要求不是很严格也可将IAppOption接口直接换成类型any。
问题4:引用外部ui框架,以Vant Weapp 为例(前身zanui)引入方式可以下载后引入,也可npm在线安装引入,我们以npm安装为例:
在项目的根目录miniprogram 下打开命令窗口
npm i @vant/weapp -S --production
安装完成后,小程序开发者工具菜单栏:工具->构建npm, 构建完成后miniprogram 下生成了miniprogram_npm文件夹,里面就是对应的package文件;页面引用button组件为例:
{ "usingComponents": { "van-button": "@vant/weapp/button/index" }}
<van-button type="primary">按钮van-button>
问题5:封装promise的时候报错提示
miniprogram/utils/requestapi.ts:34:21 - error TS2585: 'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.
解决方法:在tsconfig.json的compilerOptions中的lib加入"es2015.promise"。
问题6:api接口请求封装
function post(url:any, params:any) { return requestApi(url, params, 'POST')}function get(url:any, params:any) { return requestApi(url, params, 'GET')}/** * 请求API * @param {String} url 接口地址 * @param {Object} params 请求的参数 * @param {String} method 请求类型 */function requestApi(url:string, params:any, method:any) { if (method == 'POST') { var contentType = 'application/x-www-form-urlencoded' } else { var contentType = 'application/json' }; let back = new Promise(function(resolve:any, reject:any){ wx.request({ url:url, method : method, data: params, header: {'Content-Type': contentType}, success: function (res:any) { resolve(res) }, fail: function (res:any) { reject(res) }, success: function (res:any) { resolve(res) } }) }); return back}module.exports = { post, get }
问题7:小程序中引入echart的小程序版本ec-canvas
由于小程序封闭的生态,标签元素和h5元素标签的差异,所以常见的画图库并不支持小程序,因此除了自己画图之外可以看ec-canvas,引入使用不赘述。
问题8:待补充