经过对uniapp三天的研究,大概了解了它的一些套路,解决了开发时比较重要的一些问题,在这篇文章里特别记录一下。
为什么标题有个2?因为第一篇是付佬前几天写的,那一篇文章里的内容本篇不会再提及。如果有人对如何创建ts项目之类的有疑问,可以先去付佬的文章看看。
本篇文章的主要内容是介绍如何用vscode流畅地开发uniapp,以及如何在uniapp中使用css库bulma、字体和符号库font awesome、Microsoft的实时通信库signal R、http请求库axios。
uniapp官方推荐的ide是HbuilderX,笔者以前是vsc的忠实用户,这次也去体验了一下HbuilderX。总的来言HbuilderX是一款不错的IDE,尽管插件生态还远远不如vsc。它的功能集成方面做的很出色,尤其是原生安卓应用的调试方面(虽然热更新有些小问题)。
然而笔者已经习惯了vsc的开发体验,而且是个重度tab癌患者(HbuilderX的tab作用和vsc不一样,不能用tab来快速代码补全,而且好像还改不了),所以我在刚接触uniapp的时候就尝试了用vsc进行开发,结果意外的好用。除了原生安卓应用调试,其它的开发体验可以做到和HbuilderX别无二致。
因此,我建议:如果你之前比较熟悉vsc,又不需要开发原生安卓应用,那么大可不必下载HbuilderX,您可以按照我下方给出的步骤,在vsc上直接进行uniapp的开发。
环境配置只有三步:
h5有手就行,直接npm run serve,这里就不多说了不会有人连这都不会吧?不会吧不会吧?💔
重点说一下小程序,这里以微信小程序为例,分四步:
npm run dev:mp-weixin,运行,记住输出的文件路径bulma是最近很火的一款纯css框架,但是它在uniapp中不能直接使用。因为其中的特别样式在微信小程序和原生应用中识别不出来。这些样式会直接导致编译错误。
经过我的研究,发现识别不出的样式主要是icon方面的样式(has-icon-left一类的),因此我人工去除了这些样式,在这之后uniapp里就可以正常使用bulma了。
修改后的bulma.css源文件下载链接。
font-awesome这个比较麻烦,因为uniapp不认相对路径,只认绝对路径。而本地的字库文件编译时会自动转base64,而大于40kb的文件就无法自动转换。悲剧的是font-awesome所有源文件都大于40kb,所以为了解决这个问题,我们要对里边的链接进行更改,把font-awesome.css里的链接全部改为cdn上的链接。
修改后的font-awesome.css源文件下载链接。
signalR不能直接用的原因存粹是微信提供的web调用api和浏览器不一样。因此把浏览器请求部分的代码替换掉就可以了。这件事已经有人帮我们做了,直接安装signalr-for-wx包即可
axios不能用的原因和signalR类似,也有人帮我们做过了,网上有对应的包。
当然,原版axios也可以通过很简单的修改让其可用。在main.ts中加入下方代码即可:
import axios, { AxiosRequestConfig } from 'axios';
axios.defaults.adapter = function(config) {
config.baseURL = 'http://localhost:8010'
return new Promise((resolve, reject) => {
console.log(config)
var settle = require('axios/lib/core/settle');
var buildURL = require('axios/lib/helpers/buildURL');
(uni as any).request({
method: ((config as AxiosRequestConfig).method as any).toUpperCase(),
url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
header: config.headers,
data: config.data,
dataType: (config as any).dataType,
responseType: config.responseType,
sslVerify: ((config as any).sslVerify as any),
complete: function complete(response:any) {
response = {
data: response.data,
status: (response as any).statusCode,
errMsg: response.errMsg,
header: (response as any).header,
config: config
};
settle(resolve, reject, response);
}
})
})
}
本文章使用limfx的vsocde插件快速发布