搭建小程序项目架构,你需要注意什么?

What?小程序还需要搭建架构?你这用的是mpvue?相信小程序开发者们看到这标题都会发出这样的疑问。
不急,听我慢慢道来~~

前言

笔者已经半年没碰小程序了,但是微信生态在这里,小程序作为以前的主要工作技能,编码能力不能丢啊,周末有空必须搞搞老技能。
对于小程序,官方确实提供了一整套生态,它的能力全在api体现了。所以其实没有什么项目架构可言,除非你使用mpvue等第三方架构。
但是使用原生开发,其实还是有一些可优化的地方,我将把我认为可优化的点,记录在这篇文章中。

通过这篇文章你将了解到:基本项目结构、构建npm模块的重要性、第三方库的推荐、分包配置

项目结构

基本项目结构

构建npm模式

小程序的开发模式,简直跟Vue不要太类似。既然如此,对于前端开发工程师来说没有npm模块怎么说的过去?微信官方也明显意识到这个问题,在基础库版本 [2.2.1]后边支持使用第三方npm库。
构建npm步骤非常简单,官方教程已经说得很明白,具体见:npm构建。
这里我主要想说明为何我要构建npm,因为在以前我真的是纯原生开发,什么都没做优化的。主要原因是:一为了遵循官方社区的脚步;二构建npm有诸多好处:

  1. 符合前端开发的习惯,更为高效;
  2. 若是没有npm,我们在引用第三方库时,是需要把源码以本地文件导入,并且去除非必要代码以减少包体积,这在拉取源码的时候往往会出现不必要的错误和踩坑;
  3. 通过研究源码和查阅相关资料,我发现使用npm后,微信也相应推出npm构建的优化,是一种类似webpack的打包原理。微信小程序会通过模块依赖分析npm包的主入口模块以及其依赖的所有模块,通过DEFINE函数创建一个模块对象,存储于MODS对象中,并且当一个npm包引用到其他npm并且与其他有重复时,小程序会将此重复模块提升为全局模块,使用到的地方使用全局require来引用,这样避免了重复打包。这也是在开发者工具中点击npm构建后,项目中会出现miniprogram_npm的原理,通过构建把一个原始的npm模块打包成一个index.js,在项目中require时,直接在miniprogram_npm中查找对应模块加载即可,减少包体积的同时又加快速度。

导入第三方库

构建完npm后,我们可以非常愉快的导入第三方库,正如前面所讲,小程序框架本身就没有什么特别高的可提升的地方,毕竟也就一个小小的程序,代码规范点就可以了。因此我只引用了vant-ui和flyoi库。

  1. vant-ui:有赞UI组件不用赘述,用过的人都说香!

引用方法:npm i @vant/weapp -S --production
具体可见:https://vant-contrib.gitee.io/vant-weapp/#/quickstart#an-zhuang-miniprogram-api-typings

  1. flyoi:fly.js 是一个基于 promise 的,轻量且强大的Javascript http 网络库。我之所以引用是因为它提供标准的Promise API,并且通过判断Http Engine来实现多环境支持。简单来说就是:这个库可以在vue、小程序、h5中请求,并且使用方法完全一致!
    当然,这个库中针对小程序的也就是对wx.request进行包装(毕竟绕不开平台的约束。。。);

引用方法:npm install flyio
具体可见:https://github.com/wendux/fly

这里还需要对flyoi进行下封装,添加请求和响应拦截器。官方也给出了代码,我多做了些加载框和状态码的判断。

const Fly = require("flyio/dist/npm/wx")
//引入api接口文件
const api = require('../config/api')

const fly = new Fly()

//获取本地存储token
let token = wx.getStorageSync('token')
//请求配置
const config = {
  method: "", //请求方法, GET 、POST ...
  headers: {
    token
  }, //请求头
  baseURL: '', // 请求基地址
  //Content-Type为“application/json”,默认为true
  parseJson: true,
  timeout: 30000 // 超时时间
}

var loading = true
fly.config = config

//添加请求拦截器
fly.interceptors.request.use((config, request) => {
  loading = config.loading == undefined ? true : false
  config.headers.token = wx.getStorageSync('token')
  if (loading) {
    wx.showLoading({
      title: config.loadingText ? config.loadingText : '正在加载...',
    })
  }
  return config;
})

//添加响应拦截器,响应拦截器会在then/catch处理之前执行
fly.interceptors.response.use(
  (response) => {
    loading ? wx.hideLoading() : ''
    if (response.data.code == 401) {
      wx.removeStorageSync('token')
    } else {
      return response.data
    }
  },
  (err) => {
    wx.showToast({
      title: '系统繁忙,请稍后再试',
      icon: 'none'
    })
    //发生网络错误后会走到这里
    return Promise.resolve(err)
  }
)

module.exports = {
  http: fly
}

页面调用示例如下:

http.post(api.xxx, {
      "code": this.data.wxcode
    }).then((res) => {
      if (res.code == 0) {

      } else {

      }
    }).catch((e)=>{
      print(e);
    })

构建分包&独立分包

为了控制用户加载小程序的时长,微信官方对小程序的包体积大小有这严格限制,这个限制不同的基础库都会有一些差别。微信官方也在尽力降低包体积的限制程度。
然而小程序项目可大可小,笔者之前的项目就曾超过微信官方的限制大小而无法发布,只能采取分包配置,但因为项目迭代了那么多个版本,各个页面耦合度都上来了,这个时候去拆模块就比较麻烦了。

  • 分包
    因此新开项目,一定要做好分包的配置;小程序分包主要是通过配置页面路径,将各个页面分成多个包,小程序加载时只会先加载主包,当进入分包页面时,才会加载分包,这样用户进入小程序时就不至于等待太久,同时也节省了每次都要加载分包的资源损耗

详细教程:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/basic.html

分包配置
  • 独立分包
    独立分包独立于主包和其他分包运行,这种我认为不是必须,要看需求定。这里我不做拓展,配置也是很简单的。

详细教程https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/independent.html

写在最后

小程序的学习成本真的是很低,但是一些小问题确实是需要提前去预判并且去做的,不然迭代中期进行修改确实很费命。。。另外,小程序模块化开发我推荐使用ES6 的CommonJS模块化;同时由于小程序没有mixin的特性,建议大家可以尝试引入,减少开发成本。这里我不多赘述,关于mixin可见文章:https://www.jianshu.com/p/bcd9c3084eb1
小弟班门弄斧,希望能一起学习进步!!!
希望大家多多指导我!

后会有期

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容