ES6模块(JavaScript)

时间:2014-12-14 13:50:48

标签: javascript module ecmascript-6

在ES6下,在客户端,我认为在函数之外定义的东西将继续污染全局范围。在ES5中,我通常会在根"命名空间对象"中注册一堆类型。在申请初始化时,如下:

(function (namespace) {
    function MyConstructor() {
    }

    namespace.MyConstructor = MyConstructor;
}(applicationNamespace));

我稍后可以参考我的类型,如下所示:

var o = new applicationNamespace.MyConstructor();

很容易。

在ES6中,我如何达到同样的效果?我认为我仍然需要在IIFE中包装我的文件中的所有内容以防止污染全球范围?

(function() {
  function MyConstructor() {
  }

  export MyConstructor; // Will this make the constructor function globally visible?
}())

大多数在线示例似乎是针对Node.js,其中文件的内容缺少IIFE,但客户端不会导致全球范围的污染,即使在ES6中也是如此?

export关键字的存在是否会修改范围界定行为?

最后,如何使用ES6模块实现语义命名空间。像myapp.utils.MyConstructor

这样的东西

1 个答案:

答案 0 :(得分:0)

导出不会污染全局命名空间,因为它们需要导入。

作为ES6中的一个例子,你可以写:

export let a = 1;

等效的ES5将是:

var a = 1;
module.exports = { a : a };

在另一个文件中,要使用ES6中的导出变量:

import { a } from './other-file';
console.log(a); // 1

大致相当于以下ES5:

var a = require('other-file').a;
console.log(a); // 1

每个文件的变量都是一个范围,捆绑器通常会在连接时将每个文件包装在一个函数中。

在ES6中创建命名空间

// class-file.js
export default () => {
  console.log('constructor called');
};

// namespace.js
import A from './class-file';
export default {
  A
};

// app.js
import namespace from './namespace';
let a = new namespace.A(); // constructor called