我做了這方面的一些研究:
需要從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)。我的建議是 - 不要爲此使用插件。
我想任何可以工作的東西都是現在的選擇:) –
「*我們最終需要一遍又一遍地重複babel-polyfill *」 - 我沒有看到有什麼問題。它只會被加載和執行一次。這就是模塊的工作原理。 – Bergi
@Bergi,取決於'npm'如何安裝它。如果'npm'安裝多次,它也會被執行多次,實際上會拋出錯誤,請查看:https://github.com/babel/babel/blob/master/packages/babel-polyfill/src /index.js –