|
導讀微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一... 微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。 在微信公布小程序的文檔和開發工具后,脈沖軟件在第一時間進行了學習和體驗,我們發現微信小程序的技術架構和開發體驗讓我們非常失望。 由于微信小程序的運行環境并不是一個標準的瀏覽器環境,而且微信的封裝工作并不完善,所以我們以往開發中的很多經驗并不適用。 這并非簡單的開發習慣不適應,更重要的是我們的開發流程、規范將不適用。 微信小程序開發第一宗罪: 無法調用NPM包雖然微信小程序開發工具打包時實現了require函數加載依賴,但并不是完整的CommonJS依賴管理。因為require函數僅僅能夠加載項目中的JS文件,而且必須嚴格定義JS文件路徑,路徑不支持CommonJS的路徑風格。例如如下加載方式都將出錯: require('lodash');
require('lodash/map');
require('./foo');在微信小程序開發工具中,我們必須對應寫為如下格式: require('node_modules/lodash/lodash.js');
require('node_modules/lodash/map.js');
require('./foo.js');雖然我們可以像上面代碼一樣加載node_modules目錄中的庫,但是實際運行時卻發生了: 在調試工具的Network選項卡中,我們看到運行時加載了1000多個文件,總數據量1.8MB,而我們僅僅是在代碼中加載了一個lodash庫而已!這是因為微信小程序開發工具會將所有項目下的js文件視為項目文件,并進行打包。而實際開發中,我們需要安裝很多的NPM擴展庫,而這些擴展庫中有大量的不需要打包的文件,例如lodash中有上千文件,而我們只需要用到其中的非常少的一部分。 另外,在開發中,我們往往需要安裝babal、eslient、webpack、grunt等待開發工具,微信小程序開發工具會一視同仁將這些工具的源碼也進行打包......實測開發者工具將崩潰!開發者將崩潰!我崩潰! 所以不支持NPM包的原因,是微信開發者工具不支持CommonJS標準,不支持CommonJS標準的原因,是微信開發者工具想當然地認為項目目錄下的js文件一定是項目文件,所以只實現了簡單的require函數,想當然的原因是。。。 微信小程序開發第二宗罪: 無法使用Babel轉碼無法使用Babel轉碼的原因其實仍然歸結于無法加載NPM庫。但是后果將十分嚴重。因為你將不能再安全使用ES6/7特性,你將無法使用async/await函數,你將和無盡的callback做斗爭,你該怎樣描述自己?回調地獄中的苦逼程序員? 如果你看到這里不明白Babel為何物,那么祝賀你,因為不曾見過天堂就不知何為地獄,你無須為不支持ES6/7而煩惱。但一旦你的大腦支持了ES6/7,用過了Babel,你就回不去了,像我一樣,無Babel不編碼。 微信小程序開發第三宗罪: 無法重用組件其實微信小程序開發是并非完全不能重用組件,比如WXML語法中支持import和 include。但是那僅僅是視圖模板可重用,并非組件可重用,因為我們認為組件在應當包含視圖和邏輯。 WXML其實是基于可重用的組件,但是不允許我們自定義組件。如果你有React經驗,你就會明白我的意思。 例如,你的小程序是個電商APP,項目中有兩個頁面中同時包含了商品列表組件,比如某分類下商品列表和搜索結果列表,我們知道這兩個列表其實僅僅是參數不同而已。但是在小程序開發中,你只能將列表的模板抽象出來,不能將邏輯抽象出來,所以你就需要在兩個頁面上都實現一遍列表組件的控制邏輯,比如刷新、加載更多。。。 我們的實踐只吐槽、管殺不管埋是不道德的,既然發現了微信小程序開發中的各種弊端,我們脈沖軟件在開發之中總結出了一套流程和工具,專為解決上述三個問題,并免費發布到了開源社區,這就是Labrador。接下來我們一起來嘗試一下我們脈沖軟件的開發體驗。 安裝Labrador通過命令 通過如下命令新建一個Labrador項目: mkdir demo cd demo npm init labrador init 項目初始化完成后,該目錄是這個樣子的: 在demo目錄中運行 加載NPM包我們以lodash包為例,在src/app.js中鍵入代碼 我們看到dist目錄下有一個npm/lodash目錄,該目錄下只有一個lodash.js文件,那么在微信web開發者工具中打包預覽,lodash的庫將只有這個文件被加載。 這一切是怎么發生的? 我們看一下dist/app.js的源碼,發現源碼中 重要的是,只有真正用到的js文件才被labrador命令加入到項目目錄中。這樣一個小小的改進象征著我們的小程序可以便捷調用NPM倉庫中海量的擴展庫! Babel轉碼在初始化的示例代碼src/app.js中的內容是這樣的:
圖中timer和getUserInfo屬性都為async函數,函數體內使用await調用異步操作。labrador 庫對微信API進行了封裝,使用 const wx = require('labrador'); 覆蓋默認的全局變量wx; 封裝后的wx對象提供的異步方法返回的都是Promise異步對象,結合async/await函數徹底終結callback,將異步代碼同步寫,輕松逃離回調地獄! 但目前async/await函數是不被瀏覽器支持的,我們需要使用babel對其轉碼,labrador編譯命令已經內置了babel轉碼,轉碼后的代碼可以查看dist/app.js,內容過長,不再張貼。 重用組件重用組件最需要解決的問題是組件的邏輯代碼怎樣重用。在實例代碼中有一個src/components目錄,用來存放項目內的可重用組件,其結構是這樣的: 子目錄src/components/list中存放著一個可重用的組件。list.js / list.less / list.xml 分別對應微信小程序的 js / wxss / wxml 文件。JS為控件的邏輯層,其代碼如下: 文件導出一個List類,這個組件類擁有像Page一樣的生命周期函數onLoad, onReady, onShow, onHide, onUnload 以及setData函數。 LESS文件對應微信的WXSS文件,因為微信小程序實現的限制,LESS中無法使用連級選擇語法,但是可以定義變量,方便開發。 XML文件對應微信的WXML文件,是組件視圖描述文件,list.xml內容為: 組件定義完成后,接下來是在頁面中調用,在 src/pages/index/index.js 中有如下代碼: 在 src/pages/index/index.less 中加入代碼 @import 'list' 即可調用list組件的樣式,如果在src/components/list中找不到list.less,那么編譯命令將在NPM包中尋找 node_modules/list/index.less 。 在 src/pages/index/index.xml 中加入代碼 <component key="list"/> 即可調用list組件的模板文件,component 是Labrador自定義的組件,編譯后對應生成 import 和 template。如果在src/components/list中找不到list.xml,那么編譯命令將在NPM包中尋找 node_modules/list/index.xml 具體的體驗還需要你親自動手才行,文章到此結束,謝謝! 【相關推薦】 1. 微信小程序完整源碼 以上就是小程序開發之三大問題和解決方法的詳細內容,更多請關注php中文網其它相關文章! 小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。 |
溫馨提示:喜歡本站的話,請收藏一下本站!