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 相关文章推荐
一个js的tab切换效果代码[代码分离]
Apr 11 Javascript
javascript 文件的同步加载与异步加载实现原理
Dec 13 Javascript
Javascript中设置默认参数值示例
Sep 11 Javascript
animate 实现滑动切换效果【实例代码】
May 05 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
解析JavaScript模仿块级作用域
Dec 29 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
微信小程序中页面FOR循环和嵌套循环
Jun 21 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
Apr 28 Javascript
js实现下拉框二级联动
Dec 04 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 Javascript
vue-router 中 meta的用法详解
Nov 01 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网页病毒清除类
2014/12/08 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
JS中的多态实例详解
2017/10/15 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
微信小程序自定义底部弹出框
2020/11/16 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python中二维阵列的变换实例
2014/10/09 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python3操作mysql数据库的方法
2017/06/23 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
药剂专业自荐书
2014/06/20 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
迎七一演讲稿
2014/09/12 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
2014年仓库工作总结
2014/11/20 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL