使用名称空间

时间:2016-02-04 10:13:08

标签: javascript namespaces ecmascript-6 babeljs traceur

我们有一个基于PolymerChromium的跨平台应用程序。

目前,我们所有的JavaScript依赖关系都是通过正确顺序导入index.html来维护的!这种方法很快就会成为一场噩梦并且编写测试并且看到测试覆盖率并不是一件容易的事。

为了成为未来的保存,我们决定采用ES2015模块化方法。

现在我们需要重新设计JavaScript文件,以便能够维护单个JavaScript模块之间的依赖关系。到现在为止还挺好。但是我们如何做到这一点来保留我们的命名空间,闭包等?

这是一个示例代码:

//namespace check
var app_ns = app_ns || { };

// ****************************************************************************
// Module: app
// ****************************************************************************

app_ns.app = (function initialize () {

  // ***
  // basic APIs and definitions
  // ***

  // Application version will be replaced by Gruntfile task.
  // Don't change the version manually!!!
  var AW_VERSION = "1.4.32";

  function version () { return AW_VERSION; }
  ...

  // ***
  // exports
  // ***
  return {
    version : version
  };  
}());

从上面的代码中可以看出,执行初始化并将其分配给app_ns.app。由于简单,代码片段不会显示与其他模块的依赖关系,但我们肯定会有这些依赖!

所以问题是

  • 如何在ES2015中使用名称空间
  • 如何自动执行闭包
  • 如何导出模块的功能但不在全局范围内!

使用export { xxx };导出全局范围内{...}内的所有函数,对吧?如何将导出的函数绑定到正确的命名空间?在此示例中为app_ns.app

1 个答案:

答案 0 :(得分:0)

“使用export {xxx};正在全局范围内导出{...}内的所有函数,对吧?”不太正确。它将其导出到导入它的范围。目前,浏览器没有本地处理模块的方法,因此大多数捆绑器将其转换为CommonJs标准并将其范围限定为不会破坏全局。如果模块范例下需要名称空间,我会重新评估。