摘要:而且默認(rèn)帶有執(zhí)行的順序是,,即便是內(nèi)聯(lián)的,依然具有屬性。模塊腳本只會(huì)執(zhí)行一次必須符合同源策略模塊腳本在跨域的時(shí)候默認(rèn)是不帶的。通常被用作腳本被禁用的回退方案。最后標(biāo)簽真的令人感到興奮。
窺探 Script 標(biāo)簽 0x01 什么是 script 標(biāo)簽?
script 標(biāo)簽允許你包含一些動(dòng)態(tài)腳本或數(shù)據(jù)塊到文檔中,script 標(biāo)簽是非閉合的,你也可以將動(dòng)態(tài)腳本或數(shù)據(jù)塊當(dāng)做 script 的文本節(jié)點(diǎn)。就是內(nèi)聯(lián)腳本。
一般我們最常用的就是寫一些 JavaScript 腳本在 script 標(biāo)簽里,但是 script 也可以用來存儲(chǔ)一些數(shù)據(jù),比如當(dāng)你設(shè)置 type="text/react" 的 script 時(shí)就可以在里面放 react 代碼,但是游覽器是不會(huì)執(zhí)行它無法識(shí)別的 type 的,因此 script 還可以用來存放一些臨時(shí) APP 數(shù)據(jù)。
也可以通過 documents.scripts[0].text 獲取到第一個(gè)腳本的內(nèi)容,可以修改它,但是不會(huì)有任何作用。
0x02 src 屬性當(dāng)你指定了 src 屬性時(shí),外部腳本的內(nèi)容是不受腳本內(nèi)容限制的;同時(shí)你的 script 標(biāo)簽內(nèi)必須是空的。如果沒有指定 src,就稱這段腳本是內(nèi)聯(lián)的,內(nèi)聯(lián)腳本受到腳本內(nèi)容限制。
什么是腳本內(nèi)容限制?
所以看得出來,如果你使用打包工具,為了減少 CRP 而將腳本內(nèi)聯(lián)到文檔里,代碼要注意是否符合腳本內(nèi)容限制;如果你還壓縮了代碼,更需要注意這一點(diǎn)。
0x03 defer 和 async 屬性0x04 type=module和 nomodule 屬性
在 script 中,默認(rèn)的 type="text/javascript",還可以是 JavaScript MIME 中的任意一種。如果 script 里寫的是 JavaScript,推薦省略 type 屬性。不指定 defer 和 async 下的經(jīng)典腳本的執(zhí)行會(huì)阻塞 DOM 解析。
如果 type=module,則說明標(biāo)簽引用的是一個(gè) ES 模塊。
?
// utils.js export function addTextToBody(text) { const div = document.createElement("div"); div.textContent = text; document.body.appendChild(div); }
僅僅支持“裸導(dǎo)入”
// Supported: import {foo} from "https://jakearchibald.com/utils/bar.js"; import {foo} from "/utils/bar.js"; import {foo} from "./bar.js"; import {foo} from "../bar.js"; // Not supported: import {foo} from "bar.js"; import {foo} from "utils/bar.js";
支持 type=module 的游覽器會(huì)自動(dòng)忽略帶有 nomodule 的 script 標(biāo)簽。方便你回退到不支持 module 的老式的用戶代理。
而且 type=module 默認(rèn)帶有 defer
執(zhí)行的順序是 2.js,1.js,3.js
即便是內(nèi)聯(lián)的 module,依然具有 defer 屬性。
模塊腳本只會(huì)執(zhí)行一次
必須符合同源策略
模塊腳本在跨域的時(shí)候默認(rèn)是不帶 credentials 的。
下圖可以很好的詮釋經(jīng)典腳本和模塊腳本加載的不同
模塊腳本的依賴層級(jí)的增加會(huì)不會(huì)導(dǎo)致 CRP 長(zhǎng)度的增加?
上圖可以看出,層級(jí)很深的時(shí)候,用戶代理會(huì)花費(fèi)大量的時(shí)間在等待依賴文件的傳輸和解析上,因此這會(huì)導(dǎo)致 CRP 長(zhǎng)度的增加;不過 http2 push 的魔法使得用戶代理下載依賴文件的時(shí)間會(huì)大幅減少,服務(wù)器會(huì)分析模塊的依賴樹,然后在一次請(qǐng)求里回傳所有依賴文件給用戶代理。具體的討論可以看 Are ES6 modules in brwosers going to get loaded level-by-level 詳細(xì)討論了這個(gè)問題。
0x05 charset 屬性給出腳本內(nèi)容的編碼方式;沒有 src 的 script 不能設(shè)置該屬性,模塊腳本強(qiáng)行按 utf8 來解析。
0x06 noscript 標(biāo)簽noscript 標(biāo)簽告訴游覽器,如果你不支持腳本或腳本被禁用,那就顯示我里面的內(nèi)容。通常被用作腳本被禁用的回退方案。
0x07 最后script 標(biāo)簽真的令人感到興奮。
如果你覺得我的文章不錯(cuò),可以關(guān)注我的
知乎專欄:挽起袖子搞前端
Segmentfault:mrcode的文章
技術(shù)博客:blog.mrcodex.com
推特:mrcodehang
新浪微博:Mr云航
0x08 參考文章html.spec.whatwg.org/dev/scripting.html#scriptingLanguages
es6-modules-in-browsers-going-to-get-loaded-level-by-level
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51025.html
摘要:而且默認(rèn)帶有執(zhí)行的順序是,,即便是內(nèi)聯(lián)的,依然具有屬性。模塊腳本只會(huì)執(zhí)行一次必須符合同源策略模塊腳本在跨域的時(shí)候默認(rèn)是不帶的。通常被用作腳本被禁用的回退方案。最后標(biāo)簽真的令人感到興奮。 窺探 Script 標(biāo)簽 0x01 什么是 script 標(biāo)簽? script 標(biāo)簽允許你包含一些動(dòng)態(tài)腳本或數(shù)據(jù)塊到文檔中,script 標(biāo)簽是非閉合的,你也可以將動(dòng)態(tài)腳本或數(shù)據(jù)塊當(dāng)做 script 的...
摘要:三種渲染流程實(shí)際場(chǎng)景下,大概會(huì)有三種常見的渲染流程注意和步驟是可避免的優(yōu)化瀏覽器會(huì)在和加載完開始渲染頁面。優(yōu)化避免阻塞解析器通過以上兩種方式引入均會(huì)阻塞,因而會(huì)阻塞出現(xiàn)在腳本后面的標(biāo)記的渲染。 瀏覽器渲染原理 showImg(https://segmentfault.com/img/remote/1460000009159494?w=538&h=507);showImg(https:/...
摘要:主要兼容的微信的瀏覽器,因?yàn)橐谂笥讶頎I(yíng)銷,總體來說,會(huì)偏設(shè)計(jì)以及動(dòng)畫些。 有一天,我們組內(nèi)的一個(gè)小伙伴突然問我,你知道有一個(gè)叫重構(gòu)工程師的崗位?這是干什么的?重構(gòu)工程師 這個(gè)問題引發(fā)了我對(duì)前端領(lǐng)域發(fā)展的思考,所以我來梳理下前端領(lǐng)域的發(fā)展過程,順便小小的預(yù)測(cè)下2017年的趨勢(shì)。不想看回憶的,可以直接跳到后面看展望。 神說,要有光,就有了光 自1991年蒂姆·伯納斯-李公開提及HTML...
摘要:主要兼容的微信的瀏覽器,因?yàn)橐谂笥讶頎I(yíng)銷,總體來說,會(huì)偏設(shè)計(jì)以及動(dòng)畫些。 有一天,我們組內(nèi)的一個(gè)小伙伴突然問我,你知道有一個(gè)叫重構(gòu)工程師的崗位?這是干什么的?重構(gòu)工程師 這個(gè)問題引發(fā)了我對(duì)前端領(lǐng)域發(fā)展的思考,所以我來梳理下前端領(lǐng)域的發(fā)展過程,順便小小的預(yù)測(cè)下2017年的趨勢(shì)。不想看回憶的,可以直接跳到后面看展望。 神說,要有光,就有了光 自1991年蒂姆·伯納斯-李公開提及HTML...
閱讀 1441·2021-11-25 09:43
閱讀 2044·2021-07-26 23:38
閱讀 751·2019-08-30 15:53
閱讀 2289·2019-08-30 15:43
閱讀 1180·2019-08-29 18:40
閱讀 1981·2019-08-26 13:28
閱讀 1983·2019-08-23 18:20
閱讀 555·2019-08-23 15:07