微信小程序开发记

1. 背景故事

自从几年前开了个人网站后,每次发文章顺带更新公众号,在公众号后台有微信小程序相关设置,公众号没什么新鲜的,给我的感觉就是网站那一套换了个皮,中文互联网有百度这个毒瘤把控入口,还有备案什么的政策限制,生出个公众号理所当然,母语是英文的人做网站基本没什么障碍,比如很多印度人就能开网站通过Adsense赚钱。小程序倒是非常有中国特色,一定程度上摆脱了国外操作系统生态控制,于是想尝试下利用业余时间开发个小程序给自己用。

谁能想到,小程序出来8年了,其开发者工具都不支持 Linux 平台,对我来说,这是最大障碍。有几次我准备开始的时候,远程连接到一个Mac Pro 14上,卡得不行,只好放弃,总不能为了一碟醋整盘饺子,去买个Mac设备。

直到前阵子偶尔发现 AUR 仓库中的 wechat-devtools-git 包,尝试了下可用,那可比远程到老旧Mac电脑上开发爽多了。

截图证明:

wechat-devtools-git

2. 开发小程序的目的

  • 接触各种技术生态,锻炼能力;
  • 做工具给自己用;
  • 想办法脱离中大陆的公司搞钱,打工苦打工累的时候,你会理解的,小程序能接广告,程序写好了,基本变动很少,不像公众号码字都很费劲,省心;
  • 能少玩游戏。

3. 初始版本开发

  • 程序开发:

    看了点官方教程和B站上的视频,在AI的加持下,初始版本差不多几个小时就完成了,出乎意料的顺利。毕竟小程序也就是变种 js + html + css,也可能是很久前,我就开始琢磨要做的是什么了吧。

  • 小程序头像制作:

    先让AI帮我生成基本图片,然后使用GIMP 和 Inkscape进一步处理,编辑图片的能力日渐长进。

  • 小程序备案:

    没错,小程序也是要备案的,一切都在掌握之中,不服的话,各种功能受限,基本做不了。备案就是要等各地通管局审批,没有进度提示的,你等着就好了,不服也是不行的。好处是不要钱,如果这也算好处的话🤷‍♂️...

  • 微信认证:

    这个说实在话,应该改名叫微信服务费,就像苹果开发者也要每年收费一样。个人每年¥30,赚不回来这30块,就只能一直亏本、放弃或者只给自己用,毕竟流量是腾讯的,收钱有门槛,一定程度上也有道理。我看有很多去水印的小程序,应该使能收回本钱的。微信认证后,别人才能搜到你的小程序。

  • 服务端

    微信小程序相当于个前端,当然如果简单的全是静态内容,那没什么好说的。后端因为我有网站,丐版vps、域名什么的。证书也是caddy自动申请的,对我来说,没有额外成本。你也可以用付费使用腾讯的配套云服务,人穷,我都是全部自己搞定的。

从上面可以看出,除了给个30块服务费,理解下政府监管,剩下的就看你自己造化了。前几天看到个图片,企业盈利达到几百万门槛后,交税25%,4块收1快,这么一想是不是会释然很多。

4. 优化

  • 前端优化:

    AI辅助编程,有时候写得很啰唆、样式不好看等,都需要自己把关调整下。

  • 后端优化:

    一开始后端接口我用fastapi实现,发现返回比较慢, 压测方法如下所示:

    1echo "GET http://localhost:8000/api/xxx_your_api" | vegeta attack -duration=10s -rate=100 | vegeta report
    

    因为服务器在外国,慢的时候要几百ms,让AI换成Golang版本的,有很大改观,但是个别时候不稳定,不知道是不是gc的原因。

    又让AI换了个 rust 版本的,非常稳定,几乎没有特别慢的,除非网络抖动,内存和cpu占用也有所减少,简直丐版服务器福音啊。于是我先用fastapi实现基本逻辑,再让AI帮忙换成 rust 版本部署到服务器上。这里不得不说,二进制部署相比Python部署就是好,放上去,用systemd接管就完事了。

  • 压缩:

    对于微信小程序来说,后端返回数据用个高效压缩算法果非常显著。

     1
     2# response
     3access-control-allow-credentials: true
     4alt-svc: h3=":443"; ma=2592000
     5content-encoding: br
     6content-length: 2225
     7content-type: application/json
     8date: Fri, 01 Aug 2025 10:42:50 GMT
     9vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
    10vary: Accept-Encoding
    11via: 1.1 Caddy
    12
    13
    14# request
    15:authority: stock.mephisto.cc
    16:method: GET
    17:path: /api/meta/info
    18:scheme: https
    19accept: */*
    20accept-encoding: gzip, deflate, br
    

    上面的示例可以看出,微信默认是不支持zstd压缩,至少我没搞定也没搜到解决办法。只能退而求其次选用 br,比默认的gzip好一点。从 response 中看出 br 压缩生效。

    Caddy 默认是不支持 br 压缩的,得打上额外的包,br 包有两个版本,要选cgo性能高的版本。这种情况,压缩在web server层做比在后端做好。

    1CGO_ENABLED=1 \
    2xcaddy build \
    3    --with github.com/dunglas/caddy-cbrotli \
    4    --with github.com/mholt/caddy-ratelimi
    

    Caddyfile 里面这样写,会按顺序依次优先配备。

    1encode zstd br gzip
    
  • 安全防范

    网络世界,安全威胁始终存在,细心的同学就能注意到上面 xcaddy 额外编译了 ratelimi 模块,用来限流限速的。不会的可以看看对应的github文档,要花时间理解。

    此外我还加了接口认证,也是在 Caddy 层面做的,只接收来自小程序本身的接口请求,在服务器上 tcpdump 抓包就能看到微信小程序请求有些什么特征,识别特征,针对性放行。

  • 逻辑变更

    由于微信发版是要审核的,快的时候40分钟,慢的时候一天多或者几天,部分逻辑适合写在后端的,还是会方便很多,后端自己能完全掌控,随便发版的。劣势是会多了网络开销,看自己取舍了。

5. 推广

小程序我目前还没有完全打磨好,还在想法添加功能,内容也是来自github公共仓库,所以也没打算外部推广,只在自己网站文末加了二维码展示,有兴趣的可以扫码试试看,随缘吧。

当然,能赚点钱更加好,至少能赚回¥30快成本费用,还没算时间付出。

最后修改于: Friday, August 1, 2025
欢迎关注微信公众号,留言交流;也欢迎使用微信小程序。

相关文章:

翻译: