摘要:換言之,用的代碼取代。模塊在頂層作用域中創(chuàng)建聲明變量的行為有別于腳本。但現(xiàn)在是可以部署的,所以是時(shí)候去改變了。通過(guò)發(fā)布,我們?yōu)殚_(kāi)發(fā)人員提供了一種選擇,并最終惠及每個(gè)人。編寫(xiě)代碼對(duì)開(kāi)發(fā)者來(lái)說(shuō)是一個(gè)勝利,部署代碼對(duì)用戶(hù)來(lái)說(shuō)是一個(gè)勝利。
原文鏈接
與我交流過(guò)的絕大多數(shù)web開(kāi)發(fā)者,都喜歡使用所有新的語(yǔ)法特性(如async/await,類(lèi),箭頭函數(shù)等)。盡管所有現(xiàn)代瀏覽器都支持以上的語(yǔ)法,多部分開(kāi)發(fā)者仍然會(huì)轉(zhuǎn)譯到ES5并且加上polyfill以便支持哪一小部分仍舊使用老版本瀏覽器的用戶(hù)。
這...有點(diǎn)糟。在理想的的世界中,是沒(méi)有不必要的代碼!
新版本的JS和DOM接口能讓我們選擇性地加載polyfill,因?yàn)樵谶\(yùn)行時(shí),我們可以檢測(cè)瀏覽器對(duì)新特性的支持情況。但是新的JS語(yǔ)法有一點(diǎn)不好,因?yàn)闊o(wú)法識(shí)別的語(yǔ)法都會(huì)造成解析錯(cuò)誤,導(dǎo)致沒(méi)有代碼會(huì)被執(zhí)行。
雖然現(xiàn)在并沒(méi)有對(duì)feature-detecting這個(gè)語(yǔ)法的好的解決方案,但我們確實(shí)有一個(gè)方法能做到ES2015語(yǔ)法支持的檢測(cè)。
這就是
多數(shù)開(kāi)發(fā)者將視為加載ES模塊的一種方式(這沒(méi)毛病?。?b>
小貼士:可惡的Safari 10并不支持nomodule屬性,不過(guò)你可以在HTML前部引入safari-nomodule.js來(lái)解決這一問(wèn)題。(好在,在Safari 11種他們解決了這個(gè)問(wèn)題,我到都拔出來(lái)了)重要的思考
!
這多數(shù)情況下,這個(gè)方法“能用”。但是在使用這一策略前,我們需要了解模塊加載的一些細(xì)節(jié)。
模塊會(huì)像語(yǔ)言一樣被加載,這就意味著。知道文件被解析前都不會(huì)被執(zhí)行。如果你有一些代碼需要先行,請(qǐng)把它們拆分出來(lái),然后多帶帶引用。
模塊會(huì)默認(rèn)使用嚴(yán)格模式,所以如果出于某種原因,你不要使用嚴(yán)格模式,請(qǐng)拆分出這部分代碼,并多帶帶引用。
模塊在頂層作用域中創(chuàng)建/聲明變量的行為有別于腳本。在腳本中通過(guò)var foo = "bar"或是 函數(shù)聲明function foo() {…}的變量可以通過(guò)window.foo訪(fǎng)問(wèn)。但在一個(gè)模塊中卻并非如此。所以這可能會(huì)成為你書(shū)寫(xiě)代碼時(shí)的一個(gè)坑!
一個(gè)實(shí)際的例子我創(chuàng)建了一個(gè)模版項(xiàng)目,讀者可以看到這一方法在實(shí)際工作中的應(yīng)用。
在這個(gè)模版中,我試用了許多新出的webpack特性,因?yàn)檫@個(gè)技術(shù)在實(shí)際工作中真的能用。擺脫,我可不是趙括。這些特性包括我們常見(jiàn)的實(shí)踐:
代碼拆分
動(dòng)態(tài)引用(在運(yùn)行時(shí),根據(jù)條件引用額外代碼)
資產(chǎn)指紋(一個(gè)有效的長(zhǎng)期緩存)
我不會(huì)用自己不會(huì)的技術(shù),如果你想要了解更多歡迎閱讀源代碼
如果你并非使用webpack來(lái)生成生產(chǎn)環(huán)境的bundle,過(guò)程也大同小異。我之所以選擇webpack,因?yàn)樗钱?dāng)下最流行的,但它也是最復(fù)雜的!如果webpack能用,那么其他工具也能使用。
真的需要搞得這么復(fù)雜?在我看來(lái)必須的,這些付出是值得的。下表比較了兩種版本最終生成文件的實(shí)際大小:
即便經(jīng)過(guò)Gzip傳統(tǒng)ES5版本也是ES2015+版本體積的兩倍。
大體積文件不盡更耗費(fèi)時(shí)間去加載,同時(shí),也需要更長(zhǎng)時(shí)間解析與執(zhí)行。這兩個(gè)版本的解析/執(zhí)行時(shí)間依舊是兩倍的關(guān)系。(這個(gè)測(cè)試我試用了webpagetest.org提供的 Moto G4)
雖然這些獨(dú)立的文件不大,解析/執(zhí)行的時(shí)間也不是特別長(zhǎng),但這僅僅是個(gè)博客。如果是外頭那些龐然大物,ES2015+你絕對(duì)值得擁有!
一項(xiàng)來(lái)之HTTPArchive數(shù)據(jù)的統(tǒng)計(jì)顯示。Alexa排名前列的網(wǎng)站中有85181在他們的項(xiàng)目中使用了babel-polyfill, core-js, 或是regenerator-runtime。6個(gè)月前這個(gè)數(shù)字是34588!
現(xiàn)實(shí)就是轉(zhuǎn)譯以及使用polyfill正迅速成為新的標(biāo)準(zhǔn)。不幸的事,大部分用戶(hù)正因此犧牲了流量來(lái)下載這些本來(lái)可以更小的文件。
是時(shí)候,祭出ES2015了現(xiàn)在的問(wèn)題就是開(kāi)發(fā)者并沒(méi)有發(fā)布ES2015+版本的代碼,而是發(fā)布了轉(zhuǎn)譯后的ES5版本。
但現(xiàn)在ES2015+是可以部署的,所以是時(shí)候去改變了。
我完全明白,這會(huì)帶來(lái)一些陣痛。 如今大多數(shù)構(gòu)建工具發(fā)布的文檔,都推薦ES5的配置。 這意味著,如果模塊作者開(kāi)始向npm發(fā)布ES2015 +源代碼,他們可能會(huì)破壞一些用戶(hù)的構(gòu)建,這將會(huì)造成混亂。
問(wèn)題是大多數(shù)使用Babel的開(kāi)發(fā)人員將它配置為不在node_modules中傳輸任何內(nèi)容,但是如果模塊是使用ES2015 +源代碼發(fā)布的,則這是一個(gè)問(wèn)題。 幸運(yùn)的是修復(fù)很簡(jiǎn)單。 您只需從構(gòu)建配置中刪除node_modules排除:
rules: [ { test: /.js$/, exclude: /node_modules/, // 移除這行 use: { loader: "babel-loader", options: { presets: ["env"] } } } ]
弊端就是,babel這樣的工具不僅僅需要本地依賴(lài)關(guān)系,在執(zhí)行時(shí)還需要在node_modules中傳遞這種關(guān)系。這樣構(gòu)件會(huì)變慢。不過(guò)這一問(wèn)題可以在持續(xù)化的本地緩存工具上得到解決。
縱使前途坎坷,我們也因該為提升用戶(hù)體驗(yàn)大步向前。通過(guò)發(fā)布ES2015,我們?yōu)殚_(kāi)發(fā)人員提供了一種選擇,并最終惠及每個(gè)人。
結(jié)論的價(jià)值遠(yuǎn)不僅僅是為了在瀏覽器中加載ES模塊。
在支持這一特性的現(xiàn)代瀏覽器中,可以給予開(kāi)發(fā)者,選擇性加載單一JS文件的預(yù)約體驗(yàn)。
這與nomodule屬性一起,為我們提供了一種在生產(chǎn)環(huán)境中使用ES2015+代碼的方法,我們終于可以停止向不需要它的用戶(hù)發(fā)送如此多的代碼。
編寫(xiě)ES2015代碼對(duì)開(kāi)發(fā)者來(lái)說(shuō)是一個(gè)勝利,部署ES2015代碼對(duì)用戶(hù)來(lái)說(shuō)是一個(gè)勝利。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95797.html
摘要:如果是在生產(chǎn)環(huán)境下,則加入插件,執(zhí)行代碼壓縮,并且去除。規(guī)定了在開(kāi)發(fā)環(huán)境下才使用。疑問(wèn)目前為止,對(duì)于多頁(yè)面項(xiàng)目還是沒(méi)有找到一個(gè)很好的方案去構(gòu)建自動(dòng)化。原文可以看我的博客最佳實(shí)踐部署生產(chǎn) tip webpack的入門(mén)篇可以看我的這一片博文。《如何使用webpack—webpack-howto》. 前言 最近一段時(shí)間在項(xiàng)目中使用了webpack和React來(lái)開(kāi)發(fā),總之來(lái)說(shuō)也是遇到了許多坑,...
摘要:已經(jīng)轉(zhuǎn)碼成了已經(jīng)轉(zhuǎn)碼成了合并壓縮并重命名的文件使用如果我們使用了中的,通過(guò)進(jìn)行模塊化開(kāi)發(fā),那么通過(guò)轉(zhuǎn)碼后,將被轉(zhuǎn)碼成符合規(guī)范的和等,但是瀏覽器還是不認(rèn)識(shí),這時(shí)可以使用對(duì)代碼再次進(jìn)行構(gòu)建。 一說(shuō)起ES6,總會(huì)順帶看到webpack、babel、browserify還有一些認(rèn)都不認(rèn)識(shí)的blabla名詞,對(duì)于gulp才會(huì)一點(diǎn)點(diǎn)的我來(lái)說(shuō),內(nèi)心簡(jiǎn)直是崩潰的,上網(wǎng)查了一些文章,探索著用gulp搭起...
摘要:首先,作為入門(mén)的話(huà),的用戶(hù)手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了使用的各方面。所以下面主要是我學(xué)習(xí)的一些筆記,姑且當(dāng)作是一篇入門(mén)吧。下面我們正式進(jìn)入正題。這也是最常用的一個(gè)用法之一。有兩個(gè)方式進(jìn)行配置。 首先,作為入門(mén)的話(huà),Babel的用戶(hù)手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了Babel使用的各方面。所以下面主要是我學(xué)習(xí)Babel的一些筆記,姑且當(dāng)作是一篇入門(mén)吧。 Babel是什么 按照B...
摘要:雖然夠好用,奈何沒(méi)有瀏覽器對(duì)其可以完全支持,本文書(shū)寫(xiě)時(shí)間,開(kāi)發(fā)版號(hào)稱(chēng)已經(jīng)支持的特性。開(kāi)始安裝本系列假定讀者都有使用經(jīng)驗(yàn),如果還沒(méi)有,趕緊去這里了解并安裝吧。到此,我們的已經(jīng)準(zhǔn)備就緒。 通過(guò)前面章節(jié)的講解,大家對(duì)ES2015的一些新語(yǔ)法有了初步的理解,之前我們的測(cè)試代碼都可以直接放入 Chrome Console 中直接運(yùn)行,為了更好的學(xué)習(xí)后面的面向?qū)ο蠛湍K開(kāi)發(fā),我先用一章介紹一下 B...
摘要:轉(zhuǎn)自前端外刊評(píng)論非常感謝,翻譯的很好,受益很多,轉(zhuǎn)到此處讓前端小伙伴們也驚呆下上次我寫(xiě)前端工程師必知必會(huì)已經(jīng)是三年前了,那是我寫(xiě)過(guò)最火的文章了。測(cè)試的第二大障礙是工具。 轉(zhuǎn)自:前端外刊評(píng)論 非常感謝,翻譯的很好,受益很多,轉(zhuǎn)到此處讓前端小伙伴們也驚呆下........ 上次我寫(xiě)《前端工程師必知必會(huì)》已經(jīng)是三年前了,那是我寫(xiě)過(guò)最火的文章了。三年了,我仍然會(huì)在Twitter上...
閱讀 2438·2021-11-18 10:02
閱讀 699·2021-10-08 10:04
閱讀 2277·2021-09-03 10:51
閱讀 3558·2019-08-30 15:44
閱讀 2811·2019-08-29 14:09
閱讀 2477·2019-08-29 12:21
閱讀 2074·2019-08-26 13:45
閱讀 1815·2019-08-26 13:25