摘要:瀏覽器問題執(zhí)行多次模塊。瀏覽器問題加載頁面失敗加載沒有的模塊腳本。您可以通過添加屬性來向同源模塊添加憑據(jù)這對(duì)我來說似乎有點(diǎn)奇怪,我在規(guī)范中對(duì)此提出質(zhì)疑。瀏覽器問題使用憑據(jù)請(qǐng)求同源模塊。已在中修復(fù)默認(rèn)請(qǐng)求同源模塊的時(shí)候攜帶了憑據(jù)。
原文鏈接:ECMAScript modules in browsers作者:Jake Archibald
瀏覽器現(xiàn)在可以使用 ES 模塊(module)了!它們是:
Safari 10.1
Chrome 61
Firefox 60
Microsoft Edge 16
// utils.mjs export function addTextToBody(text) { const div = document.createElement("div"); div.textContent = text; document.body.appendChild(div); }
在線演示
您只需要在 script 元素上添加 type=module,瀏覽器就會(huì)將內(nèi)聯(lián)腳本或外部腳本作為 ECMAScript module 處理。
關(guān)于模塊(module)已經(jīng)有一些很棒的文章,但是我想分享一些在我測(cè)試和閱讀規(guī)范的時(shí)候?qū)W到的瀏覽器特有的內(nèi)容。
目前還不支持的某些 import 用法// 已支持: import {foo} from "https://jakearchibald.com/utils/bar.mjs"; import {foo} from "/utils/bar.mjs"; import {foo} from "./bar.mjs"; import {foo} from "../bar.mjs"; // 不支持: import {foo} from "bar.mjs"; import {foo} from "utils/bar.mjs";
有效的模塊路徑說明符必須符合下列條件之一:
一個(gè)完整的非相對(duì)URL,這樣在將其傳給 new URL(moduleSpecifier) 的時(shí)候才不會(huì)報(bào)錯(cuò)。
以 / 開頭的。
以 ./ 開頭的。
以 ../ 開頭的。
其他形式的說明符保留供將來使用,例如導(dǎo)入內(nèi)置模塊。
使用 nomodule 來向后兼容在線演示
支持 type=module 的瀏覽器會(huì)忽略屬性為 nomodule 的腳本。這意味著您可以給支持模塊的瀏覽器提供模塊樹,同時(shí)給其他瀏覽器提供一個(gè)降級(jí)版本。
瀏覽器問題
Firefox 瀏覽器不支持 nomodule (issue)。已在 Firefox nightly 中修復(fù)!
Edge 瀏覽器不支持 nomodule (issue)。已在 Edge 16 中修復(fù)!
Safari 瀏覽器不支持 nomodule。已在 Safari 11 中修復(fù)!對(duì)于 10.1,這里有一個(gè)非常聰明的替代辦法。
在線演示
執(zhí)行的順序是:2.js,1.mjs,3.js。
script 在獲取期間會(huì)阻塞 HTML 解析器,簡(jiǎn)直太糟糕了。對(duì)于常規(guī)腳本,您可以使用 defer 來避免阻塞,當(dāng)然這也會(huì)推遲腳本的執(zhí)行,直到文檔完成解析,并與其他延遲腳本一起維護(hù)執(zhí)行順序。模塊腳本的默認(rèn)表現(xiàn)行為就像 defer ——當(dāng)它正在獲取時(shí),沒有辦法讓一個(gè)模塊腳本阻塞 HTML 解析器。
模塊腳本使用和添加了 defer 的常規(guī)腳本相同的執(zhí)行隊(duì)列。
內(nèi)聯(lián)腳本也是延時(shí)的在線演示
執(zhí)行順序是1.js ,內(nèi)聯(lián)腳本,內(nèi)聯(lián)腳本,2.js 。
常規(guī)的內(nèi)聯(lián)腳本會(huì)忽略 defer ,然而內(nèi)聯(lián)模塊腳本卻總是被延遲,無論它們有沒有導(dǎo)入任何東西。
Async 對(duì)內(nèi)聯(lián)、外部模塊同樣適用在線演示
快速下載的腳本會(huì)在慢速下載的腳本之前執(zhí)行。
與常規(guī)腳本一樣,async 會(huì)讓腳本在下載過程中不會(huì)阻塞 HTML 解析器,并且盡快地執(zhí)行。與常規(guī)腳本不同,async 也適用于內(nèi)聯(lián)模塊。
與往常的 async 一樣,腳本不會(huì)按照它們出現(xiàn)在 DOM 中的順序執(zhí)行。
瀏覽器問題
Firefox 瀏覽器不支持內(nèi)聯(lián)模塊腳本上的 async (issue)。已在 Firefox 59 中修復(fù)!
在線演示
如果您理解 ES 模塊,您就會(huì)知道您雖然可以引入它們很多次,但是它們卻僅僅會(huì)執(zhí)行一次。當(dāng)然,這同樣適用于HTML中的腳本模塊 - 特定URL的模塊腳本每頁只執(zhí)行一次。
瀏覽器問題Edge 執(zhí)行多次模塊 (issue)。已修復(fù),但是還沒發(fā)布(希望 Edge 17 會(huì)帶上這個(gè)修復(fù)內(nèi)容)。
總是使用 CORS在線演示
與常規(guī)腳本不同,模塊腳本(及其引入的內(nèi)容)是通過 CORS 獲取的。這就意味著跨域的模塊腳本必須返回有效的 CORS 響應(yīng)頭 ,比如 Access-Control-Allow-Origin: *。
瀏覽器問題
Firefox 加載 Demo 頁面失敗 (issue)
Edge 加載沒有 CORS header 的模塊腳本 (issue)。 已在 Edge 16 中修復(fù)!
在線演示
如果請(qǐng)求來自相同的源,大多數(shù)基于 CORS 的 API 會(huì)發(fā)送憑據(jù)(cookie 等),但是 fetch() 和模塊腳本卻是例外的——非您要求它們,否則它們不會(huì)發(fā)送憑據(jù)除。
您可以通過添加 crossorigin 屬性來向同源模塊添加憑據(jù)(這對(duì)我來說似乎有點(diǎn)奇怪,我在規(guī)范中對(duì)此提出質(zhì)疑)。如果您打算向其他的源也發(fā)送憑據(jù),使用 crossorigin="use-credentials"。注意其他源必須使用 Access-Control-Allow-Credentials:true 的響應(yīng)頭來響應(yīng)。
此外,還有一個(gè)與“模塊只執(zhí)行一次”規(guī)則相關(guān)的問題。模塊由其URL標(biāo)記,因此如果首次請(qǐng)求了一個(gè)模塊而不攜帶憑據(jù),然后再次攜帶憑據(jù)請(qǐng)求該模塊,那么第二次獲得的依然是不攜帶憑證的模塊。 這就是為啥我在上面的URL中使用 問號(hào) ? 的原因,使它們成為唯一的。
更新: 上面的情況可能很快就會(huì)發(fā)生改變。fetch() 和模塊腳本默認(rèn)都會(huì)向同源的 URL 發(fā)送憑據(jù)。Issue
瀏覽器問題
Chrome 使用憑據(jù)請(qǐng)求同源模塊(issue)。已在 Chrome 61 中修復(fù)!
Safari 即使添加了 crossorigin 屬性,也不使用憑據(jù)請(qǐng)求同源模塊(issue)。
Edge 即使添加了 crossorigin 屬性,也不使用憑據(jù)請(qǐng)求同源模塊(issue)。已在 Edge 16 中修復(fù)!
Edge 默認(rèn)請(qǐng)求同源模塊的時(shí)候攜帶了憑據(jù)(issue)。
MIME 類型不同于常規(guī)腳本,模塊腳本必須是有效的 JavaScript MIME 類型中的一種類型,否則模塊就不會(huì)執(zhí)行。HTML 標(biāo)準(zhǔn)建議使用 text/javascript。
瀏覽器問題Edge 執(zhí)行無效的 MIME 類型腳本(issue)
這就是我目前學(xué)到的內(nèi)容啦。毋庸置疑,我對(duì) ES 模塊登陸瀏覽器感到非常興奮!
性能建議,動(dòng)態(tài)導(dǎo)入等等!請(qǐng)查閱有關(guān) Web Fundamentals 的文章,深入了解模塊使用情況。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100764.html
摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國(guó)際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...
摘要:隨后,它出現(xiàn)在公司之后的瀏覽器,以及從微軟從起發(fā)布的所有瀏覽器上。標(biāo)準(zhǔn)的第版在年月的大會(huì)上被表決接受。第版在年月底大會(huì)上被采納。 前言 ??本系列譯文的初衷旨在希望更多人能夠了解關(guān)于JS的一些基本概念,遇到原理性的問題時(shí)多去翻翻文檔,而不是在社區(qū)無休止的重復(fù)提出某些在文檔中能夠非常方便快捷就能找到的東西。 ??精力和水平有限,所以暫時(shí)只打算嘗試翻譯前面幾章概括性的介紹,同時(shí)后面的章節(jié)大...
摘要:將轉(zhuǎn)換成常見的使用實(shí)現(xiàn)的基于迭代器的迭代。處停止迭代器基于鴨子模型接口這里使用語法僅僅為了說明問題使用支持為了使用迭代器屬性需要引入。生成器是迭代器的子類,包含了附加的與。 原文地址:http://babeljs.io/docs/learn-...本文基于Luke Hoban精妙的文章《es6features》,請(qǐng)把star獻(xiàn)給他,你可以在此嘗試這些特性REPL。 概述 ECMAScr...
摘要:有哪些新特性有哪些改進(jìn)學(xué)著使用這個(gè)新版本,來構(gòu)建更快的應(yīng)用吧。繼版本之后,花了將近八個(gè)月的時(shí)間來發(fā)布。的創(chuàng)始人之一,,建議用戶使用,以便使用最優(yōu)的性能,是因?yàn)樵创a使用了新特性。全新的插件系統(tǒng)配備了全新整改的插件系統(tǒng)。 本文原文地址:https://auth0.com/blog/webpac...第一次翻譯,不當(dāng)之處,歡迎指正 官方已經(jīng)發(fā)布了Webpack 4.0。有哪些新特性?有哪些...
摘要:技術(shù)上來說這個(gè)機(jī)制被稱為動(dòng)態(tài)分配或代理。定義類一個(gè)類是一個(gè)正式的抽象集,它規(guī)定了對(duì)象的初始狀態(tài)和行為。技術(shù)上來說一個(gè)類表示構(gòu)造函數(shù)原型的組合。因此構(gòu)造函數(shù)創(chuàng)建對(duì)象并自動(dòng)設(shè)置新創(chuàng)建實(shí)例的原型。第二次調(diào)用時(shí),相同的上下文再次被壓入棧并恢復(fù)。 原文:JavaScript. The Core: 2nd Edition作者:Dmitry Soshnikov 文章其他語言版本:俄語 這篇文章是 ...
閱讀 2871·2021-10-14 09:43
閱讀 1657·2021-09-29 09:34
閱讀 1743·2021-07-28 00:16
閱讀 2963·2019-08-30 15:53
閱讀 2905·2019-08-30 13:59
閱讀 2961·2019-08-30 13:57
閱讀 1091·2019-08-26 13:38
閱讀 1893·2019-08-26 13:25