本来是做后端的,拿到一个偏前端的项目,js文件里好多define和require,看的有点蒙,只能自己动手查找资源了,了解这到底是个什么,它能做什么?

1.什么是require.js?

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

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

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

4) : RequireJS 是一个JavaScript模块加载器。它非常适合在浏览器中使用,但它也可以用在其他脚本环境,就像 Rhino and Node。使用RequireJS加载模块化脚本将提高代码的加载速度和质量。

2.为什么要使用require.js?

<!DOCTYPE html>

<html>

  <head>

    <script type="text/javascript" src="a.js"></script>

  </head>

  <body>

   <span>Hellow World</span>

  </body>

</html>

以上代码,会先加载head中引入的js文件及js文件中的脚本函数,再渲染body中的内容

这就是JS阻塞浏览器渲染导致的结果。加载文件越多,网页失去响应的时间就会越长。

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

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

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

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

3、require.js的使用-加载

官方网址:http://requirejs.org/docs/download.html

<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

4.require.js的使用-API

3步中引入了main.js文件,main.js的写法

define(function(){

  function fun1(){

   alert("main.js已生效");

  }

  fun1();

})

通过define函数定义了一个模块,然后在页面中通过require()函数使用:

require(["js/main"]);

一般情况下,它会依赖于其他的js框架,比如jquery等等

require(['jquery''B''C'], function (A, B, C){

  // js代码

});

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

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

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

5、加载文件

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>

6、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是什么?能做什么相关推荐

  1. include,require,include_once,require_once区别

    include和require的作用是相同的,唯一的不同是PHP在遇到include命令的时候必须重新解释一次.如果在同一个PHP页面中出现10此include命令,它便会重新解释10次.不过当PHP ...

  2. 彻底搞清楚javascript中的require、import和export

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持"类"( ...

  3. JavaScript 中的 require / exports、import / export、浅谈JavaScript、ES5、ES6

    Node.js 的基础教学 之 exports 和 module.exports:https://zhuanlan.zhihu.com/p/82057593 浅谈 JavaScript.ES5.ES6 ...

  4. 这几个概念你可能还是没搞清require、import和export

    简单粗暴,富婆给你说,其实我也没太搞明白,最近看了一篇文章我才理清了一点点思路,最近整日沉迷于肥宅快乐水,技术都跟不上了,来篇文章,提神醒脑,朝着我的富婆梦更近一步,早日走上富婆路,包养我家大狼狗!! ...

  5. 巧用 webpack 做页面静态资源依赖分析

    原文链接 作者:梯田 前言: 所谓[静态资源依赖分析],指的是可以通过分析页面资源后,可以以 json 数据或者图表的方式拿到页面资源间的依赖关系. 比如 college-index(酷家乐大学首页) ...

  6. [代码]解析nodejs的require,吃豆人的故事

    最近在项目中需要对nodejs的require关键字做解析,并且替换require里的路径.一开始我希望nodejs既然作为脚本语言,内核提供一个官方的parser库应该是一个稳定可靠又灵活的渠道,然 ...

  7. request 和require区别_「猫咪词汇」语音讲解 suggest /advise /request/ require辨析

    suggest /advise /request/ require辨析 1. suggest 1) suggest sth. 建议某事 suggest doing sth. Can anyone su ...

  8. require doing

    require +n.+to do sth需要某人做某事情,命令某人做某事情. 如The roof requires an expert to repair.屋顶需要专家才能修理 require do ...

  9. 理解koa-router 路由一般使用

    阅读目录 一:理解koa-router一般的路由 二:理解koa-router命名路由 三:理解koa-router多个中间件使用 四:理解koa-router嵌套路由 五:分割路由文件 回到顶部 一 ...

  10. VUE3.0 二. vue-cli3 配置指南

    VUE3.0 二. vue-cli3配置指南 一.vue.config.js 详解 官网地址: https://cli.vuejs.org/zh/config/ 使用vue3 的时候需要添加一个vue ...

最新文章

  1. tensorflow op tf.global_variables_initializer
  2. 18段代码带你玩转18个机器学习必备交互工具
  3. iOS架构-cocoapods之公共库的发布与集成(16)
  4. 崔巍 计算机考研怎么样,中国科学院大学研究生导师教师师资介绍简介-崔巍
  5. 机器学习笔记:线性判别分析(Fisher)
  6. python实训计算总秒数,Python:如何获取每个吉利秒数
  7. 在Linux/Centos下用wondershaper限速
  8. c++学习笔记之成员函数
  9. 前端学习(2586):如何设计高扩展路由
  10. Nginx For Windows 路由配置
  11. Python configparser模块操作代码实例
  12. kill 的常用信号
  13. Java程序低手之关于泛型(Generic)
  14. 中兴c语言 面试题,中兴手机嵌入式开发面试题汇总(1)
  15. 怎么使用水经注万能地图下载器制作百度行政区划个性化地图
  16. go加解密系列——AES加解密
  17. 推荐好用的两个搜索下载书籍网站
  18. linux_5.10 iptables踩坑
  19. linux获取ip上网,linux dhcp 获取ip地址能上网,设置静态ip地址则不能上网
  20. 基于Springboot + Thymeleaf 的招聘网站(源代码+数据库) 026

热门文章

  1. 【原生JavaScript案例】拖拽回弹吸附 猜成语小游戏
  2. 如何解决深度VISTA GV2.0子网掩码多了一个141.41.94.121的问题!
  3. Vue笔记(狂神说)
  4. 产品读书《人月神话》
  5. 《黑手党:天堂之城》全攻略
  6. 广告变现数据分析,提高媒体广告变现效果的关键指标!
  7. [C++]高精度求2的n次方
  8. 一个无知oier的娱乐——我的游戏开发经历
  9. java swing jdbc个人记账管理系统的设计与实现(GUI)
  10. outlook配置文件添加服务器,配置 Outlook 配置文件设置