【问题标题】:What are extra advantage of using ES6 module instead of revealing module pattern?使用 ES6 模块而不是揭示模块模式有什么额外的优势?
【发布时间】:2016-06-18 00:46:08
【问题描述】:

我正在探索 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 & exports 喜欢export { a as abc}

通过闭包和模块模式,我们可以在 return 语句中任意命名,例如 return { a:_abc}

我的问题:我们可以通过使用 es6 模块而不是闭包和 MP 获得什么额外的好处。我想一个是减少代码行数。

如果我遗漏了任何基本区别,请见谅

【问题讨论】:

  • 虽然我理解您的帖子的重点,但您现在提出的问题过于广泛,不适合 SO。请edit您的问题更集中。
  • @Kyll 说得对。即使我在努力寻找合适的标题,我还是改变了它。希望它会收敛到我的疑问
  • “我们可以通过使用 es6 模块而不是闭包获得什么额外的好处”恕我直言仍然过于宽泛。你能专注于一个技术问题而不是这样一个悬而未决的问题吗?
  • 您的 ES6 模块有语法错误,export 声明必须是顶级的。请正确缩进您的代码。
  • 不,您不能使用import {utils} from … 进行默认导出。

标签: javascript closures ecmascript-6


【解决方案1】:

使用var util = (function(){ bla bla bla }(util || {}));,全局命名空间被污染了,所以一旦你使用了import {utils} from "path/to/file",它将保留在全局命名空间中,即你将在任何地方都有window.util,即使模块完成了它的工作并且替换为其他模块。现在假设您有 100 多个模块并且您以相同的方式进行操作,然后想象一下可怜的 window 会变得多么肮脏!

但是如果使用 ES6 Module 或者 CommonJS 甚至 AMD,那么

  1. 全局命名空间没有被污染。
  2. [ES6] 可以使用export default something 导出默认值以使用import from "path/to/file"
  3. [ES6] 你可以从 ES6 模块中导出多个东西,使用 export["anotherthing"]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多