# 介绍

从使用 mpvue(美团) 、参与 megalo(网易) 小程序框架的开发,一路坑踩过来,随着它们的停止维护,让我觉得自己仿佛是一路见证了小程序生态的繁荣和沉淀,虽然我很看好的 Taro Next(京东) 正式版发布在即, 却感觉自己仿佛四大皆空...

我们原本使用框架的目的是提高工作效率、减少学习成本、可以用自己熟悉的技术栈去写项目,在这之余,接触这些框架可以学习它们的理念以提高自己的技术,但踩坑时间大于项目开发的时间的时候,就本末倒置了 。我也希望我可以不去看小程序文档,直接用自己喜欢的vue 直接撸完然后编译一下就变成小程序了,不用操心太多,但事实是到目前为止,无论你用哪个框架,都无法做到也不可能做到,框架帮你解决了一些问题的同时总会带来一些其它的问题,这并非使用框架不好,这只是一个平衡的选择,坦然接受并做好解决问题的准备即可。

所以像Taro Next这类优秀框架其实能做到 70%+ 让你的小程序项目看起来似乎是 web 标准的项目,共用一部分web生态,而剩下 20% 的差异化以及 10% 的未知的可能遇见的坑则会让你苦不堪言。基于此,那就全面拥抱原生小程序吧,当然也不能放弃挣扎,在拥抱原生的基础上尝试去改善原生的开发体验(有点像当了 XX 还要立牌坊的感觉)... Emm ... 总而言之, cheers-mp 就这样诞生了。

至于命名嘛,因为公司名字和 cheers 谐音,也取项目完成后干杯庆祝之意,优(简)雅(单)内(粗)涵(暴)。

# 定位

它不是一个框架,它只是一个轻量化的、可挂载的渐进式脚手架工具。

它不会帮你把 vue 代码转换成小程序代码, 也不创造新的语法糖,一个好用的语法糖背后可能存在 N 层 AST 编译转换,在精力有限得情况下,做得越多,bug 就可能越多(这个从各大框架的 issue 里就可以看出来,哈哈,当然这也不能是脚手架功能少的理由)。

所以,我希望的小程序脚手架是这样的:

  • 支持插件化。将开发中遇到的可以通过自动化流程解决的痛点(不便)以插件形式集成进去;
  • 功能可开关。脚手架可能提供了很多功能,但我有选择用与不用以及用多少的权利;
  • 无缝化升级。脚手架升级直接改个版本号重新安装下即可,不需要自己去反复比对更新,拷贝代码;
  • 可修改配置. 框架默认的配置可能不是我想要的,需要有个能编程修改的入口;
  • 完全拥抱原生,渐进式可插拔,不做多余的语法糖、运行时,为了这个原则,之前考虑过的 SFC 需求也放弃掉了

在做到上面基础上,功能的增强其实就只是时间和人手问题了。

# 特性

  • 拥抱原生小程序。只在原生的基础上增强,不削弱原生已有的任何能力;
  • 可能是第一个支持自动化 CI 的脚手架,支持自动构建 NPM、自动上传预览版;
  • Typescript 开发体验良好,帮你配置好了 TS 需要的小程序环境,绝不是小程序开发工具帮你创建的默认的半成品 TS 项目模板。简单说...拎包入住~(当然也支持 js)
  • 内置预处理 less、scss;
  • 内置环境变量、模式配置,随心所欲切换开发、生产环境;
  • 配置好账号信息,可在生产构建时自动将 wxml、css 中使用到的图片上传到阿里云 OSS、七牛云 OSS 上,并自动替换掉代码中相应的图片路径。同时你可以保留的选择某些图片不上传的权利。
  • 多小程序开发账号支持,随心切换 appid
  • 提供依赖分析工具,让你项目中哪些文件是没有用到的(即将到来)
  • 无缝化升级、支持修改默认配置,尽量向vue-cli看齐
  • 已有的原生小程序项目基本无需特别改造即可快速引入

# 为什么不是...?

# webpack

cheers-mp 采用了 gulp 而不是 webpack 作为它的核心编译工具,理由如下:

  • cheers-mp 不做模块化。所有的模块化、依赖分析都交给小程序开发者工具自己去处理,从官方文档可知,微信小程序开发者工具本身就内置了 webpack 来进行编译,从 cheers-mp 本身的工具属性定位来看,它只处理一些必要的编译工作(比如帮你替换图片 CDN、编译 less、将 ts 编译成 es6 等),我希望编译后的代码更接近于源码,能保证它职责的单一性,而不是被模块化成一锅粥(相信大家都看过被 webpack 处理后的代码)。
  • cheers-mp 使用小程序自己的 NPM构建,贴近原生自己的生态。如果用了webpack,那么基于它的“万物皆模块” 的特性,你所有的 import 将被 webpack 处理掉,这样你就没法使用官方提供的构建NPM 功能了。

当然,有利也有弊,不用webpack 就没太好的办法做 Tree Shaking 来减少未使用到的代码,但我相信未来官方工具会支持。在这之前, cheers-mp 会提供一个单独的依赖分析插件来告诉你哪些文件你是没有用到的。

第二就是 gulp 的生态目前还比不上繁荣的 webpack, 但就目前来说,作为 webpack 的前辈也够用了,实在没有的 gulp 插件, 只能自己手撸了。

# mpx、chameleon

坦率的讲,mpxchameleon都是很优秀方案,贴近原生,又有增强的运行时优化和多平台编译,配套设施完整,不过和我需要的定位略有冲突,它并未完全拥抱原生,用了 webpack ,定义了某些好用的类 vue 语法糖, 有些“不伦不类”: 可能在我看来,要么就完全拥抱标准,要么就全面投向小程序原生(虽然小程序本身就不是标准的产物),中间态就觉得很难受,似猫非猫?