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
我想死你們啦~
今天給大家?guī)?lái)前端面試必會(huì)問(wèn)到的前端性能優(yōu)化問(wèn)題,暫定分三期給大家?guī)?lái),第一期講述基本的代碼優(yōu)化,后續(xù)還有網(wǎng)絡(luò)傳輸層優(yōu)化和頁(yè)面加載速度優(yōu)化,敬請(qǐng)期待,也歡迎點(diǎn)擊查看原文了解更多前端小知識(shí)。
點(diǎn)關(guān)注,不迷路,我們一起咸魚(yú)翻個(gè)身兒。
為什么要進(jìn)行性能優(yōu)化?
1.1、HTML/CSS優(yōu)化
1、能用html/css解決的問(wèn)題就不要用js,更快的開(kāi)發(fā)速度,更小的維護(hù)成本。
適用場(chǎng)景:
//導(dǎo)航高亮 nav li { opacity: 0.5; } nav li:hover { opacity: 1; } //鼠標(biāo)懸停顯示模塊 .menu { display: none; } .nav:hover + .menu { display: inline-block; } .menu:before { content: ''; position: absolute; top: -20px; left: 0px; width: 100%; height: 20px; }
2、自定義radio/checkbox樣式
input[type=checkbox]{} input[type=checkbox]:checked{}
3、巧用css偽類,合理使用原生選擇器,如::focus、@media、input[type=email]:invalid
4、使用全局樣式sass、scss
5、優(yōu)化HTML標(biāo)簽
//一個(gè)語(yǔ)義化的網(wǎng)頁(yè)布局 <nav></nav> <header></header> <main> <section></section> <section></section> </main> <footer></footer>
6、不濫用高消耗的樣式
7、選擇器合并
8、 0值去單位
1.2、JS優(yōu)化
1、減少前端代碼耦合
2、JS書(shū)寫(xiě)優(yōu)化
//bad let num, str, obj; //good let num = 0; str = '', obj = null; //bad getPrice:function(price){ if (price < 0) { return false; }else { return price * 10 } } //good getPrice:function(price){ if (price < 0) { return -1; }else { return price * 10 } } //類型確定,解析器不會(huì)去做一些額外的的工作,類型不確定的情況下回發(fā)生優(yōu)化回滾 //優(yōu)化回滾:編譯器已經(jīng)編譯完成函數(shù),類型變化導(dǎo)致回滾到通用狀態(tài),重新生成函數(shù)
3、減少作用域查找
//bad <script> var map = document.querySelector('#imap'); map.style.height = '10px'; </script> //good <script> !function() { var map = document.querySelector('#imap'); map.style.height = '10px'; } </script>
4、對(duì)象嵌套的越深,讀取速度就越慢
5、避免 == 的使用
6、合并表達(dá)式
//bad function getPrice(count){ if(count < 0){ return -1; }else { return count * 100; } } //good function getPrice(count){ return count <0 ? return -1 : count * 100; } //在進(jìn)行代碼壓縮的時(shí)候,即時(shí)書(shū)寫(xiě)的是if-else,壓縮工具也會(huì)幫你把它改成三目運(yùn)算符的形式
1.3、使用ES6簡(jiǎn)化代碼
1、使用箭頭函數(shù)取代小函數(shù)
var num = [4,6,8,3,1,0] //bad num.sort(function (a,b){ return a-b; }) //good num.sort(a,b => a-b); ``` * 使用ES6的class ``` class Person { constructor(name, age) { this.name = name; this.age = age; } addAge() { this.age++; } setName(name) { this.name = name; } }
2、字符串拼接
let url = `/list.html?page=${page}&type=${type}`;
3、塊級(jí)作用域變量,使用let代替var
總結(jié)的內(nèi)容到這里差不多就結(jié)束了,大多數(shù)來(lái)自工作中的一些總結(jié)和整理。文中若有不當(dāng)之處,歡迎指出共同交流~~
orm表單復(fù)雜demo制作與涉及到的方法講解,深入理解form基本屬性與使用方法
天給大家?guī)?lái)的是新浪微博PC端的模擬登陸。
工具
這次使用的工具是Charles和chrome瀏覽器,看過(guò)我之前文章的同學(xué)應(yīng)該知道我使用的Mac電腦,F(xiàn)iddler不能用,之前用虛擬機(jī)很麻煩。很早的時(shí)候有裝過(guò)Charles,但是不太會(huì)用,后來(lái)發(fā)現(xiàn)一篇比較詳細(xì)的文章,忘了記錄了。發(fā)現(xiàn)Charles還是非常好用的,而且有個(gè)很好的功能,就是可以開(kāi)啟多個(gè)Session進(jìn)行抓取對(duì)比,這個(gè)功能非常,如果經(jīng)常做爬蟲(chóng)調(diào)試的人一定能知道。我們抓取一個(gè)網(wǎng)站的登錄過(guò)程,然后在模擬的過(guò)程中,可以再另一個(gè)session中抓取自己模擬登錄的過(guò)程,然后對(duì)比一下自己的請(qǐng)求發(fā)送的數(shù)據(jù)和瀏覽器請(qǐng)求發(fā)送的數(shù)據(jù)是否一致。之前我調(diào)試一直都是通過(guò)打印查看,這樣一方面很不方便,另外一方面打印也不完整。所以非常推薦大家使用Charles,網(wǎng)上破解也有很多。
Charles
打開(kāi)Charles,要開(kāi)啟SSL代理抓取,這樣才能抓取到HTTPS請(qǐng)求,畢竟現(xiàn)在很多網(wǎng)站都已經(jīng)使用HTTPS請(qǐng)求了
HTTPS抓取設(shè)置
Host填*表示匹配所有網(wǎng)址,HTTP請(qǐng)求端口是80端口,HTTPS請(qǐng)求端口是443端口,設(shè)置好就可以開(kāi)始抓取了。
抓取請(qǐng)求
打開(kāi)chrome瀏覽器,最好清理緩存,然后使用隱身模式訪問(wèn)https://weibo.com/
打開(kāi)隱身窗口
無(wú)痕模式
在網(wǎng)頁(yè)上執(zhí)行一遍登錄操作
微博登錄過(guò)程
抓取到登錄過(guò)程后,我們就可以開(kāi)始分析了,記住一定要清理緩存。我有好幾次抓取都不一樣,后來(lái)?yè)Q了Safari瀏覽器(因?yàn)槲液苌儆眠@個(gè)),其實(shí)這一步用什么瀏覽器都無(wú)所謂,chrome瀏覽器主要是用來(lái)調(diào)試JS用的。
過(guò)程分析
查找登錄請(qǐng)求
登錄一般url里面應(yīng)該都會(huì)有l(wèi)ogin,而且是post請(qǐng)求,當(dāng)然不排除其他方式。
https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)
登錄請(qǐng)求url
找到登錄請(qǐng)求后,這里主要關(guān)注Form表單信息,參數(shù)很多,我們需要先大概區(qū)分一下哪些可能是固定參數(shù),哪些是變化的參數(shù)。
參數(shù)確定
一目了然可以看到那些是固定的了吧,這些所有的參數(shù)其實(shí)我們都是可以追根溯源的,但是沒(méi)那個(gè)必要,在這種參數(shù)比較多的情況下,太費(fèi)事了,可以采用多次抓取登錄過(guò)程,對(duì)比請(qǐng)求參數(shù)的方式確定部分固定的或者不重要的參數(shù),那么需要我們通過(guò)其他方式獲取的參數(shù)有pcid、door、su、servertime、nonce、rsakv、sp、prelt,這里servertime比較有爭(zhēng)議,一般看到這種time或者151開(kāi)頭的10位或者13位數(shù)字,都是時(shí)間戳,用time.time()獲取就可以,但是這里是servertime,我們應(yīng)該引起注意。
參數(shù)分析
下面我們一一來(lái)看這幾個(gè)參數(shù)怎么獲取
Base64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法,哪64個(gè)字符呢? A-Z、a-z、0-9和"+"、"/",很多時(shí)候base64加密的字符串尾部為 1個(gè)或2個(gè) "=", 因?yàn)樗前?個(gè)字節(jié)的二進(jìn)制拼接,如果最后剩下一個(gè),那么尾部就會(huì)添加2個(gè)=, 如果剩下兩個(gè),尾部就添加1個(gè)=,如果剛合適那當(dāng)然就沒(méi)有=了
推薦一個(gè)工具網(wǎng)站https://tool.lu/encdec/
image.png
使用編解碼試試看,最終我發(fā)現(xiàn)是賬號(hào),而且是采用了url encode和base64編碼,所有最終我們的su就是
image.png
執(zhí)行登錄請(qǐng)求
登錄請(qǐng)求的所有參數(shù)都已經(jīng)分析完了,登錄后查看response數(shù)據(jù)
image.png
然后再看一下登錄請(qǐng)求的下一個(gè)請(qǐng)求,發(fā)現(xiàn)是通過(guò)登錄請(qǐng)求的返回值中的url,然后發(fā)送此請(qǐng)求
image.png
返回值中又出現(xiàn)了另外一個(gè)url,我們?cè)谙旅嬉舱业搅耍崛rl發(fā)送請(qǐng)求
image.png
看到返回狀態(tài)了嗎?302重定向。發(fā)送請(qǐng)求以后查看一下response的url,發(fā)現(xiàn)是在它下面的請(qǐng)求地址
返回值和下面的請(qǐng)求好像有點(diǎn)關(guān)聯(lián),有下一個(gè)請(qǐng)求的參數(shù)。別急,先等等,我們就這樣一直請(qǐng)求、提取請(qǐng)求、再請(qǐng)求,得有個(gè)終點(diǎn)吧,到哪里算一站呢。我們想想登錄以后,顯示一個(gè)頁(yè)面有用戶名。我們只要能得到這個(gè)用戶名那就說(shuō)明登錄成功了。
image.png
這里看到了這個(gè)home請(qǐng)求中出現(xiàn)了我的用戶昵稱,然后上面那個(gè)請(qǐng)求的返回狀態(tài)302,又是重定向。使用上面的方式確認(rèn)一下。提取userdomain,然后拼接https://weibo.com/
image.png
成功了
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。