require.js 加载过程与使用方法介绍


Posted in Javascript onOctober 30, 2018

require.js简介

require.js是javascript模块化编程中常用的一个JS库。

现在的网页功能较以前已经丰富了许多,同时网页上需要导入越来越多的JS文件来实现这些功能。使用原有的script标签一个个导入js文件会导致代码的复杂与臃肿。并且导入的各个JS文件可能会有冲突,导致许多功能无法使用且会使bug非常难定位。

这样的情况下我们就需要一个合适的Javascript模块载入框架,来满足我们团队协作、模块复用、单元测试等等一系列复杂的需求。使用require.js进行模块化加载会使前端代码的质量得到提升。

require.js的优点

不使用require.js的写法

在以前的编程中,我们或许会这样导入js文件:

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

而在xxx.js文件中我们会这样写:

function fun1(){
 alert("it works");
}

fun1();

上述的xxx.js文件中的fun1方法可能会与其他文件中的方法重名导致方法被重载覆盖,会导致一些未知的bug。所以一些有经验的程序员或许会更倾向与这样写:

(function(){
 function fun1(){
  alert("it works");
 }

 fun1();
})()

这样编码的好处在于限制了fun1方法的作用域,这样就不会被其他的fun1方法所重写。并且这样的写法也防止了污染全局变量。

我们运行以上的代码时,会发现xxx.js中的alert运行时,页面并未加载完成。(body标签中的span并未显示在页面中)。这是因为alert阻塞了浏览器渲染,等alert完成后浏览器才会继续进行渲染。(这里很像主进程被阻塞了,程序会等待当前操作完成后再继续进行)。

使用require.js

<!DOCTYPE html>
<html>
 <head>
  <script type="text/javascript" src="require.js"></script>
  <script type="text/javascript">
   require(["a"]);
  </script>
 </head>
 <body>
  <span>body</span>
 </body>
</html>

这里先导入了require.js,然后使用require([“xxx”])来加载xxx.JS文件

xxx.js
define(function(){
 function fun1(){
  alert("it works");
 }

 fun1();
})

运行上两个文件,我们发现alert时并未阻塞浏览器渲染,body中的span依然出现在了页面上。所以首先我们可以发现,使用require.js进行加载时我们不会阻塞浏览器渲染。

同时,我们会发现使用require.js加载时,也是完全避免了js文件中的方法被重写覆盖或js文件中的变量、方法污染全局变量、方法的情况。

我们使用程序代码加载模块,也避免了下面这样丑陋的情况:

<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
<script type="text/javascript" src="c.js"></script>
<script type="text/javascript" src="d.js"></script>
<script type="text/javascript" src="e.js"></script>
<script type="text/javascript" src="f.js"></script>
<script type="text/javascript" src="g.js"></script>
<script type="text/javascript" src="h.js"></script>
<script type="text/javascript" src="i.js"></script>
<script type="text/javascript" src="j.js"></script>

require.js 的加载

使用require.js异步加载js文件时,相当于是另开一个线程来进行加载文件这个操作。在require.js的定义中,我们可以在要加载的文件中添加它的依赖项,这些依赖文件会该文件被加载之前先加载,再以参数的方式传入到该文件之中。
xxx.js写法如下:

require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){



// some code here


});

此时xxx.js依赖于moduleA,moduleB,moduleC。 使用require.js加载xxx.js时,会先加载moduleA,moduleB,moduleC三个模块,然后以参数的方式传入xxx.js中。

这里我们原则上要避免循环依赖的出现。例如:A依赖与B,B又依赖与A。这样就出现了循环依赖。

虽然出现循环依赖不会导致加载失败,但是在加载A时,传入A的依赖项B中的A参数会为null值,导致一些无法预知的问题。所以我们还是要尽量避免循环依赖的情况出现。

这里的异步加载都不会影响该文件以外的所有变量与方法。

20181029 更新

在实际的使用中遇到了一些问题,发现实际上在同一个页面中,如果出现了A依赖于C,B同时也依赖与C。我们如果在此时出现一个文件同时依赖与A与B,在这种情况下A与B所依赖的C会是同一个实例。

也就是说,在一个页面中,使用require.js加载的文件,是以类似于单例的形式的存在的。在首次加载时异步加载,其他文件需要依赖时就将已加载完成的文件注入。

这样就会导致A与B使用的是C的同一个实例,C中的全局变量变化会同时影响到A、B两个模块。这是在开发过程中需要注意的。!

总结

以上所述是小编给大家介绍的require.js 加载过程与使用方法介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
jQuery的观察者模式详解
Dec 22 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
Javascript中使用parseInt函数需要注意的问题
Apr 02 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
JavaScript检测鼠标移动方向的方法
May 22 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
Sep 18 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
Aug 28 Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 Javascript
关于Vue中axios的封装实例详解
Oct 20 Javascript
小程序实现左滑删除功能
Oct 30 #Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
Oct 30 #Javascript
小程序云开发部署攻略(图文教程)
Oct 30 #Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
Oct 30 #Javascript
微信小程序实现单选功能
Oct 30 #Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 #Javascript
小程序实现多选框功能
Oct 30 #Javascript
You might like
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php实现的日历程序
2015/06/18 PHP
php简单获取复选框值的方法
2016/05/11 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Django添加sitemap的方法示例
2018/08/06 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
优秀员工自荐书范文
2013/12/08 职场文书
C++程序员求职信
2014/05/07 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
css height属性中的calc方法详解
2021/06/03 HTML / CSS
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android