微信小程式的開發和APP的開發有些類似,但又略有不同。 App一般有很多版本,甚至要相容很多版本相容,尤其是各個小版本之間一般都是要共存的。當然如果有較大變化或者升級,尤其是底層邏輯或者資料庫結構改動,一般會強制升級。 因為要多個版本相容,互相不影響使用,那麼伺服器的介面就需要多版本共存。 一般為了 ...
微信小程式的開發和APP的開發有些類似,但又略有不同。
App一般有很多版本,甚至要相容很多版本相容,尤其是各個小版本之間一般都是要共存的。當然如果有較大變化或者升級,尤其是底層邏輯或者資料庫結構改動,一般會強制升級。
因為要多個版本相容,互相不影響使用,那麼伺服器的介面就需要多版本共存。
一般為了支持多版本共存,就需要對API做一個版本的劃分,服務端的代碼,當然也需要按版本做好不同的區分。
大致方案如下:
一、每一個版本一套完整獨立的代碼
這種方法簡單直接,也特別號理解,簡單的說,就是每升級一次,就完全複製一套完整的代碼,比如可以利用SVN或者GIT的分支,來實現。開發完成後直接整套部署。
優勢很明顯,簡單且完全獨立,便於獨立部署,且各個版本之間完全不影響,互相不依賴,易於維護。
不足也明顯,就是如果版本較多,升級頻率較高則會產生大量的冗餘重覆代碼。
二、一套代碼所有版本在一起,在類(Class)或者方法(Function)上區分,做好路由選擇
優勢也算明顯,就是代碼量少,整體就一套。
不足略微多一點,不恰當的維護風險很高,代碼容易過於臃腫,各個版本之間依賴增加,不利於長期維護,也不支持每個版本獨立部署。
當然,實際開發中,往往會綜合考慮,會將兩種方式結合,大版本之間各自獨立,減少依賴和實現大版本獨立部署,小版本一個項目內相容,減少代碼量。
有了前邊這些鋪墊,我們看看微信小程式的特點,找出一個適合微信小程式的情況。
微信不是APP,不需要下載,正常情況只要重新啟動小程式基本就自動更新成最新的版本了。當然,微信也可以控制用戶強制刷新。
因此,介面設計或許就不需要像APP那樣搞出多個版本過於複雜,不利於維護,只要能很好的完成無感切換即可。
根據開發需要,暫定了將介面代碼分成了AB兩個版本部署,開發代碼是一套(一個項目),看看效果如何。
這樣一個項目維護絕對是便於維護,代碼也不會冗餘,維護時根本不需要考慮版本問題,每個開發人員只要將最新的功能實現即可,最後版本控制由上線部署時做好區分即可。
簡單描述下:部署時,可以在同一個WEB目錄,建立AB兩個目錄,小程式只需要傳回AB兩個不同的參數,就會知道API的選擇了,然後由nginx解析選擇即可,服務端代碼中完全不用考慮任何版本問題。
AB兩個版本,也正好可以實現,正式上線對外前,體驗版時也可以使用生產環境的一切配置和數據,相當於兩套(版本)代碼同時在生產環境,正式小程式調用A介面,體驗版調用B介面。可以很好的完成預上(模擬)線測試。
這個思路,對於服務端代碼和小程式代碼,都是非常簡單的,幾乎可以完全忽略版本問題。只要配置好nginx就可以了。
最早想到這個方案的時候,正經興奮了好一陣子,尤其是配置好nginx調試通過後,感覺完美^_^。
將nginx的部分配置附上
server { listen 80; listen 443 ssl http2; server_name mp.abc.com; root /www/wwwroot/a/public; index index.php index.html index.htm; etag on; gzip on; gzip_vary on; gzip_http_version 1.0; gzip_min_length 1k; gzip_buffers 4 16k; gzip_comp_level 2; gzip_disable msie6; gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/xml+rss; client_max_body_size 110m; client_body_buffer_size 1024k; keepalive_timeout 60; sendfile on; sendfile_max_chunk 512k; tcp_nopush on; tcp_nodelay on; ssl_certificate /www/server/panel/ssl/xxx.pem; ssl_certificate_key /www/server/panel/ssl/xxx.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location ^~ /a { alias /www/wwwroot/a/public; if (!-e $request_filename) { rewrite ^ /a/index.php last; } location ~ \.php$ { if (!-f $request_filename) { return 404; } #fastcgi_pass unix:/tmp/php-fpm-72.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } } location ^~ /b { alias /www/wwwroot/b/public; if (!-e $request_filename) { rewrite ^ /b/index.php last; } location ~ \.php$ { if (!-f $request_filename) { return 404; } #fastcgi_pass unix:/tmp/php-fpm-72.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } } location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { #fastcgi_pass unix:/tmp/php-fpm-72.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location = /robots.txt { access_log off; log_not_found off; } location = /favicon.ico { access_log off; log_not_found off; } }
這個段配置主要的不同就是加粗的部分,其他都是nginx的通用內容。
簡單理解就是在同一個web目錄下,建立兩個不同的目錄,然後每次上線時,將最新代碼部署到對應的AB目錄中即可。相當於介面代碼先上線,然後體驗版測試生產環境。
沒問題後,小程式直接提審即可。通過後新打開小程式的用戶自動切換到新介面,一直使用的用戶或者緩存等更新不及時一直使用原介面。當然也可以強制更新。
目前使用至今,這個方案一直沒有什麼問題。
哪位朋友有其他方法也可以分享多多交流。
整篇帖子有說錯的地方,煩請指出,十分感謝!
微信小程式調用介面地方的配置附上
/*
* 針對生產環境:切換生產環境介面目錄,兩個版本交替上線使用不同的目錄 * 例如:生產版本1.0使用目錄“a”,則pre版本1.1提前修改成“b” * 下一次生產版本1.1使用的是目錄“b”,而本地pre提前修改成“a” */ const VERSION = 'a'; const STORAGE = '1.0'; // 介面各個環境的功能變數名稱配置 const MP_HOST = []; MP_HOST['dev'] = 'http://dev.abc.com'; MP_HOST['pre'] = 'https://pre.abc.com'; MP_HOST['pro'] = 'https://mp.abc.com/' + VERSION;