前端入门22-讲讲模块化 (4)

最后说一点,CommonJS 只是一种模块化的规范,而 Node.js 才是这个规范的具体实现者,但 Node.js 通常用于服务端的运行环境,对于前端而言,对于浏览器而言,因为不存在 Node.js 这东西,所以 require 或 exports 这类在前端里是无法运行的,但可以借助 Browerify 来进行代码转换。

AMD规范

AMD规范和规范实现者:Require.js

前端里没有 Node.js 的存在,即使有类似的存在,但由于 CommonJS 的模块化规范中,各模块的加载行为是同步的,也就是被依赖的模块必须执行结束,当前模块才能继续处理,这对于前端而言,模块的加载就多了一个下载的过程,而网络是不可靠的,所以 CommonJS 并不适用于前端的场景。

所以,针对前端,提出了另一种模块化规范:AMD,即异步模块加载,通过增加回调处理的方式,来移除被依赖模块和当前模块的前后关联,两个模块可同时下载,执行。当前模块内,需要依赖于其他模块信息的代码放置于回调函数内,这样就可以先行处理当前模块内其他代码。

define

前端里是通过 <script> 来加载 JS 文件代码的,不能像 Node.js 那样从源头上处理 JS 文件,所以它多了一个 define 来定义模块,如:

//module.js define(function(){ var name = "dasu"; var wx = "dasuAndroidTv"; var getBlog = function() { return "http://www.cnblogs.com/dasusu/"; } return { name: name, getWx: function() { return wx; } } })

如果定义的模块又依赖了其他模块时,此时 define 需要接收两个参数,如:

//两个参数,第一个参数是数组,数组里是当前模块依赖的所有模块,第二个参数是函数,函数需要参数,参数个数跟数组个数一直,也跟数组里依赖的模块一一对应,该模块内部就是通过参数来访问依赖的模块。 define(['module2'], function(module2){ //module2.xxx 使用模块 module2 提供的接口 //本模块的内部逻辑 return { //对外暴露的接口 } })

define 有两个参数,第一个参数是数组,数组里是当前模块依赖的所有模块,第二个参数是函数,函数需要参数,参数个数跟数组个数一直,也跟数组里依赖的模块一一对应,该模块内部就是通过参数来访问依赖的模块。

require

如果其他地方有需要使用到某个模块提供的功能时,此时就需要通过 require 来声明依赖关系,但声明依赖前,需要先通过 requirejs.config 来配置各个模块的路径信息,方便 Require.js 能够获得正确路径自动去下载。

requirejs.config({ paths: { module1: './module' } }) var module1 = require(['module1'], function(module1){ console.log(module1.name); //访问模块内的 name 接口 console.log(module1.getWx()); //访问模块内的 getWx 接口 }); //其他不依赖于模块的代码

这种方式的话,require 的第一个数组参数内的值就可以模块的别称,而第二个参数是个函数,同样,函数的参数就是加载后的模块,该 JS 文件内需要依赖到模块信息的代码都可以放到回调函数中,通过回调函数的参数来访问依赖的模块信息。

使用步骤

下载 Require.js,并放到项目中

新建作为模块的文件,如 module.js,并通过 define 定义模块

//module.js define(function(){ var name = "dasu"; var wx = "dasuAndroidTv"; var getBlog = function() { return "http://www.cnblogs.com/dasusu/"; } return { name: name, getWx: function() { return wx; } } })

在其他 js 文件内先配置所有的模块来源信息

//main.js requirejs.config({ paths: { module1: './module' } })

配置完模块信息后,通过 require 声明需要依赖的模块

//main.js var module1 = require(['module1'], function(module1){ console.log(module1.name); //访问模块内的 name 接口 console.log(module1.getWx()); //访问模块内的 getWx 接口 }); //其他不依赖于模块的代码

最后也最重要的一步,在 html 中声明 require.js 和 入口 js 如 main.js 的加载关系

<script src="http://www.likecs.com/js/lib/require.js" data-main="js/src/main.js"></script>

当然,这只是基础用法的步骤,其中第 3 步的模块初始化步骤也可通过其他方式,如直接利用 require 的不同参数类型来实现等等,但大体上需要这几个过程,尤其是最后一步,也是最重要一步,因为 AMD 在前端的具体实现都依靠于 Require.js,所以必须等到 Require.js 下载并执行结束后会开始处理其他 js。

以上例子的项目结构如图:

前端入门22-讲讲模块化

小结

最后小结一下,AMD 规范的具体实现 Require.js 其实从使用上来看,已经比较容易明白它的原理是什么了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzgpj.html