JS模块化工具 requirejs 学习文档
作为一个Java开发者,原来写js代码都是流水账式的,一直想写出模块化的js,但是前端工具多如牛毛,确都是针对于nodejs的打包工具。但是我在实际的开发过程中,并没有使用到太多的js库,一般只使用到boostrap、jquery和其相关的插件,并不想引入nodejs和各种前端插件来增加项目的复杂度。requirejs完全符合我的要求,还可以配合maven实现自动打包和压缩代码。下面我们来简单介绍一下requirejs,实现在开发阶段,不打包,不压缩,模块化开发;部署阶段,自动打包、压缩。
requirejs简介
requirejs是JS模块化开发的框架,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染和其后的脚本的执行。使用requirejs可以简化js的依赖,我们无需在html文件中使用标签引入大量的js文件,只需引入少量的
require.js
文件,其他的js文件都可以通过requirejs引入。
官方网站|requirejs中文网|Github
什么是AMD
define(id?, dependencies?, factory);
- Id:模块名,可以省略
- Dependencies:所依赖模块的数组,可以省略
- Factory:模块的实现,可以是函数或对象
requirejs安装
- 使用npm
npm install –g requirejs
- 使用CDN
- 使用本地文件
如果需要使用其他的js,只需在require。config.js之中导入对应模块即可。
requirejs常用Api
require导入模块
在模块中引入其他模块的语法为:
require(['jquery'], function($) {
//回调函数
});
在回调函数中我们就可以使用jquery中的$
符号了。
当然我们只会引用其他的模块是肯定不行的,我们还需要定义符合AMD规范的模块。
define定义模块
自定义模块的语法为:
define(["jquery"], function($) {
});
define({
username: "yoojoo",
email: "[email protected]",
gender: "男"
})
这个模块是一个依赖于jquery的匿名模块,在requirejs中定义匿名模块也是模块定义的最佳实践,他将以对应的文件名作为模块的模块名。
常用配置
requirejs.config({
baseUrl: '/public/js',
paths: {
hello: 'hello'
},
shims: {
hello: { exports: 'hello' }
}
});
baseUrl配置
baseUrl用于配置js文件的根目录
baseUrl: '/public/js',
paths配置
paths用于配置js模块的模块名和文件位置
paths: {
"jquery": "./lib/jquery.min"
}
上面表示jquery的js文件位置为public/js/lib/jquery.min.js
配置不支持AMD的库和插件
shims、exports、deps配置
shim:{
"modernizr": { //不支持AMD的模块
depts:["jquery"], //依赖的模块
exports: "Modernizr",//全局变量作为模块对象
init : function($){
return $; //初始化函数,返回的对象代替exports作为模块对象
}
},
"bootstrap": ["jquery"] //只配置依赖可以省略
}
map多版本配置
项目开发初期使用jquery1.12.3,后期以为需要支持移动开发,升级到jquery2.2.3。但是又担心之前依赖jquery1.12.3的代码升级到2.2.3后可能会有问题,就保守的让这部分代码继续使用1.12.3版本
map: {
"app/api":{
"jquery": "./lib/jquery"
},
"app/api2":{
"jquery": "./lib/jquery2"
}
}
当app/api模块里加载jquery模块时,将加载jquery.js
当app/api2模块里加载jquery模块时,将加载jquery2.js
waitSeconds
下载js等待的时间,默认7秒。如果设为0,则禁用等待超时。
urlArgs
下载文件时,在url后面增加额外的query参数
e.g. urlArgs: “_=" + (new Date()).getTime()
jsonp服务
什么是jsonp
是json的一种使用模式,可以跨域获取数据,如json
同源策略:www.baidu.com通过ajax不能获取www.qq.com的数据
传统的jsonp实现
//www.qq.com中
//在www.baidu.com/user下
onload({
username: "yoojoo",
email: "[email protected]",
gender: "男"
})
这样通过