模块系统主要解决模块的定义、依赖和导出。

  • CommonJS是以在浏览器环境之外构建JavaScript生态系统为目标而产生的项目,比如在服务器和桌面环境中。
  • CommonJS规范是为了解决JavaScript的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过module.exports导出对外的变量或接口,通过require()来导入其他模块的输出到当前模块作用域中。
  • CommonJS是同步加载模块,同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的。但其实也有浏览器端的实现,其原理是先将所有模块都定义好并通过id索引,这样就可以方便的在浏览器环境中解析了。(Browserify,浏览器端的CommonJS实现,可以使用NPM的模块,但是编译打包后的文件体积可能很大)
  • AMD:Asynchronous Module Definition规范其实只有一个主要接口define(id?, dependencies?, factory),它要在声明模块的时候指定所有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行,依赖前置。
  • ES6模块:ECMAScript6标准增加了JavaScript语言层面的模块体系定义。ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。
  • 在 web 项目中,所有的文件名应该都遵循同一命名约定。以可读性而言,减号(-)是用来分隔文件名的不二之选。同时它也是常见的 URL 分隔符,所以理所当然的,减号应该也是用来分隔资源名称的好选择。

Comments

2017-06-29

⬆︎TOP