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 相关文章推荐
JavaScript 利用StringBuffer类提升+=拼接字符串效率
Nov 24 Javascript
JavaScript中的类继承
Nov 25 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 Javascript
EasyUi combotree 实现动态加载树节点
Apr 01 Javascript
基于openlayers4实现点的扩散效果
Aug 17 Javascript
基于D3.js实现时钟效果
Jul 17 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
JavaScript 基础问答三
2008/12/03 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
python实现百度关键词排名查询
2014/03/30 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
python time()的实例用法
2020/11/03 Python
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
老总助理工作岗位职责
2014/02/06 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
装修设计师求职信
2014/02/26 职场文书
趣味运动会策划方案
2014/06/02 职场文书
教师批评与自我批评
2014/10/15 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
公司人事管理制度
2015/08/05 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js