require.js的基本用法

一、为什么要用require.js?

最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。

<script src="1.js"></script>
<script src="2.js"></script>
<script src="3.js"></script>
<script src="4.js"></script>
<script src="5.js"></script>
<script src="6.js"></script>

这段代码依次加载多个js文件。

这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。

require.js的诞生,就是为了解决这两个问题:

  

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

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

 

二、require.js的加载

使用require.js的第一步,是先去官方网站下载最新版本。

下载后,假定把它放在js子目录下面,就可以加载了。

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

 

有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:

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

 

async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。

加载require.js以后,下一步就要加载我们自己的代码了。假定我们自己的代码文件是main.js,也放在js目录下面。那么,只需要写成下面这样就行了:

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

 

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

三、主模块的写法

上一节的main.js,我把它称为"主模块",意思是整个网页的入口代码。它有点像C语言的main()函数,所有代码都从这儿开始运行。

下面就来看,怎么写main.js。

如果我们的代码不依赖任何其他模块,那么可以直接写入javascript代码。

   // main.js
alert("加载成功!");

 

但这样的话,就没必要使用require.js了。真正常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。

  // main.js
require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){// some code here
});

 

require()函数接受两个参数。第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。

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

下面,我们看一个实际的例子。

假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写:

  require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){// some code here
});

 

require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。

四、模块的加载

上一节最后的示例中,主模块的依赖模块是['jquery', 'underscore', 'backbone']。默认情况下,require.js假定这三个模块与main.js在同一个目录,文件名分别为jquery.js,underscore.js和backbone.js,然后自动加载。

使用require.config()方法,我们可以对模块的加载行为进行自定义。require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。

  require.config({paths: {"jquery": "jquery.min","underscore": "underscore.min","backbone": "backbone.min"}});

 

 

上面的代码给出了三个模块的文件名,路径默认与main.js在同一个目录(js子目录)。如果这些模块在其他目录,比如js/lib目录,则有两种写法。一种是逐一指定路径。

  require.config({paths: {"jquery": "lib/jquery.min","underscore": "lib/underscore.min","backbone": "lib/backbone.min"}});

 

 

另一种则是直接改变基目录(baseUrl)。

  require.config({baseUrl: "js/lib",paths: {"jquery": "jquery.min","underscore": "underscore.min","backbone": "backbone.min"}});

 

 

如果某个模块在另一台主机上,也可以直接指定它的网址,比如:

  require.config({paths: {"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"}});

 

 

require.js要求,每个模块是一个单独的js文件。这样的话,如果加载多个模块,就会发出多次HTTP请求,会影响网页的加载速度。因此,require.js提供了一个优化工具,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。

五、AMD模块的写法

require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。

具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。

假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

  // math.js
define(function (){var add = function (x,y){return x+y;};return {add: add};});

 

 

加载方法如下:

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

 

 

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

  define(['myLib'], function(myLib){function foo(){myLib.doSomething();}return {foo : foo};});

 

 

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

六、加载非规范的模块

理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。那么,require.js是否能够加载非规范的模块呢?

回答是可以的。

这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。

举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。

  require.config({shim: {'underscore':{exports: '_'},'backbone': {deps: ['underscore', 'jquery'],exports: 'Backbone'}}});

 

 

require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。

比如,jQuery的插件可以这样定义:

  shim: {'jquery.scroll': {deps: ['jquery'],exports: 'jQuery.fn.scroll'}}

 

 

七、require.js插件

require.js还提供一系列插件,实现一些特定的功能。

domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

  require(['domready!'], function (doc){// called once the DOM is ready
});

 

 

text和image插件,则是允许require.js加载文本和图片文件。

  define(['text!review.txt','image!cat.jpg'],function(review,cat){console.log(review);document.body.appendChild(cat);});

 

 

类似的插件还有json和mdown,用于加载json文件和markdown文件。

转载于:https://www.cnblogs.com/wolfocme110/p/4647261.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一班洽谈框架细化_你怎样看待一家公司的合同管理制度?

公司合同管理制度设计细节【一】前文#PG201907提出了建立和完善合同管理制度的大纲&#xff0c;现就大纲之下的细节问题做出补充说明&#xff0c;具体管理制度范本&#xff0c;需各位根据公司实际情况予以细化和内化吸收&#xff0c;但切记三点&#xff1a;合法性、合理性、高效…

CSS3实现小黄人动画

转载请注明出处&#xff0c;谢谢&#xff01; 每次看到CSS3动画就心痒痒想试一下&#xff0c;记得一个多月前看了白树哥哥的一篇博客&#xff0c;突然开窍&#xff0c;于是拿他提供的demo试了一下&#xff0c;感觉很棒&#xff01;下图为demo提供的动画帧设计稿。 自己也想说搞…

ACM用N个正方体来建造金字塔问可以建造多少层

Description Vanya got n cubes. He decided to build a pyramid from them. Vanya wants to build the pyramid as follows: the top level of the pyramid must consist of 1 cube, the second level must consist of 1  2  3 cubes, the third level must have 1  2 …

editview只输入英文_搜狗输入法Mac版更新:适配苹果M1处理器

12月24日消息 据搜狗输入法官方&#xff0c;近日Mac版应用程序已完成更新&#xff0c;新版本引入苹果M1桌面处理器原生支持&#xff0c;体验更优、速度更快&#xff0c;兼容搭载MacBook Pro、MacBook Air和Mac mini等机型&#xff0c;令使用苹果M1系列产品的用户们获得更加高效…

添加nginx为系统服务(service nginx start/stop/restart)

1、在/etc/init.d/目录下编写脚本&#xff0c;名为nginx 1 #!/bin/sh 2 # 3 # nginx - this script starts and stops the nginx daemon 4 # 5 # chkconfig: - 85 15 6 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ 7 # proxy and IMAP/POP3…

angular div 滚动条事件_DOM事件

事件是在编程时系统内发生的动作或发生的事情&#xff08;单击、鼠标移动、滚动页面等&#xff09;。HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应。JS与HTML之间的交互是通过事件实现的&#xff0c;DOM支持大量的事件。事件的本质是程序各个组成部分之间的一种通信方式…

python 保存图片代码_最简单的selenium+Python自动右键保存图片

[toc]最近需要爬古籍影印版图片&#xff0c;但是对方网站有反爬虫&#xff0c;于是考虑用selenium&#xff0c;selenium比想象中的简单。右键的难点在于在元素上执行右键之后&#xff0c;selenium就不能操作菜单了。所以需要别的办法&#xff0c;有的使用autoit第三方软件&…

iOS_TableView的相关操作

【1】取消Tableview中cell的下划线 //无论是原始cell还是开发者自定义的cell&#xff0c;在表中都是默认有下划线的&#xff0c;取消cell自带的下划线 [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; //一般情况下上面一句代码就能搞定&#xff0c;但…

python查看内存地址的内容_python中如何查看指定内存地址的内容

python中一般并不需要查看内存内容,但作为从C/C++过来的人,有的时候还是想看看内存,有时是为了验证内容是否与预期一致,有时是为了探究下内存布局。 from sys import getsizeof from ctypes import string_at getsizeof(...) getsizeof(object, default) -> int Return…

android byte[] 转string 好多问号_Android 仿抖音实现动态壁纸

code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者&#xff1a;7_px链接&#xff1a;https://www.jianshu.com/p/fc5cf284abbb声明&#xff1a;本文已获7_px授权发表&#xff0c;转发等请联系原作者授权一、概述&#xff1a; 壁纸运行在一个…

游戏编程与游戏种类

游戏编程指利用计算机编程语言&#xff0c;如C编程语言、C、java等&#xff0c;编写计算机、手机或游戏机上的游戏。 目前流行的游戏编程语言为C编程语言&#xff0c;目前流行的游戏编程接口为DirectX9.0&#xff0c;还有OpenGL、SDL(Simple DirectMedia Layer)等。现在手机上玩…

print输出 pytorch_pytorch打印网络结构的实例

最简单的方法当然可以直接print(net)&#xff0c;但是这样网络比较复杂的时候效果不太好&#xff0c;看着比较乱&#xff1b;以前使用caffe的时候有一个网站可以在线生成网络框图&#xff0c;tensorflow可以用tensor board&#xff0c;keras中可以用model.summary()、或者plot_…

li:nth-child()和 li:nth-of-type()选择器区别

.demo li:nth-child(2)&#xff1a;表示demo下面第二个元素&#xff0c;若此元素不是li,则选择失败。.demo li:nth-of-type(2)&#xff1a;表示demo下面第二个li元素。转载于:https://www.cnblogs.com/lily2015/p/4661244.html

升序排序中国_干货满满!6行python代码挑战展示2020下半年中国最娱乐的人气男明星人气排行榜top10!...

本回答主要以2020下半年中国最娱乐的人气男明星top10变化动态条形图为例来展示如何用python生成动态条形图。知乎视频​www.zhihu.com一、 python生成动态条形图&#xff1a;以2020下半年中国最娱乐的人气男明星top10变化动态条形图为例。1. 安装第三方库1.1 下载第三方库的网址…

YII2 实现后台操作记录日志

一、连接linux服务器&#xff0c;创建数据文件 php yii migrate/create user_log 二、修改数据文件 console/migrations/m150721_032220_admin_log.php <?phpuse yii\db\Schema; use yii\db\Migration;class m150721_032220_admin_log extends Migration {public function…

cmd批量修改文件名 增加文字_Dynamo自动批量化修改文件名称

今天我们说一下如何批量化的修改文件名称&#xff0c;都9102年了总不能一个一个手动去修改吧。比如我们要对现有的族修改为带有我们企业缩写的族库,于是乎我把朋友的族就借过来了可以是下面这样&#xff1a;当然也不仅仅是修改族文件名称&#xff0c;我们可以修改任意文件夹下的…

CSS入门学习(转)

一、基础学习 1、何为CSS CSS是Cascading Style Sheets(层叠样式表)的简称&#xff0c;是一种标记语言,它不需要编译,可以直接由浏览器执行(属于浏览器解释型语 言). CSS文件也可以说是一个文本文件,它包含了一些CSS标记,CSS文件必须使用css为文件名后缀&#xff0c; 可以通…

在电脑上显示未知发布者怎么办_电脑开机后显示器黑屏只有鼠标能动,怎么办呢?...

开机黑屏进不了系统是很常见的电脑故障&#xff0c;导致该现象的原因也有很多种&#xff0c;有些用户是电脑开机后显示器黑屏只有鼠标能动&#xff0c;如果是这种情况该怎么办呢&#xff1f;出现电脑开机后显示器黑屏只有鼠标很有可能是资源管理器的问题&#xff0c;下面由维度…

ios图文详情加载html_前端项目009 Vue 信息分享系统 商品列表、详情

頔言頔语&#xff1a;进步&#xff0c;一定要进步&#xff0c;进步是跟收入持平的本钱。01 商品列表0101 路由配置和数据请求0102 上拉加载更多02 商品详情0201 详情数据请求和展示0202 轮播图组件提取0203 商品详情&#xff08;路由的本质理解&#xff09;01 商品列表0101 路由…

理解函数指针

在学习函数指针, 我遇到了问题, 我定义一个指针指向负责打印参数的函数, 1 void (*p)( int ) Fun; 好奇该指针存放的是什么&#xff08; 原以为是函数的入口地址&#xff09;&#xff0c;便调试观察一下他们的内存&#xff0c; Fun的值是 函数入口地址 0x00401030 Fun(i…