RequireJS是一个JavaScript文件或者模块的加载器。它可以提高JavaScript文件的加载速度,避免不必要的堵塞。它针对于在浏览器环境中使用做过专门的优化,但它也可以在其他的JavaScript环境中使用,像Node.js一样可以在服务器上运行。
在说RequireJS之前我们首先要了解一下Javascript模块以及AMD是什么。
Javascript模块:
比较普遍的写法就是一个个function,每个function有不同的功能,直接调用不同的function就可以实现不同的功能。但是这样的话,设置全局变量的时候不能保证不被其它function中的修改,也不能直接看出function之间的关联关系。那么用OOP的思想来写的话,就可以声明出一个对象,它可以有属性变量,变量可以是值也可以是方法。这样可以直接看出function之间的关系。但是属性变量的值可以被修改,所以又有了新的写法“立即执行函数写法”。使用这种的写法,外部代码无法读取内部的变量。如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用"放大模式"(augmentation)。在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。这样一个比较完整的模块也就出来了。
AMD:
当你要加载JavaScript模块时,就会使用script标签。为了加载依赖的模块,你就要先加载被依赖的,之后再加载依赖的。使用script标签时,你需要按照此特定顺序安排它们的加载,而且脚本的加载是同步的。可以使用async和defer关键字使得加载异步,但可能因此在加载过程中丢失加载的顺序。另一个选择是将所有的脚本捆绑打包在一起,但在捆绑的时候你仍然需要把它们按照正确的顺序排序。
AMD就是这样一种对模块的定义,使模块和它的依赖可以被异步的加载,但又按照正确的顺序。
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。