随着JavaScript在Web开发中占的比重原来越重,每个项目中需要用到的JavaScript代码规模也变得原来越大,在这种发展的背景下,怎样有效的管理这些日益庞大的代码,成了日常开发的一个重要课题。为了解决这个问题,出现了我们之前介绍的两个模块规范CMD与AMD,对于ECMAScript 6已经正式发布这个事件,作为一个JSer应该是会此感到比较高兴的,因为它带了很多新特性,让JavaScript在语法上发生了一个重大的变革,这其中就有本节介绍的ES6模块。
一个ES6模块就是一个JavaScript文件,一段稍有差异的脚本代码,说差异其实与普通的脚本代码也没多大差异,主要是下面两点:
除此之外再无异同。
// 定义模块 greet.js export default function() { console.log("hello"); } // 引用模块 main.js import greet from "./greet"; greet(); // hello
ES6模块通过export关键词定义模块对外的接口。模块中的所有变量(对象、函数等)的作用范围只限于模块本身,外部是不能访问的,如果想让外部访问则需要使用export将其暴露出去。
注意点:
// testExport.js export 1; // 错误 let x = 1; export x; // 错误 export var x = 1; // 正确 function f() {}; export f; // 错误 export {f}; // 正确 let object = {x: 1}; export object; 错误 export {object as obj}; // 使用as关键字可以取别名 object.x = 10; // testImport.js import obj from "./testExport"; obj.x; // 10
ES6模块通过import关键词引入其他模块的对外接口。 注意点:
f(); // 不会出错 import f from "module"; let obj = {x: "name"}; import { obj.x + "Func" } from "module"; // 错误 let module = "myModule"; import x from module; // 错误 // 错误 if(true) { import x from "module1"; } else { import x from "module2"; }
ES6模块在不同程度上参考了CMD与AMD规范,并且尽可能去其糟粕,留其精华。ES6模块的主体思想是尽量的静态化,使得在编译事就能确定个模块间的依赖关系,以及相关的输入输出。
主要特点有: