2016-01-23 61 views
2

我正在開發大量使用ES6和ES7功能的庫。用Babel編譯會得到代碼,它自然地使用諸如Symbol或Promise之類的基元。我應該require('babel-polyfill')確保這樣的原語確實存在嗎?應該使用ES6和ES7功能的Javascript庫需要babel-polyfill嗎?

在第一時間,答案似乎是'是' - 特別是如果我不知道某人可能執行我的lib的運行時間。另一方面,如果每個圖書館都這樣做,我們最終會一次又一次地要求babel-polyfill(並且我不確定這是否是一個好主意)。

+0

我想任何可以工作的東西都是現在的選擇:) –

+0

「*我們最終需要一遍又一遍地重複babel-polyfill *」 - 我沒有看到有什麼問題。它只會被加載和執行一次。這就是模塊的工作原理。 – Bergi

+1

@Bergi,取決於'npm'如何安裝它。如果'npm'安裝多次,它也會被執行多次,實際上會拋出錯誤,請查看:https://github.com/babel/babel/blob/master/packages/babel-polyfill/src /index.js –

回答

4

我做了這方面的一些研究:

需要從LIB貌似反模式裏面babel-polyfill;這有兩個原因:

1)babel-polyfill不喜歡被需要多次,它會拋出,如果您嘗試做到這一點(見下面的註釋)

2)這樣做會導致由於您必須多次捆綁polyfill,因此庫的大小會顯着增加。

僅當npm無法重複刪除多個babel-polyfill依存關係時,1)和2)都是相關的。如果使用舊版本的npm,則可能會發生這種情況,或者由於依賴性限制,可能無法進行重複數據刪除。由於最新版本不易控制,所以我認爲1)和2)都很嚴重。

而現在,你怎麼樣(可能)應該做到這一點:

如果您在LIB(即承諾)需要一個特定的功能,你可以專門require它(即不是整個填充工具,只是功能)。這種方法減輕了1)並且部分緩解了2)。

可能最好的方法是簡單地警告你的用戶,你的lib需要一些ES6功能,所以他們應該要求使用polyfill。

第一種方法的很好的例子是

https://www.npmjs.com/package/promisify-node

這就要求它的A +兼容無極自己的版本。第二種方法的很好的例子是

https://github.com/ubolonton/js-csp

它使用發電機,但沒有采取任何措施保證,他們是真的在那裏(在一般情況下,只需編制與巴貝爾的代碼是不夠的,你需要需要填充工具使他們工作)。

-------- --------編輯

我發現,那babel-plugin-transform-runtime可以準確地用於這個問題:它允許您使用ES6/ES7功能,無需poluting全局命名空間通過要求polyfill。令人難過的是,這個插件非常麻煩,可能是因爲從事這項工作從根本上很難。例如:

Object.keys({}) 

轉化爲類似於:

var _keys=require("babel-runtime/core-js/object/keys") 
_keys(obj) 

var aaa = Object 
aaa.keys(obj) 

沒有得到根本改變,因此會失敗(如果沒有定義Object.keys既不是瀏覽器也不是polyfill)。我的建議是 - 不要爲此使用插件。