瀏覽器

瀏覽器

  1. 緩存

    強(qiáng)緩存:也稱為本地緩存,不向服務(wù)器發(fā)送請求彬碱,直接使用客戶端本地緩存數(shù)據(jù)奥洼;

    協(xié)商緩存:也稱為304緩存溉卓,向服務(wù)器發(fā)送請求,由服務(wù)器判斷請求文件是否發(fā)生改變忿檩。如果未發(fā)生改變爆阶,則返回304狀態(tài)碼辨图,通知客戶端直接使用本地緩存;如果發(fā)生改變吱韭,則直接返回請求文件理盆。

協(xié)商緩存
  1. 強(qiáng)緩存

    瀏覽器在加載資源時(shí)猿规,會先根據(jù)本地緩存資源的 header 中的 expires 和 cahe-control 判斷是否命中強(qiáng)緩存姨俩,如果命中則直接使用緩存中的資源不會再向服務(wù)器發(fā)送請求师郑。

    Expires:HTTP1.0宝冕,值為GMT格式的時(shí)間字符串,緩存過期時(shí)間猬仁,在這時(shí)間之前則命中緩存;是一個(gè)絕對時(shí)間先誉,服務(wù)器時(shí)間和本地時(shí)間偏差大時(shí)候湿刽,緩存不能有效的命中;

    Cache-Control:HTTP1.1褐耳,主要取值如下

    • public:所有內(nèi)容都將被緩存(客戶端和代理服務(wù)器都可緩存)诈闺;

    • private:所有內(nèi)容只有客戶端可以緩存,Cache-Control的默認(rèn)取值铃芦;

    • no-cache:客戶端緩存內(nèi)容雅镊,但是是否使用緩存則需要經(jīng)過協(xié)商緩存來驗(yàn)證決定;

    • no-store:所有內(nèi)容都不會被緩存仁烹,即不使用強(qiáng)制緩存耸弄,也不使用協(xié)商緩存;

    • max-age=xxx(xxx is number):緩存內(nèi)容將在xxx秒后失效卓缰;

    • must-revalidate:強(qiáng)制瀏覽器嚴(yán)格遵守你設(shè)置的cache規(guī)則计呈;

    • proxy-revalidate:強(qiáng)制proxy嚴(yán)格遵守你設(shè)置的cache規(guī)則;

  2. 協(xié)商緩存

    Last-Modified與If-Modified-Since:HTTP1.0

    • 首次請求征唬;

    • 服務(wù)器告知啟用協(xié)商緩存規(guī)則,并在響應(yīng)頭帶上 Last-Modified捌显,告知緩存到期時(shí)間;

    • 隨后的每次請求总寒,請求頭都會攜帶 If-Modified-Since扶歪,該值等于上一次響應(yīng)頭中的 Last-Modified 的值;

    • 服務(wù)器收到 If-Modified-Since 后摄闸,會將該屬性的值與服務(wù)器上資源的最后修改時(shí)間進(jìn)行匹配善镰,從而判斷資源是否發(fā)生了變化;

    • 如果發(fā)生變化會返回一個(gè)完整的響應(yīng)內(nèi)容贪薪,在響應(yīng)頭中添加新的 Last-Modified 值媳禁,否則,只返回 header 部分画切,狀態(tài)碼為304竣稽,響應(yīng)頭不會再添加 Last-Modified

      Last-Modified是感知文件修改時(shí)間霍弹,而且是秒級別毫别;所以當(dāng)文件內(nèi)容未修改,但編輯時(shí)間修改了典格,則無法命中緩存岛宦;同樣在毫秒內(nèi)改變文件并請求,則會命中緩存耍缴,無法得到最新的文件砾肺;

      Etag與If-None-Match:HTTP1.1

      • 首次請求;

      • 服務(wù)器啟用協(xié)商緩存情況下防嗡,會在響應(yīng)頭中帶上 Etag变汪;

      • 隨后每次請求,請求頭上都會帶上 If-None-Match蚁趁,該值等于上一次響應(yīng)頭中的 Etag 的值裙盾;

      • 服務(wù)器收到 If-None-Match 后,會進(jìn)行比對,從而判斷資源是否發(fā)生變化番官;

      • 如果變化返回一個(gè)完整響應(yīng)內(nèi)容庐完,在響應(yīng)頭上添加新的 Etag 值,否則返回 304,響應(yīng)頭不會在添加 Etag

        Etag 的生成需要服務(wù)器付出額外的開銷徘熔,會影響服務(wù)端性能

  3. 不能緩存的請求

    • HTTP信息頭中包含Cache-Control:no-cache门躯,pragma:no-cache(HTTP1.0),或Cache-Control:max-age=0等告訴瀏覽器不用緩存的請求近顷;

    • 需要根據(jù)Cookie生音,認(rèn)證信息等決定輸入內(nèi)容的動態(tài)請求是不能被緩存的位他;

    • 經(jīng)過HTTPS安全加密的請求悄蕾;

    • POST請求無法被緩存色迂;

    • HTTP響應(yīng)頭中不包含Last-Modified/Etag席纽,也不包含Cache-Control/Expires的請求無法被緩存纽疟;

  4. 重定向

301:永久移動斥滤,請求的資源已被永久的移動到新的URL烂琴,返回信息會包括新的URL弧械,瀏覽器還會自動定向到新的URL蓉媳,今后任何新的請求都應(yīng)該使用新的URL來代替譬挚;

302:臨時(shí)移動。與301類似酪呻,但是資源只是臨時(shí)被移動减宣,客戶端應(yīng)該繼續(xù)使用原有的URI;

304:未修改玩荠,所請求的資源未修改漆腌,服務(wù)器返回此狀態(tài)碼時(shí),不會返回任何資源阶冈;客戶端通常會緩存所訪問過的資源闷尿,通過提供一個(gè)頭信息指出客戶端希望只返回在指定日期之后修改的資源;

  1. 輸入U(xiǎn)RL到頁面呈現(xiàn)過程

    • DNS解析

      ①女坑、瀏覽器緩存

      ②填具、系統(tǒng)DNS緩存

      ③、路由器緩存

      ④匆骗、ISP(運(yùn)營商)DNS緩存

      ⑤劳景、迭代遞歸查詢DNS

    • HTTP請求

      ①、生成請求報(bào)文

      ②碉就、TCP三次握手建立連接

      ③枢泰、服務(wù)端響應(yīng)發(fā)送內(nèi)容

      ④、客戶端接收響應(yīng)內(nèi)容

      ⑤铝噩、TCP四次揮手?jǐn)嚅_連接

    • 瀏覽器解析渲染頁面

      ①、解析HTML、CSS骏庸,構(gòu)建DOM Tree和CSSOM Tree

      ②毛甲、根據(jù)DOM Tree和CSSOM Tree,構(gòu)建Render Tree

      ③具被、根據(jù)Render Tree玻募,構(gòu)建生成RenderLayer樹布局(計(jì)算每個(gè)節(jié)點(diǎn)信息、確認(rèn)布局位置)

      ④一姿、渲染:繪制階段七咧,系統(tǒng)會遍歷呈現(xiàn)樹,并調(diào)用呈現(xiàn)器的“paint”方法叮叹,將呈現(xiàn)器的內(nèi)容顯示在屏幕上艾栋;

  2. 跨域

    • 域:由協(xié)議、域名蛉顽、端口組成蝗砾;

    • 跨域:因?yàn)闉g覽器出于安全考慮,有同源策略携冤,所以瀏覽器從一個(gè)域的網(wǎng)頁去請求另一個(gè)域的資源時(shí)就是跨域悼粮;

    • 跨域解決方案:

      ①、JSONP:利用script標(biāo)簽曾棕,只支持get請求扣猫,存在xss安全隱患,需要服務(wù)端配合改造翘地;

      ②申尤、CORS:利用請求header Access-Control-Allow-Origin 控制來源域?qū)崿F(xiàn)跨域;

      ③子眶、反向代理:nginx瀑凝、node等;

  3. 同源策略

    瀏覽器的同源策略臭杰,限制了來自不同源的"document"或腳本粤咪,對當(dāng)前"document"讀取或設(shè)置某些屬性。從一個(gè)域上加載的腳本不允許訪問另外一個(gè)域的文檔屬性渴杆;同源策略是瀏覽器上為安全性考慮實(shí)施的非常重要的安全策略寥枝。

    要求同源:Ajax請求、cookie磁奖、LocalStorage囊拜、IndexDB、DOM操作

  4. HTTP1比搭、HTTP1.1冠跷、HTTP2、HTTP3

    • HTTP1.0:TCP短連接,可以利用Connection: keep-alive保持

    • HTTP1.1:持久鏈接蜜托,多數(shù)瀏覽器建立6個(gè)連接抄囚,然后將請求壓隊(duì)執(zhí)行,可能造成隊(duì)頭阻塞

    • HTTP2.0:二進(jìn)制分幀協(xié)議橄务、多路復(fù)用幔托、頭部壓縮、服務(wù)器推送蜂挪、流控重挑,單個(gè)TCP連接、隊(duì)頭阻塞問題會影響整個(gè)連接

    • HTTP3.0:QUIC棠涮,UDP+多路復(fù)用+安全加密+擁塞控制谬哀,不需要建聯(lián)斷連的開銷

  5. 跨域如何處理cookie

    • 前端的請求用jsonp的形式

    • 前端加上配置:

      xhrFields: { withCredentials: true },

      服務(wù)端加上配置:

      header('Access-Control-Allow-Credentials: true');

  6. cookie SameSite

    • Strict:嚴(yán)格模式,cookie不能跨域使用

    • Lax:允許部分第三方請求攜帶cookie(a標(biāo)簽鏈接故爵、預(yù)加載link玻粪、get表單)

    • None:無論是否跨站都會發(fā)送cookie

  7. 首屏加載優(yōu)化

    • 使用CDN資源,vue诬垂、vue-router劲室、vuex、element-ui等從vendor.js中分離出來结窘,使用CDN資源引入(國內(nèi)推薦BootCDN)很洋;

    • 開啟gzip壓縮,nginx開啟gzip壓縮隧枫;

    • vue-router使用懶加載喉磁,異步方式分模塊加載文件,配置chunkFilename官脓;

    • 圖片資源壓縮协怒,icon資源使用雪碧圖/iconfont;

    • webpack配置優(yōu)化卑笨,用uglifyjs-webpack-plugin壓縮js文件孕暇,清除log日志和注釋,配置SplitChunks抽取公共代碼赤兴;使用mini-xss-extract-plugin提取CSS 到單獨(dú)的文件, 并使用optimize-css-assets-webpack-plugin來壓縮CSS文件妖滔;

    • 骨架屏

    • SSR、node聚合

  8. 網(wǎng)頁從請求到呈現(xiàn)花了很長時(shí)間桶良,如何排查

    可以用Chrome dev-tools中的performance工具座舍,截取第一個(gè)白屏到渲染完成的過程;可以看到loading陨帆、scripting曲秉、rendering采蚀、painting、system岸浑、idle的時(shí)間花費(fèi)分布搏存;

  9. Web Components

  • Custom elements(自定義元素):一組JavaScript API,允許您定義custom elements及其行為矢洲,然后可以在您的用戶界面中按照需要使用它們
<body>
  <user-card></user-card>
  <template>...</template>

  <script>
    class UserCard extends HTMLElement {
      constructor() {
        super();
        var templateElem = document.getElementById('userCardTemplate');
        var content = templateElem.content.cloneNode(true);
        this.appendChild(content);
      }
    }
    window.customElements.define('user-card', UserCard);    
  </script>
</body>
  • Shadow DOM(影子DOM):一組JavaScript API,用于將封裝的“影子”DOM樹附加到元素(與主文檔DOM分開呈現(xiàn))并控制其關(guān)聯(lián)的功能缩焦。通過這種方式读虏,您可以保持元素的功能私有,這樣它們就可以被腳本化和樣式化袁滥,而不用擔(dān)心與文檔的其他部分發(fā)生沖突
class UserCard extends HTMLElement {
  constructor() {
    super();
    var shadow = this.attachShadow( { mode: 'closed' } );

    var templateElem = document.getElementById('userCardTemplate');
    var content = templateElem.content.cloneNode(true);
    content.querySelector('img').setAttribute('src', this.getAttribute('image'));
    content.querySelector('.container>.name').innerText = this.getAttribute('name');
    content.querySelector('.container>.email').innerText = this.getAttribute('email');

    shadow.appendChild(content);
  }
}
window.customElements.define('user-card', UserCard);
  • HTML templates(HTML模板): <template><slot> 元素使您可以編寫不在呈現(xiàn)頁面中顯示的標(biāo)記模板盖桥。然后它們可以作為自定義元素結(jié)構(gòu)的基礎(chǔ)被多次重用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市题翻,隨后出現(xiàn)的幾起案子揩徊,更是在濱河造成了極大的恐慌,老刑警劉巖嵌赠,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塑荒,死亡現(xiàn)場離奇詭異,居然都是意外死亡姜挺,警方通過查閱死者的電腦和手機(jī)齿税,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炊豪,“玉大人凌箕,你說我怎么就攤上這事〈什常” “怎么了牵舱?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缺虐。 經(jīng)常有香客問我芜壁,道長,這世上最難降的妖魔是什么志笼? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任沿盅,我火速辦了婚禮,結(jié)果婚禮上纫溃,老公的妹妹穿的比我還像新娘腰涧。我一直安慰自己,他們只是感情好紊浩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布窖铡。 她就那樣靜靜地躺著疗锐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪费彼。 梳的紋絲不亂的頭發(fā)上滑臊,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音箍铲,去河邊找鬼雇卷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颠猴,可吹牛的內(nèi)容都是我干的关划。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翘瓮,長吁一口氣:“原來是場噩夢啊……” “哼贮折!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起资盅,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤调榄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呵扛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體每庆,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年择份,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扣孟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荣赶,死狀恐怖凤价,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拔创,我是刑警寧澤利诺,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站剩燥,受9級特大地震影響慢逾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灭红,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一侣滩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧变擒,春花似錦君珠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽材部。三九已至,卻和暖如春唯竹,著一層夾襖步出監(jiān)牢的瞬間乐导,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工浸颓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留物臂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓产上,卻偏偏與公主長得像鹦聪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蒂秘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容