使用ES6模块而不是显示模块模式有什么额外的好处?

时间:2016-03-04 10:17:10

标签: javascript closures ecmascript-6

我正在探索ES6 module并试图找出使用ES6模块而不是closure以及module pattern(MP)获得的额外优势。

例如 ES6中的util.js。

   var util ={
         abc:function(){
        //function body
    },
    def:function(){
         // function body
    }
    export default utils;   // here export is exposing the entire object
}

util.js使用闭包&模块模式

var util = (function(){
       function _abc(){
         console.log("abc")
           // function body
       };
    function _def(){
         // function body
      }

  return{          // each of the function will be exposed
      abc:_abc,
      def:_def

}
}(util ||{}))

ES6中的someFile.js

import {utils} from "path/to/file"

在someFile.js中有封闭&模块模式

util.abc() // Will log "abc"

我也知道es6 module允许我们重命名imports & exportsexport { a as abc}一样。

关闭&模块模式我们可以在return语句中给出一个我们喜欢的名称,如return { a:_abc}

我的问题:使用es6模块代替封闭和放大,我们可以获得多大的好处? MP.One我想是减少代码行。

如果我错过了任何基本的差异,请原谅我

1 个答案:

答案 0 :(得分:7)

使用var util = (function(){ bla bla bla }(util || {}));全局命名空间会受到污染,因此一旦使用了import {utils} from "path/to/file",它就会保留在全局命名空间中,即你在任何地方都会window.util,即使在模块已完成它的工作并由其他模块替换。现在考虑你有100个模块,你以相同的方式做到这一点,然后想象可怜的窗口会变得多么脏!

然而,如果使用ES6模块或CommonJS甚至AMD,那么

  1. 全局命名空间未受到污染。
  2. [ES6]您可以使用export default something导出默认值以使用import from "path/to/file"
  3. [ES6]您可以使用export["anotherthing"]
  4. 从ES6模块导出多个内容

    此外,我建议您阅读此blog post