@H_4030@一:什么是require.js
@H
403_0@①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞
页面的渲染和其后的脚本的执行,并提供了在加载完成之后的执行相应回调
函数的
功能;
@H_
403_0@②:require.js要求js脚本必须要实现模块化,即
文件化;而require.js的作用之一就是加载js模块,也就是js
文件。
@H_
403_0@③:require.js可以管理js模块/
文件之间的依赖;即不同的框架例如Jquery,AngularJs等采用了不同的语法,而使用这些语法的js
文件在导入时必须排在Jquery.js或Angular.js之后才能顺利执行,require.js则能够
解决排序依赖问题。
@H_
4030@二:为什么要使用require.js
@H4030@①:加载的时候,浏览器会停止网页渲染,原因如下:
@H403_0@在不使用require.js时,
文件编写方式如下:
<div class="jb51code">
<pre class="brush:js;">
<!DOCTYPE html>
@H_
403_0@在b.js
文件中
@H_
403_0@为了使b.js中的
代码生效,必须要把这行
代码放到后面,这样在使用的框架和js
文件较多的时候,它们的导入顺序就会变得很麻烦。
@H_
403_0@
require.js的诞生就是为了解决上面所说的两个问题:
@H_
403_0@1.实现js
文件的异步加载,避免网页失去响应;
@H_
403_0@2.管理模块之间的依赖性,便于
代码的编写和维护。
@H_
403_0@
三:require.js的加载
@H_
403_0@①:首先,我们要去官网下载最新的版本,官方网址:
nofollow" href="http://requirejs.org/docs/download.html">http://requirejs.org/docs/download.html
@H_
403_0@ 下载完成后,将它放在网站项目的js子
文件夹下就可以使用了:
@H_
403_0@这里可能会遇到一个问题:加载这个
文件,也可能造成网页失去响应,这个问题的
解决办法有两种:
@H_
403_0@1.将这行
代码写成如下格式:
@H_
403_0@其中:async
属性和defer
属性表明这个
文件需要异步加载,避免网页失去响应。IE只
支持defer
属性,而
不支持async
属性。
@H_
403_0@2.将
文件放到网页
底部加载。
@H_
403_0@②:加载完require.js之后,我们就可以加载自己的
代码了,假设我们自己的js
文件命名为main.js,同样放于js
文件夹下,那么,只需要执行如下
代码:
@H_
403_0@上述
代码中,data-main
属性的作用是指定网页程序的主模块。即js目录下面的main.js,这个
文件会第一个被require.js加载。由于require.js默认的
文件后缀名是js,所以可以省略掉".js"简写成main。
@H_
403_0@
四:基本API
@H_
403_0@在上一部分中,我们引入了main.js
文件,main.js的写法:
@H_
403_0@这样,我们就通过define
函数定义了一个模块,然后在
页面中通过AMD规范定义的的require()
函数使用:
@H_
403_0@一般情况下,它会依赖于其他的js框架,比如jquery等等,那么,我们这时就要在
页面文件中。我们需要按照以下格式来写:
代码
});
@H_
403_0@require()
函数接受两个参数。第一个参数是一个数组,表示所依赖的框架,上例就是['A','C'],即main.js里的
代码需要用到这三个模块;第二个参数是一个回调
函数,当前面指定的模块都加载成功后,它将被
调用。加载的模块会以参数形式传入该
函数,从而在回调
函数内部就可以使用这些模块。
@H_
403_0@require()会异步加载A,C三个模块,浏览器不会失去响应;它指定的回调
函数,只有前面的模块都加载成功后,才会运行,
解决了依赖性的问题。
@H_
403_0@下面。我们就以jquery为例,说明这个
函数是怎样运行的:
代码
});
@H_
403_0@require.js会先加载jQuery,然后再运行回调
函数。main.js的
代码就写在回调
函数中。注意:require中的依赖是一个数组,即使只有一个依赖,你也必须使用数组来定义。
@H_
403_0@
@H_
403_0@在上一部分中,main.js的依赖模块是['jquery']。默认情况下,require.js会假定这个模块与main.js在同一个目录,
文件名是 jquery.js,然后
自动加载,除此之外,我们可以通过require.config()
方法,我们可以对模块的加载行为进行
自定义,require.config()就写在main.js的头部,它的参数是一个对象,这个对象的paths
属性指定各个模块的加载路径。
@H_
403_0@上述模块路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径:
@H_
403_0@另一种则是直接改变根目录(baseUrl):
@H_
403_0@之前的例子中加载模块都是本地js,但是大部分情况下网页需要加载的JS可能来自本地服务器、其他网站或CDN,这样就不能通过这种方式来加载了,我们以加载一个jquery库为例:
@H_
403_0@上面的例子中重复出现了require.config配置,如果每个
页面中都加入配置,必然会十分麻烦,requirejs提供了一种叫"主数据"的
功能,我们可以将所有的require.config配置放到main.js中,在
页面中
调用它,
@H_
403_0@就可以使每一个
页面都使用这个配置,然后
页面中就可以直接使用require来加载所有的短模块名。
@H_
403_0@
六:AMD模块的写法
@H_
403_0@require.js加载的模块,采用AMD规范,也就是说,模块必须按照AMD的规定来写。具体来说,就是模块必须采用特定的define()
函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()
函数之中。假定现在有一个math.js
文件,它定义了一个math模块。那么,math.js就要这样写:
@H_
403_0@然后在
页面中:
@H_
403_0@如果这个js
文件还依赖其他模块,那么define()
函数的第一个参数,必须是一个数组,指明该模块的依赖性。
@H_
403_0@当require()
函数加载上面这个模块的时候,就会先加载jquery.js
文件。
@H_
403_0@
七:第三方模块
@H_
403_0@通过require加载的模块一般都需要符合AMD规范即使用define来申明模块,但是部分时候需要加载非AMD规范的js,这时候就需要用到另一个
功能:shim:
@H_
403_0@1. 非AMD模块
输出,将非标准的AMD模块变成可用的模块,例如:在老版本的jquery中,是没有继承AMD规范的,所以不能直接require["jquery"],这时候就需要shim
@H_
403_0@这样配置后,我们就可以在其他模块中引用jquery模块:
@H_
403_0@2.
插件形式的非AMD模块,我们经常会用到jquery
插件,而且这些
插件基本都不符合AMD规范,比如jquery.form
插件,这时候就需要将form
插件加入到jquery中:
@H_
403_0@以上就是require的基本
用法详解。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时
回复大家的。在此也非常感谢大家对编程之家网站的
支持!