`

require.js使用教程

 
阅读更多

require.js API:http://requirejs.org/docs/api.html#config

参考文档:http://www.tuicool.com/articles/bu6Zbi

require.js优点

1.实现JS文件的异步加载,避免网页被堵塞

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

 

基本语法及使用

1.引用require.js

在页面头部head标签内引用require.js,如下:

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

 但是这个加载这个文件也可能造成网页失去响应,也是同步加载,我们可以加上defer和async属性,如下:

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

 Asynce属性表明文件需要异步加载,IE不支持这个属性,值支持defer,所以上面把这两个属性都加上。接下来,看看require.js启动加载脚本的初始化方式,requireJS支持属性data-main这个属性来加载初始化的js文件,如下:

<script src="js/require.js" defer async="true" data-main="js/app.js"></script>

上面的意思是:先异步加载require.js文件,完成后继续异步加载app.js文件,上面app.js后的.js可以去掉,require.js默认后缀名是.js

 

2.定义模块文件

require.js编写模块不同于其他脚本文件,它良好的使用define来定义一个作用域避免污染全局空间,它可以显示出其依赖关系,并以函数(模块定义中的那个函数)参数的形式将这些依赖注入

 

做一个demo,新建如下一个项目文件:

 

 现在app/b.js中添加模块定义代码:

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

 使用define定义模块,下面我们需要在app.js里面加载b.js模块,代码如下:

require(['app/b'],function(b){
   console.log(b.add(1,1));
});

 

在head标签内动态生成文件,如下:

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/require.js" defer="" async="true" data-main="js/app"></script>
<script>	
</script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="app" src="js/app.js"></script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="app/b" src="js/app/b.js"></script>
</head>

 可以看到加载顺序是require.js-->app.js-->b.js

上面是使用define定义一个函数,我们可以直接定义一个对象(可以解决污染全局变量的问题,关于define更多内容请看《AMD》一文),现在在a.js中定义一个对象:

define({
  name:'jiaqing',
  age:22
});

 app.js初始化代码改为:

require(['app/a'],function(a){
 console.log(a);
)};

 结果可以自己测试下

 

3.AMD模块定义规范

①:

define(function(){
 return x:x
});

②有依赖项:

define(['data'],function(data){

});

③定义对象:

define({
data:'';
ui:'';
});

④具名模块:

define('index',['data'],function(data){
//todo
});

⑤包装模块:

define(function(require,exports,module){
  var base = require('base');
//这一句相当于define的模块依赖id为‘base’的模块
  exports.show = function(){
  //todo with module base
  }
  //exports.show这句相当于 return {show:}
});

 这个书写格式和node.js比较像,可以使用require获取模块依赖,使用exports或者module.exports导出API

更多AMD的细节参见《AMD》一文,require.js很好的实现了AMD规范,所以也有上面的定义模块方式

 

举个例子理解第五种写法,想引用a.js,修改app.js代码如下:

define(function(require,exports,module){
  var a = require('app/a');
  console.log(a);
  exports.show = function(){
  
  }
});

 注意:1.书写require.js遵循一个文件一个模块

 2.不要手动写模块名标识

 

4.require.js配置项

1.baseUrl:指定本地模块的基准目录,即本地模块的路径是相对于哪个目录的,该属性通常由require.js加载时的data-main属性指定。

项目结构还是上面的,在index.html页面<head>中引用 <script src="js/require.js" defer async="true" data-main="js/app"></script>

在app.js中写如下代码:

require.config({
  baseUrl:'js/app'
});

require(['a','b','c'],function(a,b,c){
});

 

看项目文件图,index.html和js目录是同一个目录下的,都是放在require文件夹里面的,所以定义baseUrl:‘js/app’会自动解析成require/js/app/ 所以require(['a','b','c'])的话,会自动到require/js/app/目录下去查找a.js,b.js,c.js,找到了就可以加载出来

如果未显式设置baseUrl,则默认值是加载require.js的html所处的位置,如果使用了data-main属性的话,则该路径成了baseUrl。

如果把上面app.js中的require.config去掉则对‘a’,‘b’,‘c’的引用在浏览器中被解析成:

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/require.js" defer="" async="true" data-main="js/app"></script>
<script>
	
</script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="app" src="js/app.js"></script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="a" src="js/a.js"></script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="b" src="js/b.js"></script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="c" src="js/c.js"></script>
</head>

 也就是在app.js所在的js目录下查找他们

 

2.paths:为那些模块名称没有直接存在baseUrl内的模块做路径映射,设置paths的起始位置是相对于baseUrl的,除非该path设置是以“/”开头或含有URL协议(http://或https://)

模块名称对应的路径名不应该包含扩展名,因为路径名也可以用于映射目录,如果映射的是模块,将会自动加上.js扩展名

例子:

将上面app.js代码改为:

require.config({
  baseUrl:'js/lib',
  paths:{
     app:'../app'
  }
});

require(['app/a'],function(a){
});

 则页面加载显示如下:

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/require.js" defer="" async="true" data-main="js/app"></script>
<script>
	
</script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="app" src="js/app.js"></script>
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="app/a" src="js/lib/../app/a.js"></script>
</head>

 可以看到paths是相对于baseUrl配置项生成的,'..'解析到上层的js目录。require(['app/a'])实际上就是解析到js/app/a.js了。

 

3.shim:为旧的,传统的且没有使用define()声明依赖和模块值的“浏览器全局”脚本配置依赖,输出值和用户初始化

 

4.其他配置属性看文档

 

5.内部机制

require.js加载每个模块作为scriptTag,使用head.appendChild()方法,在模块定义时,require.js等到所有的依赖都加载完毕,会为函数的调用计算出正确的顺序,然后在函数中通过正确的顺序进行调用

分享到:
评论

相关推荐

    require.js教程

    1. RequireJS的基本使用:RequireJS的使用主要涉及其API的调用,如require(),require.config()等。require()函数用于加载模块,可以在其参数中指定要加载的模块列表和一个回调函数,当所有指定模块加载完成后,回调...

    require.js教程.模块化

    require.js教程.模块化 大家都知道js代码的面向对象鸡助得没话说 所以将js代码模块化是个很重要的技能 我们使用require.js来将我们写的代码封闭成模块 今天写个教程 requirejs教程,最后自动打包发布js模块文件

    AMD之require.js与CMD之sea.js

    require.js在大项目和复杂依赖管理中表现出色,而sea.js则更易于理解和使用,适合小型项目或团队协作。在选择使用哪种模块加载器时,应根据项目规模、团队技能和性能需求来决定。 在压缩包文件"CMD_Sample"中,很...

    require.js教程.zip

    RequireJS教程

    ReactJS.NET-with-require.js-getting-started-tutorial:ReactJS.NET 和 require.js 入门教程代码

    ReactJS.NET-with-require.js-getting-started-tutorial 此 repo 包含在 require.js 的帮助下在客户端和服务器端进行同构React渲染的示例。 Ps 它还包含一个带有松散依赖步骤的奖励示例,请查看 main.js 以获取想法...

    WebChimera.js使用的简单案例

    WebChimera.js 和wcjs_player的简单实用案例。使用简单明了 WebChimera.js 和wcjs_player的简单实用案例。使用简单明了 WebChimera.js 和wcjs_player的简单实用案例。使用简单明了

    react-requirejs-example:React 教程与 require.js 一起使用

    标题"react-requirejs-example"表明这是一个关于如何在React项目中集成和使用require.js的教程。在现代Web开发中,模块化是关键,因为大型项目往往包含大量分散的代码文件。通过结合React和require.js,开发者可以将...

    node.js手把手教程

    然后,教程可能会讲解Node.js的模块系统,这是组织代码的重要方式,例如使用`require`导入模块和`exports`或`module.exports`导出模块。 Web服务器的搭建是Node.js入门的重点。通过学习`http`模块,你可以了解如何...

    7天搞定Node.js.全套视频教程

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端代码,打破了JavaScript只能在浏览器中运行的传统。本套“7天搞定Node.js”视频教程旨在帮助初学者快速掌握Node.js的...

    node.js 入门教程

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够使用 JavaScript 来进行服务器端编程。这个入门教程将带你走进 Node.js 的世界,了解其核心概念、工作原理以及如何利用它来开发高效的应用...

    javascript模块化

    Require.js是一种实现**AMD(Asynchronous Module Definition)**规范的JavaScript模块加载器。AMD规范允许模块异步加载,并且可以在定义模块时声明其依赖关系。这有助于减少页面加载时间和提高代码执行效率。 - **...

    Node.js教程/中文文档/开发指南pdf

    2. **Node.js模块系统**:Node.js的模块系统遵循CommonJS规范,通过`require()`函数可以导入和使用模块,而`module.exports`或`exports`用于导出模块内容。此外,Node.js还拥有内置模块和第三方模块,如`path`用于...

    mediainfo.js获取视频详细信息

    在本文中,我们将深入探讨如何使用mediainfo.js来获取视频的详细信息,包括帧率、时长以及计算总帧数。 首先,我们需要了解mediainfo.js的基本用法。在项目中引入mediainfo.js库后,你可以创建一个MediaInfo对象并...

    无涯教程(LearnFk)-Node.js教程离线版.pdf

    这种技术允许开发者使用JavaScript编写服务器端应用程序,这在Node.js出现之前是非常罕见的,因为JavaScript通常只被用作客户端脚本语言。Node.js的出现改变了这种状况,使得JavaScript能够被广泛用于服务端开发。 ...

    sea.js demo 简单实例教程

    本教程将带你通过一个简单的示例了解如何使用 Sea.js。 ### 1. 什么是 Sea.js Sea.js 是一个遵循 CMD(Common Module Definition)规范的 JavaScript 模块加载器,它旨在为浏览器环境提供模块化的解决方案。CMD ...

    Node.js-使用node做server的基础脚手架基于egg.js

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。Egg.js 是一个由阿里云开发的企业级 Node.js 框架,旨在提供一套高效...

    《Node入门一本全面地Node.js教程》PDF

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这本《Node入门一本全面地Node.js教程》PDF,是学习Node.js的基础指南,涵盖了从安装到实际项目开发的全方位...

    node.js安装及使用教程

    ### Node.js 安装及使用教程 #### 一、Node.js简介 Node.js是一个开源的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端的应用程序。Node.js基于Google Chrome的V8 JavaScript引擎构建,并采用了事件...

Global site tag (gtag.js) - Google Analytics