AMD-CMD-RequireJS

题目1: 为什么要使用模块化?

  1. 解决命名冲突
  2. 解决依赖管理
  3. 提高代码可读性
  4. 代码解耦,提高复用性

CMD、AMD、CommonJS 规范分别指什么?有哪些应用

CMD、AMD、CommonJS规范明确了模块的基本书写格式和基本交互规则。

1、CMD(Common Module Definition)是 SeaJS推广过程中产生的。CMD并不是异步加载,而是松散加载,只有当需要加载模块的时候,再用require方法引用模块。
语法:
define(function(require, exports, module) { // 模块代码 });

  • CMD 推崇一个文件一个模块,所以经常将文件名作为模块id(不用再- define参数里面写)
  • CMD 依赖就近,所以一般不在define的参数中写依赖,在factory中写

factory 方法在执行时,默认会传入三个参数:require、exports 和 module

  • require 是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口。默认是同步往下执行,也可以用require.async去规定异步回调执行

// 异步加载多个模块,在加载完成时,执行回调 require.async(['./c', './d'], function(c, d) { c.doSomething(); d.doSomething(); });

  • exports是一个对象,用来向外提供模块接口,还可以直接用return向外提供接口。
    define(function(require, exports) { // 对外提供 foo 属性 exports.foo = 'bar'; // 对外提供 doSomething 方法 exports.doSomething = function() {}; }); define(function(require) { // 或者通过 return 直接提供接口 return { foo: 'bar', doSomething: function() {} }; });

  • module 是一个对象,上面存储了与当前模块相关联的一些属性和方法。

2、AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。在web端采用异步方式加载模块。

用define定义模块
语法:define(id?, dependences?, factory);

  • id:可选参数,用来定义模块的标识
  • dependencies:是一个当前模块依赖的模块名,是数组的形式
  • factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值
    对外提供接口的方式和CMD规范类似

用require加载模块
require([dependencies], function(){});
require()函数接受两个参数:

  • 第一个参数是一个数组,表示所依赖的模块
  • 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块

require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

3、CommonJS是服务器端模块的规范,Node.js采用了这个规范。Node.JS首先采用了js模块化的概念。它的主要内容:

定义模块 根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
模块输出: 模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象
加载模块: 加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象

3、

预览
代码
mock数据瀑布流加载效果

高阶四瀑布流.gif

你可能感兴趣的:(AMD-CMD-RequireJS)