浅析JavaScript中的模块规范
一、CommonJS
为了JavaScript的表现定制规范,因为JavaScript没有模块的功能,所以CommonJS应运而生,它希望JavaScript可以在任何地方运行,不止在浏览器中。
CommonJS定义的模块分为: { 模块引用(require) },{ 模块定义(export) },{ 模块标识(module) }
require() : 引入外部模块。
export对象用于导出当前模式块的方法或变量,唯一的导出口。
module对象就代表模块本身。
//sum.js
exports.sum = function(){...做加操作..};
//calculate.js
var math = require('sum');
exports.add = function(n){
return math.sum(val,n);
};
虽说node遵循CommonJS的规范,但是相比也是做了一些取舍,填了一些新东西的。NPM作为node的包管理器,就是为了帮助node解决依赖包的安装问题,所以它肯定也要遵循CommonJS规范,它遵循包规范。
CommonJS是主要为了JavaScript在后端的表现制定的,不适合前端JavaScript。分析一下浏览器端JavaScript和服务器端JavaScript主要做了哪些事。
服务器端JavaScript:相同的代码需要多次 执行,CPU和内存资源是瓶颈,加载时从磁盘中加载。
浏览器端JavaScript:代码需要从一个服务器分发到多个客户端执行,带宽是瓶颈,加载时需要通过网络加载。
二、AMD
异步模块定义,主要为前端JavaScript表现制定规范。
AMD就只有一个接口:define(id?,dependencies?,factory);它要在声明模块的时候制定所有的依赖(dcp),并且还要当做形参传到factory中,像这样:
define(['dep1','dep2'],function(dep1,dep2){ …… });
要是没什么依赖,就定义简单的模块,下面这样就可以:
define( function(){ var exports = {} ; export.method = function(){……};return exports; } );
define 包装, node中隐式包装,RequireJS实现了AMD规范。
三、CMD
seajs遵循CMD规范,与AMD蛮相近,有中文版。
define( function( require, export, module ){ …… } );