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 相关文章推荐
用roll.js实现的图片自动滚动+鼠标触动的特效
Mar 18 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
浅谈JavaScript字符串与数组
Jun 03 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
Mar 04 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
Apr 04 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
Mar 04 Javascript
ES6入门教程之变量的解构赋值详解
Apr 13 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中time()和mktime()方法的区别
2013/09/28 PHP
php 启动报错如何解决
2014/01/17 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python如何对XML 解析
2020/06/28 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
优秀的导游求职信范文
2014/04/06 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
宪法宣传标语100条
2019/10/15 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS