基本上可以这样说,对于 CommonJS 和 AMD 二者,能把他们发扬光大的不得不说 nodejs 和 require.js 了.
CommonJS
CommonJS
称之为一个 project, 目的是用来定义声明 Javascript 在浏览器之外的一个生态系统.(如服务器端或者桌面程序), 起源于2009年工作于 Mozilla 的工程师 Kevin Dangoor, 当时的名字叫做ServerJs
. 然后在2009年8月改名为CommonJS
而且放出来了兼容的 APIs. 在2013年五月的时候, Node的包管理工具 npm
的作者 Isaac Z. Schluter
说对于 Node.js, CommonJS 已经过时, Node.js 的核心开发工程师应该避免使用它.
从官网的描述来看,
说 Javascript 是一个很牛的但是更多的面向浏览器的动态语言,但是呢其实 javascript 可以做更多的事情, 而在做更多的事情
的时候就出现很多其他的需求, 这个时候我们就需要一个更加丰富的 APIs 来满足他们. 提供无线丰富的标准库正如 Python, Ruby还有 Java 那样. 初衷就是工程师可以使用 CommonJS 的 API 来写更多的跨平台的基于 Javascript运行时的宿主环境之上. 通过兼容 CommonJS 的系统你可以:
- 服务器端 js 应用
- 命令行工具
- 桌面 GUI 应用
- Hybird 混合
我 fuck, 到底我还是没有找到什么是 CommonJS
, 很多地方就是说, 它是一个简单的声明定义,用来定义如何声明一个module
, 然后如何让 module 和其他的 module 一起工作.
我们定义一个CommonJS
规范下的 module, 它呢其实就是一块可复用的 js 代码, 如何复用
? 就是在定义声明这个 module 的时候, 定义导出一些对象, 让他们可以被其他代码依赖使用. 不同于 AMD, 这里并没有什么函数定义来包裹模块.
如何定义一个 CommonJS 的module
呢?
它有2个主要部分组成:
- 一个就是自由的变量
exports
, 它就是将要暴露出来给其他模块的. - 还有一个
require
函数, 它用来让模块导入一个被export
的变量.
-
require
, 定义函数 -
exports
module 定义的对象 -
module
, 一个对象
如:
// 假如我们新建一个 math.js 的文件
//我们先定义一个函数
function add(){
var sum = 0, i =0, args =argurments, 1 = args.length
while(i<1){
sum += args[i++];
}
return sum
}
exports.add = add
//以上我们就完成了一个 CommonJS 的 module
//然后我们尝试如何使用它
// 定义一个 increment.js
var add = require('math').add;
exports.increment = function(val){
return add(val,1);
}
// 然后我们再定义一个
var inc = require('increment').increment;
var a =1;
inc(a); //2
module.id == 'program';
AMD
requirejs 如是说:
RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code.
Asynchronous module definition
, 一个 javascript 的定义. 定义了 API 用来定义和编写 module 已经处理他们的依赖. 如果需要可以异步加载他们.使用AMD
可以有以下的好处:
- 网站性能提升,AMD 可以让加载 js 的变得更小,只有需要的时候才去加载.
- 减少页面错误,AMD 会帮助开发人员解决依赖的问题
https://en.wikipedia.org/wiki/Asynchronous_module_definition
除了上面的好处之外, 它还能够让工程师把代码封装到更小的, 更加具有逻辑性的工程中.部署的时候可以用它的 API 来处理 js 文件