RequireJS使用注意细节


Posted in Javascript onMay 15, 2016

RequireJS介绍

RequireJS由James Burke创建,他也是AMD规范的创始人。

RequireJS会让你以不同于往常的方式去写JavaScript。你将不再使用script标签在HTML中引入JS文件,以及不用通过script标签顺序去管理依赖关系。

RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一。最新版本的RequireJS压缩后只有14K,堪称非常轻量。它还同时可以和其他的框架协同工作,使用RequireJS必将使您的前端代码质量得以提升。

使用RequireJS做异步模块加载,有几点值得注意的地方:

1.模块定义两种写法

1. 存在依赖的函数式定义

如果模块存在依赖:则第一个参数是依赖的名称数组;第二个参数是函数,在模块的所有依赖加载完毕后,该函数会被调用来定义该模块,因此该模块应该返回一个定义了本模块的object。依赖关系会以参数的形式注入到该函数上,参数列表与依赖名称列表一一对应。

define(['a'], function(aJ) {
var hello = function(){
aJ.hello('i am c.js');
}
return {
hello : hello
}
});

PS: 对模块的返回值类型并没有强制为一定是个object,任何函数的返回值都是允许的。

2. CommonJS模块格式定义

require : 用来引入依赖其他模块方法。

exports : 导出模块变量或方法的对象。

module :包含该模块的信息。

require.config({
baseUrl: "",
config: {
'b': {
size: 'large'
}
},
paths: {
a : 'base/a',
b : 'base/b',
c : 'base/c'
}
});
define(function(require, exports, module) {
var aJ = require("a");

var hello = function(){
aJ.hello('i am b.js');
}
var hello2 = function(){
aJ.hello('i am b.js22');
}
exports.hello = hello;
console.log("b.js : exports", exports);
console.log("b.js : module", module);
console.log("b.js : config", module.config());
//不能一起用,return会覆盖调前面的exports
/*return {
hello : hello2
}*/
});

PS:return 对象和exports不能一起用,return会覆盖调前面的exports。

下面是调用后打印的信息:

exports:可以看出exports是module的一个属性。

module :里面包括了该模块的别名、uri、导出对象、config信息方法。

config :我们常常需要将配置信息传给一个模块。这些配置往往是application级别的信息,需要一个手段将它们向下传递给模块。

在RequireJS中,基于requirejs.config()的config配置项来实现。

2. 警惕单例变量

警惕单例里变量,因为RequireJS在require一次后,之后的require都是使用之前的缓存。所以当模块里面定义了一个变量后,只要在此require改变后,其他require也是保持一致的。

define(function() {
var index = 0;
var hello = function(msg){
console.log(msg);
}
var addIndex = function(){
index++;
}
var getIndex = function(){
return index;
}
return {
hello : hello,
addIndex : addIndex,
getIndex : getIndex
}
});

调用:

require(['a',], function (A) {
require(['a'], function (A) {
console.log(A.getIndex());
A.addIndex();
A.addIndex();
});
require(['a'], function (A) {
console.log(A.getIndex());
});
});

上面分别打印的是:

0
2

3. 清除缓存

因为RequireJS有缓存的功能,但是在开发的时候我们不希望它缓存,就可以在require.config设置urlArgs。

urlArgs:RequireJS获取资源时附加在URL后面的额外的query参数。

示例:

urlArgs: "bust=" + (new Date()).getTime()

在开发中这很有用,但记得在部署到生成环境之前移除它。

4. 从其他包中加载模块

RequireJS支持从CommonJS包结构中加载模块,但需要一些额外的配置。

package config可为特定的包指定下述属性:

1. name : 包名(用于模块名/前缀映射)。

2. location : 磁盘上的位置。位置是相对于配置中的baseUrl值,除非它们包含协议或以“/”开头。

3. main : 当以“包名”发起require调用后,所应用的一个包内的模块。

默认为“main”,除非在此处做了另外设定。

该值是相对于包目录的。

例子:

main.js

require.config({
baseUrl: "",
packages: [{
name: "student",
location: "package-stu"
},{
name: "teacher",
location: "package-tea"
}],
urlArgs: "bust=" + (new Date()).getTime()
});
require(["student/store", "teacher/tea"], function (Sto, Tea) {
Sto.hello(); 
Tea.hello(); 
});

tea.js:

define(function(require, exports, module) {
exports.hello = function(){
console.log('i am a teacher.');
}
});

stu.js:

define(function(require, exports, module) {
exports.name = '海角'; 
});

store.js:

define(function(require, exports, module) {
var stu = require("student/stu"); 
exports.hello = function(){
console.log('i am ' + stu.name);
}
});

这种从其他包加载模块的方式,我感觉有两个怪异地方(我不是很明白):

1. 其他包里面的模块引用其他模块的写法,使用者反而影响模块的写法?

2. 其他包里面的main.js好像没有用了,没内容都没问题。

以上内容是小编给大家介绍的RequireJS使用注意细节,希望对大家有所帮助!

Javascript 相关文章推荐
JavaScript:Div层拖动效果实例代码
Aug 06 Javascript
js加入收藏以及使用Jquery更改透明度
Jan 26 Javascript
使用JS+plupload直接批量上传图片到又拍云
Dec 01 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
Nov 09 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
Nov 23 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
js实现抽奖效果
Mar 27 Javascript
vue中的event bus非父子组件通信解析
Oct 27 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
May 15 #Javascript
jQuery插件开发汇总
May 15 #Javascript
Javascript的无new构建实例详解
May 15 #Javascript
Javascript基础知识盲点总结之函数
May 15 #Javascript
深入理解$.each和$(selector).each
May 15 #Javascript
js中最容易被忽视的事件问题大总结
May 15 #Javascript
jquery点击改变class并toggle的实现代码
May 15 #Javascript
You might like
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
Python对象类型及其运算方法(详解)
2017/07/05 Python
django实现前后台交互实例
2017/08/07 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python实现电子产品商店
2019/02/26 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
德国旅游网站:weg.de
2018/06/03 全球购物
大学毕业通用个人的求职信
2013/12/08 职场文书
事业单位岗位说明书
2015/10/08 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
python_tkinter事件类型详情
2022/03/20 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server