JS中的模块机制

模块机制

JavaScript的模块机制实际上是借鉴的其余程序设计语言的。JavaScript在设计之初并无提供相似模块的功能,随后在ES5时代出现了各类模拟相似的功能模范,而且在ES6中新增了模块机制。模块机制就是将逻辑上相关的代码组织到同一个包内,包内是一个相对独立的做用域,不用担忧命名冲突等等, 当须要在外部使用时直接import相应的package便可。node

无模块化的缺陷

  • 污染全局做用域
  • 维护成本高
  • 依赖关系不明显

CommonJS(NodeJS)

CommonJS:通用模块规范,由NodeJS实现。根据CommonJS规范, 一个单独的文件就是一个模块。每个模块都是一个单独的做用域, 也就是说, 在该模块内部定义的变量, 没法被其余模块读取, 除非定义为global(浏览器中为window)对象的属性。jquery

//模块定义 myModule.js
var name = 'Byron';
function printName(){
    console.log(name);
}
function printFullName(firstName){
    console.log(firstName + name);
}
module.exports = {
    printName: printName,
    printFullName: printFullName
}
//加载模块
var myModule = require('./myModule.js');
myModule.printName();

AMD(RequireJS)

AMD:Asynchronous Module Definition(异步模块定义), 在浏览器端模块化开发的规范, 不是JavaScript原生支持, RequireJS是AMD规范的具体实现(严格上说是RequireJS的推广中产生的AMD规范)。浏览器

// 定义模块 myModule.js
define('myModule', ['dependency'], function(){
    var name = 'Byron';
    function printName(){
        console.log(name);
    }
    return {
        printName: printName
    };
});

// 加载模块
require(['myModule'], function (my){
  my.printName();
});

CMD(SeaJS)

CMD: Common Module Definition通用模块定义, 由国内发展出来, SeaJS是其典型表明, 即SeaJS是经过浏览器对CMD的具体实现服务器

// 定义模块  myModule.js
define(function(require, exports, module) {
  var $ = require('jquery.js');
  var foo = require('foo');
  var out = foo.bar();
  $('div').addClass('active');
  module.exports = out;
});

// 加载模块
seajs.use(['myModule.js'], function(my){

});

ES6模块(import,export)

ES6在语言标准的层面上, 实现了模块功能, 并且实现得至关简单, 彻底能够取代CommonJSAMD规范, 是浏览器和服务器通用的模块解决方案。网络

在ES6中每个模块便是一个文件,在文件中定义的变量,函数,对象在外部是没法获取的。若是你但愿外部能够读取模块当中的内容,就必须使用export来对其进行暴露(输出)。(严格模式)异步

导出:模块化

export:能够有多个,导出的数据在被引入时必须加{}函数

export default:一个文件中只能出现一次,引入时不须要{}ui

引入:import设计

//模块定义 myModule.js
const name = 'Byron';
function printName(){
    console.log(name);
}
function printFullName(firstName){
    console.log(firstName + name);
}
const myModule = {
    printName: printName,
    printFullName: printFullName
};
export myModule;

//加载模块
import myModule, { printFullName } from './myModule.js';
myModule.printName();
printFullName('Michael');

对比

CommonJS AMD CMD ES6模块
适用于 服务端(node) 浏览器端 浏览器端(依赖就近、延迟执行) 服务端/浏览器端
如何使用 module.exports定义当前模块对外输出的接口;require加载模块 define定义一个模块;require加载一个模块;require.config()指定引用路径 define定义一个模块;require加载一个模块 export导出模块;import引入模块
加载方式 同步 异步/依赖前置、提早执行 异步/依赖就近、延迟执行 异步
优势 解决了依赖、全局变量污染的问题 适合在浏览器环境中异步加载模块、并行加载多个模块 按需加载、节约开发成本 在浏览器和服务端都适用;编译时便可完成模块加载,效率更高
缺点 同步加载模式只适用于服务端;在浏览器端,限于网络缘由,应使用异步加载 不能按需加载、开发成本大、影响用户体验
相关文章
相关标签/搜索