requirejs的使用场景
在早期,网页的功能非常有限,所以需要的js代码量相对较少。随着网页功能的增加,可能需要引入多个js文件,演示如下:
<scriptsrc="a.js"></script>
<scriptsrc="b.js"></script>
<scriptsrc="c.js"></script>
<scriptsrc="d.js"></script>
<scriptsrc="e.js"></script>
上面的代码会一次加载每一个js文件,但是具有如下明显的缺点:
- 造成堵塞,影响页面渲染;
- 如果文件之间存在依赖,无法保证以正确的顺序加载完成
很难保证页面不会不会出现啥啥js undefined或者啥啥啥is not a function之类的错误。比如一个jquery的插件显然是依赖jquery核心库的,所以jquery核心库文件必须先引入。项目小组建少依赖简单还好,要是项目大组建依赖复杂就糟糕了。
requierjs就可以完美解决上述问题,优点如下:
- 可以实现js文件的异步加载,防止阻塞;
- 实现模块之间的相互依赖管理。
加载require
require.js虽然是用来管理其他模块js文件的,它本身也是一个js。
默认情况下也会阻塞网页的渲染,不过可以采用如下措施解决:
- 将require.js放置于页面的最底部。
<scriptsrc="js/require.js"></script>
- 给<script>标签设置async属性。
<scriptsrc="js/require.js"deferasync="true"></script>
这样js文件也会进行异步加载;因为浏览器兼容问题,通常也要添加defer属性。
reqiurejs咋用?
请记住使用requirejs的口诀,两函数一配置一属性
data-main属性(data-main主模块使用)
当require.js文件加载完毕之后,就可以开始它的模块管理工作,看一段代码:
<scriptsrc="js/require.js"data-main="js/main"></script>
require.js在加载的时候会检查data-main属性,当加载完毕,data-main属性规定的js文件会第一个被require.js加载并执行。犹如require.js默认的文件后缀名是js,所以可以把main.js简写成main。main.js是要执行的js的主体。
require.config()配置
参数都是采用的默认配置:
<scriptsrc="js/require.js"data-main="js/main"></script>
main.js的代码如下:
require(['jquery','underscore','backbone'],function($, _, Backbone){
// 代码
});
默认情况下,require.js假定这三个模块与main.js在同一个目录,文件名分别为jquery.js\underscore.js和backbone.js,然后自动加载。我们也可以使用require.config()方法进行配置,代码如下:
require.config({
paths: {
"jquery":"lib/jquery.min",
"underscore":"lib/underscore.min",
"backbone":"lib/backbone.min"
}
});
baseUrl——用于加载模块的根路径;
paths——用于映射不存在根路径下面的模块路径;
shims——配置在脚本/模块外面并没有使用requireJS的函数依赖并且初始化函数。假设underscore并没有使用 RequireJS定义,但是你还是想通过RequireJS来使用它,那么你就需要在配置中把它定义为一个shim。
特别说明:baseurl规定的路径参照与引入main.js页面的相对路径,因为此时main.js文件已经导入到此页面。避免baseurl生效的方式:
- 以“.js结束;
- 以“/”开始
- 包含url协议,如“http:”or"https:"
代码实例如下:
require.config({
baseUrl:"js/lib",
paths: {
"jquery":"jquery.min.js",
"underscore":"underscore.min",
"backbone":"backbone.min"
}
});
deps——加载依赖关系数组
require.config({
//默认情况下从这个文件开始拉去取资源
baseUrl:'scripts/app',
//如果你的依赖模块以pb头,会从scripts/pb加载模块。
paths:{
pb:'../pb'
},
// load backbone as a shim,所谓就是将没有采用requirejs方式定义
//模块的东西转变为requirejs模块
shim:{
'backbone':{
deps:['underscore'],
exports:'Backbone'
}
}
});
define()函数
该函数御用定义模块。形式如下:
//logger.js
define(["a"],function(a) {
'use strict';
functioninfo() {
console.log("我是私有函数");
}
return{
name:"一个属性",
test:function(a){
console.log(a+"你好!");
a.f();
info();
}
}
});
define函数就受两个参数。
第一个是一个字符串数组,表示你定义的模块依赖的模块,这里依赖模块a;
第二参数是一个函数,参数是注入前面依赖的模块,顺序同第一参数顺序。在函数中可做逻辑处理,通过return一个对象暴漏模块的属性和方法,不再return中的可以认为是私有方法和私有属性。
requier()函数
该函数用于调用定义好的模块,可以是用define函数定义的,也可以是一个shim。形式如下“:
//app.js
require(['logger'], function (logger) {
logger.test("大熊");
console.log(logger.name);
});
//输出结果:
//大熊你好!
//不确定(取决于a模块的f方法)
//我是私有函数
//一个属性
本文详细介绍了RequireJS在解决大型项目中JS文件依赖管理和异步加载的问题。通过配置baseUrl、paths和shims,以及使用define和require函数,实现模块化开发,提高网页加载速度和代码维护效率。
1万+

被折叠的 条评论
为什么被折叠?



