這篇文章主要介紹了如何優(yōu)化小程序中的css treeshaking,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于成都做網站、成都網站設計、太和網絡推廣、成都小程序開發(fā)、太和網絡營銷、太和企業(yè)策劃、太和品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供太和建站搭建服務,24小時服務熱線:18980820575,官方網址:www.cdcxhl.com
em...我寫這工具的原因就是為了上班多劃水,少費腦,少犯錯,一勞永逸!
每次局部改版老頁面時,我不會去刪除老的css。因為很麻煩,而且又害怕不小心刪出了不可預估的樣式錯亂。
所以我基本上都是在css文件的最后一行去添加新的樣式,然后......,css文件越來越大。所以為了解決這種手動刪除css的問題,開發(fā)了一個小工具。
我們最終實現(xiàn)效果是通過終端命令去完成css treeshaking
// 到項目目錄下cd Documents/xxx/xcx// 微信qts-lint css wx// 支付寶qts-lint css alipay復制代碼
配置package.json文件的bin字段,全局安裝后就可以識別qts-lint xxxx命令啦,是不是很簡單
{ "name": "xxx", "version": "1.0.0", "description": "小程序代碼", "bin": { "qts-lint": "./bin.js" } }復制代碼
使用commander接收命令,區(qū)分執(zhí)行的是微信還是支付寶,再去執(zhí)行對應的邏輯
關于commander我就不具體介紹了,大家可以自己看看文檔
const program = require("commander"); program .command("css") // 參數(shù) .description("格式化,css tree-shaking") // 描述 .action((type, command) => { // do something... });復制代碼
前面我們說了怎么去接收命令行命令,接下來我們就進入正題,如何對小程序css進行tree shaking。
目前我們使用插件purify-css來做tree shaking,所以就需要獲取css的依賴關系來確定哪些css是頁面沒用到的。
小程序所有頁面都在app.json中維護,app.json的格式都是如下所示
{ "pages": [ "pages/index/index", "pages/login/login", ... ], "subPackages": [ { "root": "mine", "pages": [ "/index/index", ... ] } ], ... }復制代碼
所以為了獲取主包和分包中的所有頁面,就需要去循環(huán)pages和subPackages,特別需要注意的是subPackages的路由是由root+pages組合而成的,下方就是我們獲取小程序中所有頁面路由的方法
function readPages(json = {}, root) { let pages = (json.pages || []).map(p => path.join(root, p)); json.subPackages && json.subPackages.forEach(element => { pages = pages.concat(element.pages.map(p => path.join(root, element.root, p))); }); return pages; }復制代碼
循環(huán)獲取到的頁面,獲取每個頁面對應的css,js,wxml,json。
保存得到的數(shù)據(jù)
{ "css url": ["js url", "wxml url", ...] }復制代碼
但是頁面還存在組件和引用,所以我們還需要
獲取組件css,js,wxml,如果是組件則加入父頁面數(shù)組的同時保存自身的鍵值對
解析wxml文件,獲取引用,將引用路徑添加到數(shù)組里
解析引用的文件,判斷是否還存在引用文件,存在回到步驟1
解析json文件,存在組件回到步驟1
上面我們說到要解析wxml,那么我們該如何去解析wxml呢?
可以使用htmlparser2解析后循環(huán)節(jié)點,獲取type是tag而且name等于import或include的標簽,然后再拿到該標簽的src,就可以獲取到該頁面的引用或引用里的引用了
這時就會得到一個像下面這樣的css依賴關系結構(包括頁面,組件,引用)
{ // 頁面css "/pages/index/index.css": [ // 頁面 "/pages/index/index.js", "/pages/index/index.wxml", // 組件 "/pages/components/title/index.js", "/pages/components/title/index.wxml", // 引用模版 "/pages/template/index.wxml" ], // 組件css "/pages/xxx/xxx.css":[ // 父頁面 "/pages/index/index.js", "/pages/index/index.wxml", // 組件的頁面 "/pages/index/index.js", "/pages/index/index.wxml", ... ], ... }復制代碼
這里大家可能會有2個疑惑
為啥目前頁面的css還要關聯(lián)組件的wxml和js?
因為支付寶存在樣式穿透,而我們項目是多人開發(fā)的,所以怕存在組件的樣式在頁面寫了,組件就沒寫的情況,所以做了這種兼容
為啥目前組件的css也要關聯(lián)頁面的wxml和js?
可能存在頁面?zhèn)鹘M件className,而樣式枚舉寫在組件內的情況,那么只能關聯(lián)頁面才能拿到傳入的className。這里可能存在樣式多刪的情況,比如樣式里寫里四種樣式,但是實際用到的只有一種,那可能就會把其它3種刪掉,這就不是我們想要的效果,目前的解決辦法只有在js里加上枚舉的className注釋,purify-css檢查到js里出現(xiàn)了需要的幾個className的枚舉后就不刪除css里的樣式了
上面我們獲取到css依賴關系后,直接利用purify-css完成刪除css的操作啦
purify('css url', [...], options)復制代碼
弱小的我源碼和其它插件放在一起,大家有興趣可以看看喲
源碼鏈接:www.npmjs.com/package/xcx…
npm 全局
$ npm i -g xcx-lint-qts復制代碼
yarn 全局
$ yarn global add xcx-lint-qts復制代碼
// 到項目目錄下cd Documents/xxx/xcx// 微信qts-lint css wx// 支付寶qts-lint css alipay復制代碼
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何優(yōu)化小程序中的css treeshaking”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!