如何使用require.js?
最近几天在学习一个javascript库require.js,也看了一些相关的教学视频,这里推荐一下幕课网阿当老师的《阿当大话西游之Web组件》的教学视频,一整套看下来,参照视频里面的demo从头做一遍,对于require.js的使用以及web组件的编写挺有帮助的,作为菜鸟,看完后觉得获得更多的是一种编程思想的塑造!可以去看看!
言归正传,什么是require.js?
RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范,模块与模块之间可以互相依赖,当然可能会有人会想,模块之间的依赖,要是没法正确地去按照特定顺序加载,会出现错误,AMD规范可以处理这种问题,AMD就是这样一种对模块的定义,使模块和它的依赖可以被异步的加载,但又按照正确的顺序。
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
如何使用require.js?
将require.js下载下来,嵌入网页中,
<script data-main="scripts/main" src="scripts/require.js"></script>
这里的data-main属性声明的是入口文件scripts/main.js,这里我们把.js后缀省略掉了。也有以下这种写法:
<script src="scripts/require.js" data-main="scripts/main" defer async="true" ></script>
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。同时,官方提供了 require.js和 jquery 的打包版本,于是也可以怎么引入:
<script src="scripts/require-jquery.js" data-main="scripts/main" defer async="true" ></script>
RequireJS通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。
使用define方法,可以将代码写在一个js文件,独立开来作为一个模块,如我建立一个animate模块(animate.js),如下:
define(function(){ 
	  function animate(){ 
		    this.name="animate";
	  };
	  return { 
			    animate:animate ,
			    dec:"这是一个描述"
	  };
})
将你的模块代码放置在define(function(){ /*代码*/ });,然后将该模块return的对象暴露出来,可以供其他模块依赖此模块的时候,可以去调用这个模块的API。比如我们建立一个tabview模块(tabview.js)去依赖这个animate模块,
define(['animate'],function(a){
    function tabview(){
        this.name= 'tabview';
        this.animate = a.animate.name;
        this.dec = a.dec;
    }
    return { tabview:tabview };
})
分析上面的代码,我们将animate模块引入,并给其赋予一个a的别名。那么在该模块不就可以调用animate模块里面的方法和属性了吗?
这里我们在多建一个treeview模块(treeview.js),如下:
define(function(){
    function treeview(){
        this.name="treeview";
    };
    return { treeview:treeview };
})
接下来,我们需要去使用前面我们定义好的模块,便可以require方法来实现,见其写在main.js中,如下:
require(['tabview','treeview'],function(a,b){
    var tab = new a.tabview();
    var tree = new b.treeview();
    alert(tab.name);
    alert(tab.animate);
    alert(tab.dec);
    alert(tree.name);
});
使用该方法加载tabview、treeview两个模块,而tabview会去依赖animate模块,由于模块返回的都是对象,那我们可以new一个对象去调用加载模块中的方法和属性!
在main.js,我们需要去配置一下模块的路径,就那上面例子来说,需要配置一下几个模块的路径,如下:
require.config({
   paths: {
     "tabview": "js/tabview",
     "animate": "js/animate",
     "treeview": "js/treeview"
   }
 });
//另一种则是直接改变基目录(baseUrl)。后缀.js可以省略
require.config({
    baseUrl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
});
这样require.js便可以很灵活地使用来进行模块化管理了,这里有一个基于require.js去搭建一个web组件(弹窗的demo),很值得学习一下!可以去看看!github地址:https://github.com/xiaobinwu/require.js-Popup-window-
参考资料:RequireJS和AMD规范
如何使用require.js?的更多相关文章
- Javascript模块化编程(三):require.js的用法
		
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
 - javascript模块化编程(三):require.js用法
		
本文来自阮一峰 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require ...
 - require.js工作原理(初始)
		
详情:请见阮一峰老师的日志:http://www.ruanyifeng.com/blog/2012/11/require_js.html: 导入:<script data-main=" ...
 - Javascript模块化编程(三):require.js的用法(转)
		
这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...
 - require.js源码分析
		
写的寥寥草草,博客园的布局怎么弄还没有研究,再保存一份草稿,日后在完善,深度研究 require.js 加载顺序 1:加载html主页,require.js文件 2:脚本执行到html中的script ...
 - Angular.JS + Require.JS + angular-async-loader 来实现异步加载 angular 模块
		
传统的 angular 应用不支持异步加载模块,必须在 module 启动的时候,所有模块必须预加载进来. 通过使用 angular-async-loader 库,我们可以使用 requirejs 等 ...
 - require.js
		
日期: 2012年11月 7日 http://www.ruanyifeng.com/blog/2012/11/require_js.html 这个系列的第一部分和第二部分,介绍了Javascript模 ...
 - require.js 入门笔记
		
网站越来越庞大,JS也是越写越多. 当所有的JS 都集中在 HTML的 head 部分时,网页加载变得很慢,很多的 JS代码也并不是全都适用在当前的页面,造成了代码的冗余度非常高. 而且长长的JS代码 ...
 - require.js 的使用
		
一.为什么要用require.js 在同一个页面要加载多个js文件时,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长: 其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比 ...
 - require.js笔记
		
笔记参考来源:阮一峰 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 1. 浏览器端的模块只能采用“异步加载”方式 = ...
 
随机推荐
- python 关于  input
			
name = input("请输入你的姓名:") print(name) 解释:input表示输入,当你输入一个名字的时候, 它打印出来的东西,也就是你输入的东西, 结果: 请输入 ...
 - JUnit单元测试代码
			
package com.storage.test; import org.junit.Before; import org.junit.Test; import org.springframework ...
 - JAVA:IDEA使用Junit(3)
			
1.配置 File ——> Project Structure ——> Libraries ——> + ——>搜索Junit类库 确认ok即可 2.编辑项目 选择创建 配置生成 ...
 - C#设计模式(2)——简单工厂模式(转)
			
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
 - linux iptables详解(转)
			
概述 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成 ...
 - jdk1.8新特性之lambda表达式及在Android Studio中的使用举例
			
Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...
 - mysql 事务锁超时时间 innodb_lock_wait_timeout
			
mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...
 - 缓存淘汰算法---LRU转
			
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
 - AI 基础
			
what AI ? 人工智能(Artificial Intelligence),英文缩写为AI. 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的 ...
 - hdu5236 Article
			
题目链接 概率DP $dp_i$表示连打$i$个字符的期望按键数 那么枚举保存的次数,均分一下连打的个数就好 #include<iostream> #include<cstdio&g ...