摘要:換言之,用的代碼取代。模塊在頂層作用域中創建聲明變量的行為有別于腳本。但現在是可以部署的,所以是時候去改變了。通過發布,我們為開發人員提供了一種選擇,并最終惠及每個人。編寫代碼對開發者來說是一個勝利,部署代碼對用戶來說是一個勝利。
原文鏈接
與我交流過的絕大多數web開發者,都喜歡使用所有新的語法特性(如async/await,類,箭頭函數等)。盡管所有現代瀏覽器都支持以上的語法,多部分開發者仍然會轉譯到ES5并且加上polyfill以便支持哪一小部分仍舊使用老版本瀏覽器的用戶。
這...有點糟。在理想的的世界中,是沒有不必要的代碼!
新版本的JS和DOM接口能讓我們選擇性地加載polyfill,因為在運行時,我們可以檢測瀏覽器對新特性的支持情況。但是新的JS語法有一點不好,因為無法識別的語法都會造成解析錯誤,導致沒有代碼會被執行。
雖然現在并沒有對feature-detecting這個語法的好的解決方案,但我們確實有一個方法能做到ES2015語法支持的檢測。
這就是
多數開發者將視為加載ES模塊的一種方式(這沒毛病啊),但也有更直接且實際的加載常規JavaScript文件與ES2015+功能,并知道瀏覽器能處理它!
換言之,所有支持語法的瀏覽器也支持絕大多數你愛的那些ES2015+屬性。例如:
async/await
類
箭頭函數
fetch,Promise,Map,Set等
剩下的事就是為不支持的瀏覽器提供一個降級的處理。如果你正在生成一個ES5版本的代碼,那么恭喜你你已經做好這一步了,現在你需要做的就是生成一個ES2015+的版本!
本篇余下的部分將討論如何實現這一技術以及發布ES2015+代碼的能力將如何改變我們編寫模塊的方式。
實現如果你已經上手了webpack或rollup這樣的工具來生成你的JS,那就繼續吧!
下一步,在現有bundle的基礎上,你要生成第二份bundle。與第一份bundle的唯一區別就是你不再需要把代碼轉譯到ES5版本,同時你也不用在引入任何polyfill。
在使用babel-preset-env的前提下,第二步是非常簡單的。你唯一要做的就是改變配置中的瀏覽器列表到支持的瀏覽器,這樣Babel就不會進行那些不必要的轉譯。
換言之,用ES2015+的代碼取代ES5。
舉個例子,如果你在使用webpack,entry的路徑是./path/to/main.js。目前的配置(要編譯成ES5版本的)應該大致如下(我會把這個bundle曾為"古早版",因為它是ES6的):
module.exports = { entry: { "main-legacy": "./path/to/main.js", }, output: { filename: "[name].js", path: path.resolve(__dirname, "public"), }, module: { rules: [{ test: /.js$/, use: { loader: "babel-loader", options: { presets: [ ["env", { modules: false, useBuiltIns: true, targets: { browsers: [ "> 1%", "last 2 versions", "Firefox ESR", ], }, }], ], }, }, }], }, };
要得到一個現代的支持ES2015+的版本。你要做的僅僅是將目標環境改成支持的瀏覽器,像下面這樣:
module.exports = { entry: { "main": "./path/to/main.js", }, output: { filename: "[name].js", path: path.resolve(__dirname, "public"), }, module: { rules: [{ test: /.js$/, use: { loader: "babel-loader", options: { presets: [ ["env", { modules: false, useBuiltIns: true, targets: { browsers: [ "Chrome >= 60", "Safari >= 10.1", "iOS >= 10.3", "Firefox >= 54", "Edge >= 15", ], }, }], ], }, }, }], }, };
當你執行構建時,這兩個配置文件會得到兩個JS文件:
main.js (ES2015+語法)
main-legacy.js (ES5語法)
下一步,就是更新你的HTML來支持選擇性加載JS bundle。你同時可以使用和來實現。
小貼士:可惡的Safari 10并不支持nomodule屬性,不過你可以在HTML前部引入safari-nomodule.js來解決這一問題。(好在,在Safari 11種他們解決了這個問題,我到都拔出來了)重要的思考
!
這多數情況下,這個方法“能用”。但是在使用這一策略前,我們需要了解模塊加載的一些細節。
模塊會像語言一樣被加載,這就意味著。知道文件被解析前都不會被執行。如果你有一些代碼需要先行,請把它們拆分出來,然后多帶帶引用。
模塊會默認使用嚴格模式,所以如果出于某種原因,你不要使用嚴格模式,請拆分出這部分代碼,并多帶帶引用。
模塊在頂層作用域中創建/聲明變量的行為有別于腳本。在腳本中通過var foo = "bar"或是 函數聲明function foo() {…}的變量可以通過window.foo訪問。但在一個模塊中卻并非如此。所以這可能會成為你書寫代碼時的一個坑!
一個實際的例子我創建了一個模版項目,讀者可以看到這一方法在實際工作中的應用。
在這個模版中,我試用了許多新出的webpack特性,因為這個技術在實際工作中真的能用。擺脫,我可不是趙括。這些特性包括我們常見的實踐:
代碼拆分
動態引用(在運行時,根據條件引用額外代碼)
資產指紋(一個有效的長期緩存)
我不會用自己不會的技術,如果你想要了解更多歡迎閱讀源代碼
如果你并非使用webpack來生成生產環境的bundle,過程也大同小異。我之所以選擇webpack,因為它是當下最流行的,但它也是最復雜的!如果webpack能用,那么其他工具也能使用。
真的需要搞得這么復雜?在我看來必須的,這些付出是值得的。下表比較了兩種版本最終生成文件的實際大小:
即便經過Gzip傳統ES5版本也是ES2015+版本體積的兩倍。
大體積文件不盡更耗費時間去加載,同時,也需要更長時間解析與執行。這兩個版本的解析/執行時間依舊是兩倍的關系。(這個測試我試用了webpagetest.org提供的 Moto G4)
雖然這些獨立的文件不大,解析/執行的時間也不是特別長,但這僅僅是個博客。如果是外頭那些龐然大物,ES2015+你絕對值得擁有!
一項來之HTTPArchive數據的統計顯示。Alexa排名前列的網站中有85181在他們的項目中使用了babel-polyfill, core-js, 或是regenerator-runtime。6個月前這個數字是34588!
現實就是轉譯以及使用polyfill正迅速成為新的標準。不幸的事,大部分用戶正因此犧牲了流量來下載這些本來可以更小的文件。
是時候,祭出ES2015了現在的問題就是開發者并沒有發布ES2015+版本的代碼,而是發布了轉譯后的ES5版本。
但現在ES2015+是可以部署的,所以是時候去改變了。
我完全明白,這會帶來一些陣痛。 如今大多數構建工具發布的文檔,都推薦ES5的配置。 這意味著,如果模塊作者開始向npm發布ES2015 +源代碼,他們可能會破壞一些用戶的構建,這將會造成混亂。
問題是大多數使用Babel的開發人員將它配置為不在node_modules中傳輸任何內容,但是如果模塊是使用ES2015 +源代碼發布的,則這是一個問題。 幸運的是修復很簡單。 您只需從構建配置中刪除node_modules排除:
rules: [ { test: /.js$/, exclude: /node_modules/, // 移除這行 use: { loader: "babel-loader", options: { presets: ["env"] } } } ]
弊端就是,babel這樣的工具不僅僅需要本地依賴關系,在執行時還需要在node_modules中傳遞這種關系。這樣構件會變慢。不過這一問題可以在持續化的本地緩存工具上得到解決。
縱使前途坎坷,我們也因該為提升用戶體驗大步向前。通過發布ES2015,我們為開發人員提供了一種選擇,并最終惠及每個人。
結論的價值遠不僅僅是為了在瀏覽器中加載ES模塊。
在支持這一特性的現代瀏覽器中,可以給予開發者,選擇性加載單一JS文件的預約體驗。
這與nomodule屬性一起,為我們提供了一種在生產環境中使用ES2015+代碼的方法,我們終于可以停止向不需要它的用戶發送如此多的代碼。
編寫ES2015代碼對開發者來說是一個勝利,部署ES2015代碼對用戶來說是一個勝利。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95797.html
摘要:如果是在生產環境下,則加入插件,執行代碼壓縮,并且去除。規定了在開發環境下才使用。疑問目前為止,對于多頁面項目還是沒有找到一個很好的方案去構建自動化。原文可以看我的博客最佳實踐部署生產 tip webpack的入門篇可以看我的這一片博文。《如何使用webpack—webpack-howto》. 前言 最近一段時間在項目中使用了webpack和React來開發,總之來說也是遇到了許多坑,...
摘要:已經轉碼成了已經轉碼成了合并壓縮并重命名的文件使用如果我們使用了中的,通過進行模塊化開發,那么通過轉碼后,將被轉碼成符合規范的和等,但是瀏覽器還是不認識,這時可以使用對代碼再次進行構建。 一說起ES6,總會順帶看到webpack、babel、browserify還有一些認都不認識的blabla名詞,對于gulp才會一點點的我來說,內心簡直是崩潰的,上網查了一些文章,探索著用gulp搭起...
摘要:雖然夠好用,奈何沒有瀏覽器對其可以完全支持,本文書寫時間,開發版號稱已經支持的特性。開始安裝本系列假定讀者都有使用經驗,如果還沒有,趕緊去這里了解并安裝吧。到此,我們的已經準備就緒。 通過前面章節的講解,大家對ES2015的一些新語法有了初步的理解,之前我們的測試代碼都可以直接放入 Chrome Console 中直接運行,為了更好的學習后面的面向對象和模塊開發,我先用一章介紹一下 B...
摘要:轉自前端外刊評論非常感謝,翻譯的很好,受益很多,轉到此處讓前端小伙伴們也驚呆下上次我寫前端工程師必知必會已經是三年前了,那是我寫過最火的文章了。測試的第二大障礙是工具。 轉自:前端外刊評論 非常感謝,翻譯的很好,受益很多,轉到此處讓前端小伙伴們也驚呆下........ 上次我寫《前端工程師必知必會》已經是三年前了,那是我寫過最火的文章了。三年了,我仍然會在Twitter上...
閱讀 2420·2021-11-18 10:02
閱讀 688·2021-10-08 10:04
閱讀 2250·2021-09-03 10:51
閱讀 3540·2019-08-30 15:44
閱讀 2799·2019-08-29 14:09
閱讀 2464·2019-08-29 12:21
閱讀 2065·2019-08-26 13:45
閱讀 1800·2019-08-26 13:25