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 相关文章推荐
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
js字符串转成JSON
Nov 07 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
Sep 06 Javascript
详解js图片轮播效果实现原理
Dec 17 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
Aug 23 Javascript
vue组件如何被其他项目引用
Apr 13 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
浅析vue中常见循环遍历指令的使用 v-for
Apr 18 Javascript
vue+elementUI实现表格关键字筛选高亮
Oct 26 Javascript
jquery实现直播弹幕效果
Nov 28 jQuery
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随机输出名人名言的代码
2012/10/07 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
php中switch语句用法详解
2015/08/17 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP文件上传类实例详解
2016/04/08 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
多版本Python共存的配置方法
2017/05/22 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
Python守护进程实现过程详解
2020/02/10 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
项目合作协议书范本
2014/04/16 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
技术员岗位职责范本
2015/04/11 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python
利用Python实现模拟登录知乎
2022/05/25 Python