微信小程序開發記

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

相關文章:

翻譯: