Require.js的基本用法详解


Posted in Javascript onJuly 03, 2017

一:什么是require.js

①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行,并提供了在加载完成之后的执行相应回调函数的功能;

②:require.js要求js脚本必须要实现模块化,即文件化;而require.js的作用之一就是加载js模块,也就是js文件。

③:require.js可以管理js模块/文件之间的依赖;即不同的框架例如Jquery,AngularJs等采用了不同的语法,而使用这些语法的js文件在导入时必须排在Jquery.js或Angular.js之后才能顺利执行,require.js则能够解决排序依赖问题。

二:为什么要使用require.js

①:加载的时候,浏览器会停止网页渲染,原因如下:

在不使用require.js时,文件编写方式如下:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="a.js"></script>
  </head>
  <body>
   <span>Hellow World</span>
  </body>
</html>

 在导入的a.js文件中:

(function(){
  function fun1(){
   alert("JS文件已生效");
  }
  fun1();
})()

 在运行以上代码时我们可以注意到在alert弹出的提示框出现的时候,网页html的部分仍然是空白的,没有显示出任何内容,当我们点击确定之后"Hellow World"才会显示在网页中,这就是JS阻塞浏览器渲染导致的结果。加载文件越多,网页失去响应的时间就会越长。

②:由于js文件之间存在依赖关系,因此必须严格保证加载顺序,依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。例如:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="js/jquery-1.10.2.js" ></script>
    <script type="text/javascript" src="js/b.js" ></script>
  </head>
  <body>
    <div id="div1" style="width: 100px;height: 100px;background-color: red;"></div>
  </body>
</html>

 在b.js文件中

$(function(){
  $("#div1").css("background-color","blue");
})

 为了使b.js中的代码生效,必须要把<script type="text/javascript" src="js/b.js" ></script>这行代码放到<script type="text/javascript" src="js/jquery-1.10.2.js" ></script>后面,这样在使用的框架和js文件较多的时候,它们的导入顺序就会变得很麻烦。

require.js的诞生就是为了解决上面所说的两个问题:

1.实现js文件的异步加载,避免网页失去响应;

2.管理模块之间的依赖性,便于代码的编写和维护。

三:require.js的加载

①:首先,我们要去官网下载最新的版本,官方网址:http://requirejs.org/docs/download.html

下载完成后,将它放在网站项目的js子文件夹下就可以使用了:

<script src="js/require.js"></script>

这里可能会遇到一个问题:加载这个文件,也可能造成网页失去响应,这个问题的解决办法有两种:

1.将这行代码写成如下格式:

<script src="js/require.js" defer async="true" ></script>

其中:async属性和defer属性表明这个文件需要异步加载,避免网页失去响应。IE只支持defer属性,而不支持async属性。

2.将文件放到网页底部加载。

②:加载完require.js之后,我们就可以加载自己的代码了,假设我们自己的js文件命名为main.js,同样放于js文件夹下,那么,只需要执行如下代码:

<script src="js/require.js" data-main="js/main"></script>

上述代码中,data-main属性的作用是指定网页程序的主模块。即js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以省略掉".js"简写成main。

四:基本API

在上一部分中,我们引入了main.js文件,main.js的写法:

define(function(){
  function fun1(){
   alert("main.js已生效");
  }
  fun1();
})

这样,我们就通过define函数定义了一个模块,然后在页面中通过AMD规范定义的的require()函数使用:

require(["js/main"]);

一般情况下,它会依赖于其他的js框架,比如jquery等等,那么,我们这时就要在页面文件中。我们需要按照以下格式来写:

require(['A', 'B', 'C'], function (A, B, C){
// js代码
});

require()函数接受两个参数。第一个参数是一个数组,表示所依赖的框架,上例就是['A', 'B', 'C'],即main.js里的代码需要用到这三个模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。

require()会异步加载A,B,C三个模块,浏览器不会失去响应;它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

下面。我们就以jquery为例,说明这个函数是怎样运行的:

require(['jquery'], function ($){
// jquery代码
});

require.js会先加载jQuery,然后再运行回调函数。main.js的代码就写在回调函数中。注意:require中的依赖是一个数组,即使只有一个依赖,你也必须使用数组来定义。

五:加载文件

在上一部分中,main.js的依赖模块是['jquery']。默认情况下,require.js会假定这个模块与main.js在同一个目录,文件名是 jquery.js,然后自动加载,除此之外,我们可以通过require.config()方法,我们可以对模块的加载行为进行自定义,require.config()就写在main.js的头部,它的参数是一个对象,这个对象的paths属性指定各个模块的加载路径。

require.config({

paths: {



"jquery": "jquery.min",



"anjular": "anjular.min"


}

});

 上述模块路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径:

require.config({

paths: {



"jquery": "lib/jquery.min",



"anjular": "lib/anjular.min"


}

});

 另一种则是直接改变根目录(baseUrl):

require.config({

baseUrl: "js/lib",


paths: {



"jquery": "jquery.min",



"anjular": "anjular.min"


}

});

 之前的例子中加载模块都是本地js,但是大部分情况下网页需要加载的JS可能来自本地服务器、其他网站或CDN,这样就不能通过这种方式来加载了,我们以加载一个jquery库为例:

require.config({
  paths : {
    "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"] 
  }
})

 上面的例子中重复出现了require.config配置,如果每个页面中都加入配置,必然会十分麻烦,requirejs提供了一种叫"主数据"的功能,我们可以将所有的require.config配置放到main.js中,在页面中调用它,

<script data-main="js/main" src="js/require.js"></script>

就可以使每一个页面都使用这个配置,然后页面中就可以直接使用require来加载所有的短模块名。

六:AMD模块的写法

require.js加载的模块,采用AMD规范,也就是说,模块必须按照AMD的规定来写。具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

define(function (){

var add = function (x,y){



return x+y;


};


return {



add: add


};

});

 然后在页面中:

require(['math'], function (math){
alert(math.add(1,1));
});

 如果这个js文件还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。

define(['jquery'], function($){
  $("#div1").css("background-color","red");
})
 

当require()函数加载上面这个模块的时候,就会先加载jquery.js文件。

七:第三方模块

通过require加载的模块一般都需要符合AMD规范即使用define来申明模块,但是部分时候需要加载非AMD规范的js,这时候就需要用到另一个功能:shim:

1. 非AMD模块输出,将非标准的AMD模块变成可用的模块,例如:在老版本的jquery中,是没有继承AMD规范的,所以不能直接require["jquery"],这时候就需要shim

require.config({
  shim: {
    "jquery" : {exports : "$"}
  }
})

 这样配置后,我们就可以在其他模块中引用jquery模块:

require(["jquery"], function(_){
  $("#div1").css("background-color","red");
})

 2.插件形式的非AMD模块,我们经常会用到jquery插件,而且这些插件基本都不符合AMD规范,比如jquery.form插件,这时候就需要将form插件加入到jquery中:

require.config({
  shim: {
    "jquery.form" : {
      deps : ["jquery"]
    }
  }
})  
require.config(["jquery", "jquery.form"], function($){
  $(function(){
    $("#form").ajaxSubmit({...});
  })
})

 以上就是require的基本用法详解。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
js自动生成对象的属性示例代码
Oct 28 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
ES6新数据结构Map功能与用法示例
Mar 31 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
vue.js移动端tab组件的封装实践实例
Jun 30 Javascript
vue.js路由跳转详解
Aug 28 Javascript
详解一个小实例理解js原型和继承
Apr 24 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
Jul 19 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 #Javascript
解决webpack -p压缩打包react报语法错误的方法
Jul 03 #Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 #Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 #Javascript
微信小程序开发中的疑问解答汇总
Jul 03 #Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 #Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 #Javascript
You might like
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
php封装一个异常的处理类
2017/06/08 PHP
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python time模块用法实例详解
2014/09/11 Python
简单实现python收发邮件功能
2018/01/05 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
python安装scipy的方法步骤
2019/06/26 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
民事答辩状格式范文
2015/05/21 职场文书
天气温馨提示语
2015/07/14 职场文书
初中毕业感言300字
2015/07/31 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
golang slice元素去重操作
2021/04/30 Golang
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS