知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
優(yōu)化之小程序中的css treeshaking
發(fā)表時間:2021-1-5
發(fā)布人:葵宇科技
瀏覽次數(shù):81
每次局部改版老頁面時,我不會去刪除老的css。因為很麻煩,而且又害怕不小心刪出了不可預估的樣式錯亂。
所以我基本上都是在css文件的最后一行去添加新的樣式,然后......,css文件越來越大。所以為了解決這種手動刪除css的問題,開發(fā)了一個小工具。
我們最終實現(xiàn)效果是通過終端命令去完成css treeshaking
// 到項目目錄下
cd Documents/xxx/xcx
// 微信
qts-lint css wx
// 支付寶
qts-lint css alipay
復制代碼
處理命令行
如何全局接收qts-lint命令
配置package.json文件的bin字段,全局安裝后就可以識別qts-lint xxxx命令啦,是不是很簡單
{
"name": "xxx",
"version": "1.0.0",
"description": "小程序代碼",
"bin": {
"qts-lint": "./bin.js"
}
}
復制代碼
如何接收命令行參數(shù)
使用commander接收命令,區(qū)分執(zhí)行的是微信還是支付寶,再去執(zhí)行對應的邏輯
關(guān)于commander我就不具體介紹了,大家可以自己看看文檔
const program = require("commander");
program
.command("css <app-type>") // 參數(shù)
.description("格式化,css tree-shaking") // 描述
.action((type, command) => {
// do something...
});
復制代碼
獲取css依賴關(guān)系
前面我們說了怎么去接收命令行命令,接下來我們就進入正題,如何對小程序css進行tree shaking。
目前我們使用插件purify-css來做tree shaking,所以就需要獲取css的依賴關(guān)系來確定哪些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;
}
復制代碼
獲取css的依賴關(guān)系
循環(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依賴關(guān)系結(jié)構(gòu)(包括頁面,組件,引用)
{
// 頁面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還要關(guān)聯(lián)組件的wxml和js?
因為支付寶存在樣式穿透,而我們項目是多人開發(fā)的,所以怕存在組件的樣式在頁面寫了,組件就沒寫的情況,所以做了這種兼容
為啥目前組件的css也要關(guān)聯(lián)頁面的wxml和js?
可能存在頁面?zhèn)鹘M件className,而樣式枚舉寫在組件內(nèi)的情況,那么只能關(guān)聯(lián)頁面才能拿到傳入的className。這里可能存在樣式多刪的情況,比如樣式里寫里四種樣式,但是實際用到的只有一種,那可能就會把其它3種刪掉,這就不是我們想要的效果,目前的解決辦法只有在js里加上枚舉的className注釋,purify-css檢查到j(luò)s里出現(xiàn)了需要的幾個className的枚舉后就不刪除css里的樣式了
刪除css
上面我們獲取到css依賴關(guān)系后,直接利用purify-css完成刪除css的操作啦
purify('css url', [...], options)
復制代碼
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
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)公司網(wǎng)站
- 百度小程序開發(fā)公司
- 云南小程序開發(fā)哪家好
- 小程序分銷商城
- 表單
- 汽車報廢管理
- 人口普查小程序
- 云南軟件開發(fā)
- 云南小程序開發(fā)公司哪家好
- 網(wǎng)站搭建
- 云南網(wǎng)站建設(shè)特性
- 公眾號模板消息
- 日歷組件
- 網(wǎng)站建設(shè)
- asp網(wǎng)站
- 報廢車管理系統(tǒng)
- 昆明軟件定制公司
- 云南省建設(shè)廳官方網(wǎng)站
- 云南電商網(wǎng)站建設(shè)
- 百度小程序開發(fā)
- 國內(nèi)知名網(wǎng)站建設(shè)公司排名
- 汽車報廢回收管理軟件
- 云南網(wǎng)頁制作
- 昆明小程序哪家好
- 汽車回收管理系統(tǒng)
- 云南網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務
- 云南科技公司
- 昆明小程序開發(fā)
- 網(wǎng)站建設(shè)專業(yè)品牌
- 云南網(wǎng)站建設(shè)專業(yè)品牌