CommonJS,AMD模块加载规范

来源:互联网 发布:饿了么算法工程师 编辑:程序博客网 时间:2024/05/22 17:21

模块加载规范:

AMD和CMD模块加载规范:在服务器端,文件都在本地的硬盘中,请求文件时文件加载很快,不用考虑时延的问题。所以使用CommonJS同步加载规范即可。但是在客户端,浏览器要从服务器获取数据,数据传输会产生比较长时间的时延,所以模块的同步加载规范不适用于浏览器端。

CommonJS:Node.js 是目前 CommonJS 规范最热门的一个实现,

标准库和API:

CommanJS官网(http://www.commonjs.org/)介绍:
The official JavaScript specification defines APIs for some objects that are useful for building browser-based applications. However, the spec does not define a standard library that is useful for building a broader range of applications.The CommonJS API will fill that gap by defining APIs that handle many common application needs, ultimately providing a standard library as rich as those of Python, Ruby and Java. The intention is that an application developer will be able to write an application using the CommonJS APIs and then run that application across different JavaScript interpreters and host environments. With CommonJS-compliant systems, you can use JavaScript to write:
Server-side JavaScript applications
Command line tools
Desktop GUI-based applications
Hybrid applications (Titanium, Adobe AIR)
简单翻译:
ECMAScript为很多对象定义了实用的api,但是没有定义一个有用的标准库去让JS应用程序在更多的地方使用。CommanJS API旨在提供一个像Python,Ruby,Java一样丰富的标准库。让应用程序开发者可饮用CommonJS API写应用程序,然后让应用程序运行在不同的编译器和环境里面。使用CommonJS可以用js写服务端应用程序,命令行工具,桌面端图形应用程序。

标准库:wikipedia描述:

A standard library in computer programming is the library made available across implementations of a programming language. These libraries are conventionally described in programming language specifications; however, contents of a language’s associated library may also be determined (in part or whole) by more informal practices of a language’s community.

自我理解:标准库就是用户程序语言实现的很多方法,定义的很多变量,封装的很多类。程序开发者可以直接使用这些方法和变量以及类,
这些方法变量和类使用的很多。设计实现也很优质。C语言中,引入.h头文件后就可以使用引入的库中的方法和变量,方便开发者使用。

模块(Module)和包(Package)是 Node.js 最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分、封装,然后组合起来,模块正式为了实现这种方式而诞生的。

CommonJS的使用:

  1. 每个文件内部,module变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。其实是加载该模块的 module.exports 属性。
    (Node.js 为每个模块提供一个 exports 变量,指向 module.exports.等同在每个模块头部,有一行这样的命令var exports = module.exports)
  2. Node.js 提供了 require 函数来调用其他模块
  3. 所有代码都运行在模块作用域,不会污染全局作用域。

模块加载的路径:

  1. 同名的时候会优先加载核心模块。
  2. 如果以‘/’开头,则是根据绝对路径查找模块。根据后缀依次查找js文件,json文件,node文件。
  3. ‘./’, ‘../’相对路径查找。
  4. 如果既不是绝对路径,也不是相对路径的话,那么先查找核心模块,如果没有找到核心模块,那么就到node_modules目录下面去加载模块。

Node.js 模块加载的一个重要特征:通过查找 node_modules 目录来加载模块。

AMD规范是异步加载模块,浏览器端一般使用AMD规范。

AMD 解决的问题:
1.实现 js 文件的异步加载,避免网页失去响应
2.管理模块之间的依赖性,便于代码的编写和维护

异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,
等到加载完成之后,这个回调函数才会运行。

AMD的使用:

  1. 模块加载:require([module], callback);第一个是加载的模块,第二个是模块加载完成后执行的回调函数。
  2. 使用AMD规范加载的模块必须采用define([module],defineFunction)方法定义。第一个参数是定义的模块依赖的模块,没有就不写。
  3. 加载不是用define方法定义的模块:require.config() 方法,定义模块的一些特征。
    主要有require.js实现了AMD规范。

CMD(sea.js)和AMD规范的区别:

  1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
  2. CMD 推崇依赖就近,AMD 推崇依赖前置。

规范的目的:
1. AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
2. CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
3. AMD,CMD规范都是为了实现浏览器端的模块化开发!!!