瀏覽器直接支持ES6了,還需要編譯么?
最近看到chrome支持ES6 import語法了,原生的哦,詳情可見 ESModules VanillaJS ? TodoMVC
自己隨後又測試了下,測試的幾個ES6語法都可以使用了,所以在不遠的未來,通過babel轉換語法是不是多餘的呢?
為了兼容不支持 ES6 的瀏覽器,所以需要 babel 編譯。為了兼容不支持 module 的瀏覽器,所以需要 webpack 打包。那麼隨著瀏覽器的發展,是不是 babel 就不再需要了呢?
但是。。。
ES 也再發展啊。
雖然 Chrome 支持了 ES6 import 語法,但是我們寫的代碼真的是 ES6 嗎?
ES6 也稱 ES2015,顧名思義就是 2015 年發布的 ES 規範,而今年是 2017 年 Chrome 依然在持續進行 ES6 的支持和性能優化。
我們使用的 Array.prototype.includes 就是 ES7 的、而 Object.values、async/await 則是 ES8 的。還有很多沒有進入 ES 正式規範的,正在制定中的,我們都可以通過 babel 來編譯,比如 for-await-of、decorators、do expression、…… 還有備受期待的 Optional Chaining
我們再來看一個在 React 中使用最多的語法:
class LoggingButton extends React.Component {
// 事件綁定
handleClick = () =&> {
console.log("this is:", this);
}
render() {
return (
&
);
}
}
這個語法使用到的 public class fields syntax 目前還在 Stage 2。
所以,瀏覽器的發展永遠趕不上 es 的發展,而且即使瀏覽器支持了最新的 es 規範,但是用戶的瀏覽器也不一定升級到了最新版本。
綜上,如果你僅僅是想使用 ES6 而不嘗嘗新,那麼可以不需要編譯。
如果程序員能把不升級瀏覽器的用戶都幹掉,就不用編譯。
是的。如果你的目標只是es6的話。可是還有es7,es8標準會出來。瀏覽器跟不上的時候,總是babel這類東西新跟上。所以如果你想用的東西被支持得很好那就不必要用預編譯的工具了。
babel不只是轉es6,那只是它的一個preset,你是想問es6轉換這一步還有沒有必要吧?肯定是沒必要了,但是es也在發展啊,如果以後es7,es8,es9呢?不是也要轉換么?仍然需要es next 轉換成es now啊(話說現在說的es6比較寬泛了,很多語法都是es7 stage了)估計你是看了阮老師那個手冊吧,那本書叫es6,但是裡面很多不全是es6
少年,你聽說過IE嗎?
1000個文件算小項目了吧。你讓瀏覽器去分1000次去伺服器下載嗎。對於後端來講,只不過換種語法而已。對於瀏覽器斷,其實沒啥一樣。純es6的語法規範,並沒有涉及具體的開發場景。
第一,ES6其實也是相對比較老的規範了,然而幾個主流瀏覽器現在還沒支持全,js標準步子邁太大扯著蛋的程度可想而知,自己玩兒是一回事,不要想著不需要在產品級代碼里做兼容這回事。
第二,你拿最新chrome舉例子,其他瀏覽器用戶肯定不開心。
彷彿聽到有錢人說:我買了輛車,還需要走路嗎 ?
好吧,言歸正傳。編譯只是為了對瀏覽器做向下兼容而已。一旦向下兼容這種需求的用戶群體不存在了,那麼編譯也就自然沒有意義了。總結兩點就是
1.babel的編譯不單單只是在開發者本地環境下運行,需要考慮到用戶的環境(用戶的瀏覽器)
2.目前chrome是支持ES6的部分語法,可是ES現在已經又出了ES7,ES8的版本了,
你需要去學習他,使用他。這時候你的環境未必支持,這時候還是需要babel
我覺得這個問題的根本矛盾在於開發者沒法讓用戶更新他們的瀏覽器,歸根到底也就是:
人民日益增長的物質文化需要同落後的社會生產之間的矛盾
因為有人用不支持ES6的瀏覽器,所以還是要用babel......
推薦閱讀:
TAG:GoogleChrome | ECMAScript2015 | Babel |