Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
avaScript奇淫技巧:清理無效的垃圾代碼
在編程過程中,難免會(huì)產(chǎn)生一些無效的、冗長(zhǎng)的長(zhǎng)碼。
很常見的是:定義了某些變量,但未使用,或者是曾使用過,但在修改代碼后不再使用。那么,它就成了無用的垃圾代碼,而它占用著代碼空間,使代碼龐大、影響代碼閱讀。
在較大的工程中,往往有不少這種代碼。
本文,演示一種方法,自動(dòng)化地去除無效的變量。
例程:
添加圖片注釋,不超過 140 字(可選)
以上代碼中,變量b是無用的。
通過編程,實(shí)現(xiàn)去除,完整代碼如下:
?
添加圖片注釋,不超過 140 字(可選)
其原理是:將代碼轉(zhuǎn)化為AST(抽象語法樹),從語法樹中遍歷變量定義,然后檢測(cè)變量是否被引用或修改,如果變量既未引用、也未被修改過。則刪除該變量。最后,再把AST重新生成為JS代碼。
這段代碼在NodeJS環(huán)境中使用,運(yùn)行效果:
?
添加圖片注釋,不超過 140 字(可選)
從運(yùn)行效果可以看到,刪除了未使用的變量b,并重新生成了代碼。
這個(gè)操作,可以精簡(jiǎn)、優(yōu)化JS代碼。
與這波操作相反的,有時(shí),為了保護(hù)JS代碼,防止代碼被分析、復(fù)制、盜用;防止他人理解代碼;或因小游戲過審等需要,而對(duì)JS代碼進(jìn)行混淆加密。
在JS代碼混淆加密時(shí),經(jīng)常會(huì)有“僵尸代碼植入操作”,會(huì)插入一些無用的變量和函數(shù)等,比如JShaman就具有這項(xiàng)功能。下面,再測(cè)試一下,用JShaman插入的JS代碼,是否能用這種方式去除。
例程如下:
?
添加圖片注釋,不超過 140 字(可選)
在配置中,只選擇“僵尸代碼植入”。JShaman有很多JS加密選項(xiàng),本文只測(cè)試是否能去除插入的JS代碼,所以,只啟用這一項(xiàng):
?
添加圖片注釋,不超過 140 字(可選)
用JShaman混淆加密后,得到代碼:
?
添加圖片注釋,不超過 140 字(可選)
代碼中的紅色標(biāo)識(shí)處,都是隨機(jī)插入的僵尸代碼。
把這段代碼,放到剛剛的程序中,并運(yùn)行:
?
添加圖片注釋,不超過 140 字(可選)
從運(yùn)行結(jié)果看,并未能去除被JShaman插入的僵尸代碼,原因是因?yàn)榻┦兞恳灿幸煤托薷摹?/p>
本文僅演示了無效變量的去除,同理,還可以用類似的方法去除無效的函數(shù)。
最后,附上本文使用的代碼:
//自動(dòng)去除無效變量
//Auther: JShaman.com w2sft
var parser=require("@babel/parser");
var traverse=require("@babel/traverse").default;
var generator=require("@babel/generator").default;
var jscode=`
function get_copyright() {
var _0x4d=1 + 5;
var domain="jshaman.com";
_0x4d="apib";
var _0x05f;
var from_year=2017;
_0x05f=9;
var _0x;
var copyright="(c)" + from_year + "-" + new Date().getFullYear() + "," + domain;
_0x=8 + 2;
return copyright;
}
console.log(get_copyright());
`;
var ast=parser.parse(jscode);
var visitor={
VariableDeclarator(path){
var binding=path.scope.getBinding(path.node.id.name);
//變量被修改過
if (!binding || binding.constantViolations.length > 0) {
return;
}
//變量沒有被使用過
if (binding.referencePaths.length==0) {
console.log(" 已刪除變量:",path.node.id.name);
console.log();
們經(jīng)常在檢測(cè)網(wǎng)站加載速度的過程中,遇到了以下問題:從樣式表中刪除無效規(guī)則,并延遲不用于首屏內(nèi)容的CSS加載,以減少網(wǎng)絡(luò)活動(dòng)消耗的不必要字節(jié)。
盡管看起來CSS文件的大小只有幾KB甚至沒有1 MB,但不要僅僅因?yàn)槲募笮《械嚼Щ蟆K羞@些事情加起來可能會(huì)使您的網(wǎng)站變慢,因此建議從樣式表中刪除未使用的CSS和無效規(guī)則,使樣式表文件更精簡(jiǎn),最小化并完善它,以便在速度較慢的連接上更快地加載。速度更快的網(wǎng)站更有可能獲得更高的排名,因此,您應(yīng)該非常非常認(rèn)真地考慮網(wǎng)站的加載時(shí)間。
未使用的CSS或“無效規(guī)則”不過是未在您的網(wǎng)頁上使用的CSS代碼。如果刪除此代碼,它將使CSS文件更精簡(jiǎn),更輕便,并在某種程度上幫助縮短頁面的加載時(shí)間。
讓我們舉一個(gè)例子來理解這一點(diǎn)。
假設(shè)您的樣式表中包含以下CSS代碼
.red_highlight_box {
padding: 10px;
background-color: black;
color: white;
cursor: pointer;
max-width: 85%;
margin: 0 auto;
border-bottom: 2px solid white;
//border-radius: 10px;
font-family: 'Secular One', Arial, Helvetica, sans-serif;
}
上面的代碼用于類名“ red_highlight_box”。您可能不會(huì)在網(wǎng)站的主題中使用此類,并且網(wǎng)站上任何現(xiàn)有的頁面也不會(huì)使用該類。
在這種情況下,上面的代碼是未使用的CSS或無效規(guī)則或“膨脹代碼”。它什么也沒做,只是減慢了網(wǎng)站速度,您絕對(duì)應(yīng)該考慮一勞永逸地將其從樣式表文件中刪除。
注釋掉未使用的CSS與完全刪除它是不同的。當(dāng)您注釋掉未使用的CSS代碼時(shí),該代碼仍然存在,并增加了文件大小。未使用的css清理的目標(biāo)是減小CSS文件的文件大小,以便更快地加載,呈現(xiàn)在用戶瀏覽器中。因此,不建議注釋掉不必要的CSS代碼,您應(yīng)該從CSS文件中永久刪除多余的代碼。
想象一下,如果您從網(wǎng)站的每個(gè)頁面調(diào)用了5個(gè)樣式表,并且這些樣式表中的每一個(gè)都充滿了無效規(guī)則和代碼,而這些規(guī)則和代碼根本沒有在您網(wǎng)站的HTML中使用。如果您使用廉價(jià)的模板網(wǎng)站,這是很正常的,因?yàn)镃SS包含主題“可能”需要的所有內(nèi)容。HTML模板的開發(fā)人員已經(jīng)考慮了所有可能性,小部件,部分,字體,樣式,背景色,因此編寫了滿足所有可能性的代碼。
但實(shí)際上,您不會(huì)使用所有可能性。實(shí)踐表明,在CSS文件中使用的所有可能性中,您將使用的可能性不到30%,因此,樣式表中會(huì)有很多未使用的CSS規(guī)則,這將不必要地增加網(wǎng)站頁面的加載時(shí)間。
有許多工具可用于合并CSS文件,最小化它們或從樣式表中刪除無效規(guī)則。但我強(qiáng)烈建議您使用Unused-Css.Com。實(shí)際上,它是我們刪除多余CSS代碼的唯一工具,而且至今還沒有任何差錯(cuò)。我們已經(jīng)在多個(gè)網(wǎng)站上對(duì)其進(jìn)行了測(cè)試,并且得到的輸出CSS文件從未出錯(cuò)過。
我們也嘗試過Purify CSS,但是對(duì)于包含許多CSS代碼的較大站點(diǎn),輸出的CSS文件是不正確的。一些CSS代碼會(huì)從輸出文件中刪除,這些代碼正在其他頁面上使用。
進(jìn)行此過程的最佳方法是不要從網(wǎng)站的樣式表文件中手動(dòng)刪除未使用的CSS。因?yàn)椋?dāng)您手動(dòng)進(jìn)行操作時(shí),總是存在人為錯(cuò)誤的可能性。手動(dòng)檢查每個(gè)類并查找在哪個(gè)頁面或場(chǎng)景中使用它們也是非常費(fèi)力。因此,我們就不要考慮手動(dòng)刪除多余的CSS代碼了。
您需要一個(gè)在線工具,該工具將對(duì)整個(gè)網(wǎng)站進(jìn)行爬網(wǎng),考慮所有頁面并僅提取每個(gè)頁面中使用的CSS。一旦在整個(gè)站點(diǎn)的每個(gè)頁面上提取了可用的CSS,它將對(duì)其進(jìn)行組合,并為您提供最終的輸出文件,即干凈的CSS-避免腫的代碼或無效規(guī)則。
這是您的操作方式。
當(dāng)然,您不必使用付費(fèi)工具即可完成此操作。您可以使用Chrome開發(fā)人員工具并手動(dòng)完成操作,也可以推遲未使用的CSS。
是的,如果您使用免費(fèi)的模板,則必須一次又一次地執(zhí)行此操作。這是因?yàn)楫?dāng)您的主題收到新的更新時(shí),它將覆蓋您的style.css文件中的代碼。
這樣,當(dāng)主題有新更新時(shí),它將不會(huì)覆蓋沒有膨脹代碼的優(yōu)化CSS文件。
我們的建議是不要使用免費(fèi)的模板。推薦您使用定制網(wǎng)站,這樣您就知道所有內(nèi)容如何適合以及從哪個(gè)部分調(diào)用了哪些文件。
個(gè) CSS3 loading 動(dòng)畫庫,簡(jiǎn)單易用,動(dòng)畫流暢,無論是學(xué)習(xí)還是使用,都很不錯(cuò)。
Loaders.css 是一個(gè)性能出色的 web 前端代碼庫,或者叫 CSS 庫,因?yàn)樗耆珱]有用到一行 js 代碼或者圖片,僅僅利用純 CSS 就實(shí)現(xiàn)多種樣式的 loading 動(dòng)畫,運(yùn)行流暢絲滑,輕量小巧,性能優(yōu)秀。
loaders-css 官網(wǎng)
loading 效果預(yù)覽
loading 動(dòng)畫是前端開發(fā)收到的頻次很高的需求,特別是前后端分離的開發(fā)模式,數(shù)據(jù)都是異步加載的。以前做 loading 都是一張 菊花.gif 走天下, 但現(xiàn)在產(chǎn)品開發(fā)要求變高,咱們的追求也變高了,特別是移動(dòng)端,顯示加載動(dòng)畫前還得加載一個(gè)動(dòng)圖,這早就 out 了。
直到發(fā)現(xiàn)了 Loaders.css,為這些年來上千次的 loading 實(shí)現(xiàn)節(jié)省了大量的時(shí)間和精力。雖然官方支持 npm 安裝和 jQuery 的方式引入,但我更建議面對(duì)要求不高的場(chǎng)景,直接復(fù)制對(duì)應(yīng)的動(dòng)畫樣式即可,不需要引入 CSS,這是極致的按需取用。
使用開發(fā)者工具查看代碼
面對(duì)外觀要求的加載場(chǎng)景,我們可以修改 CSS 屬性來達(dá)到精準(zhǔn)定制的要求來符合產(chǎn)品的調(diào)性,無論是移動(dòng)端還是 pc 端都非常好用,而且也是一個(gè)很好的 CSS3 動(dòng)畫學(xué)習(xí)研究對(duì)象。
得益于 Loaders.css 毫無依賴\高性能\輕量化\免費(fèi)開源的特點(diǎn),開發(fā)者們又陸續(xù)根據(jù) Loaders.css 構(gòu)建了用于其他技術(shù)平臺(tái)甚至是 iOS \ android 原生的動(dòng)畫庫:
Loaders.css 是一個(gè)免費(fèi)開源的前端 CSS 動(dòng)畫庫,基于 MIT 開源協(xié)議托管在 Github 上,任何人和商業(yè)機(jī)構(gòu)都可以免費(fèi)下載使用。
Loaders.css 官網(wǎng)在國(guó)內(nèi)訪問不太穩(wěn)定,經(jīng)常有打不開的情況,大家也可以直接訪問 Loaders.css 的 Github 主頁獲取源碼。
關(guān)注我,持續(xù)分享高質(zhì)量的免費(fèi)開源、免費(fèi)商用的資源。
↓↓點(diǎn)擊查看本次分享的網(wǎng)址。
Loaders.css - 純 CSS 打造的免費(fèi)開源加載動(dòng)畫,絲滑流暢高性能!|那些免費(fèi)的磚
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。