当我们在使用requirejs来管理js模块的依赖的时候,会发现页面的请求文件数会很多,那么如何去减少文件的请求次数呢?想必很多人都知道,可以使用requireJS的优化工具r.js来解决这个问题,而且r.js的使用也简单,容易上手。
r.js是什么?
r.js是requireJS的优化(Optimizer)工具,可以实现前端文件的压缩与合并,减小前端文件大小、减少文件的请求次数。
下面是使用r.js时,个人简单的使用记录。
一、准备
在使用它之前,
首先,你要先掌握requirejs的使用。
然后,需要安装nodeJS环境,以便通过命令行来执行r.js功能。
再次,需下载r.js文件( 下载地址: http://requirejs.org/docs/download.html#rjs),将其放到你的项目根目录。本文用的r.js版本是2.3.2。
那么,下面以前端吧网站目录为demo简单说明一下r.js的使用,项目目录:
说明:
src是开发项目存放目录(也就是说js没有进行压缩与合并)。
dist是压缩与合并后项目存放的目录。(这里是先手动创建好)
build.js、r.js存放在qianduan8根目录下,与src、dist目录平级。(build.js是后面创建而成)
二、手动配置build.js
准备好r.js后,接下来我们手动配置build.js,本项目的build.js配置如下:
({ appDir: './', //项目根目录 dir: 'dist', //定义输出的目录,所有文件打包后要存放的目录(个人在使用时是指定的,不指定有问题) baseUrl: 'src/js/', //相对于appDir,代表要查找js文件的起始文件夹,下文所有文件路径的定义都是基于这个baseUrl fileExclusionRegExp: /^(r|build)\.js$/, //过滤正则表达式,匹配到的文件将不会被输出到输出目录去 optimize: "none", //JavaScript 代码不压缩 optimizeCss: 'standard', //以标准的压缩方式压缩css removeCombined: false, modules: [ //要优化的模块 { name:'index'} ,{ name:'site'},{ name:'aboutMain'},{ name:'content'},{ name:'list'} //就是各页面的入口js文件,相对baseUrl的路径,省略后缀“.js” ], paths:{ //设置模块的路径。相对路径以baseUrl为当前目录。 'jquery':'lib/jquery-2.2.0.min', 'slide':'mod/slide', 'lazyload':'lib/jquery.lazyload.min' }, shim:{ //shim配置在requirejs运行过程中被使用的话,需要在这里重复声明, 'slide':['jquery'], 'lazyload':['jquery'], 'prettify':['jquery'] } })
在使用requirejs的时候,通常我们通过require.config配置好paths、shim,然后需要在每个入口页面都加上这个配置。如本例的require.config:
require.config({ paths:{ 'jquery':'./lib/jquery-2.2.0.min', 'slide':'./mod/slide', 'lazyload':'./lib/jquery.lazyload.min' }, shim:{ 'slide':['jquery'], 'lazyload':['jquery'], 'prettify':['jquery'] } })
在这里,我们可以使用build.js的paths、shim配置后,就可以把每个页面的以上这段require.config配置全部删掉了。
以上配置相关参数具体说明:
1、appDir
应用程序的根目录。可选的,如果指定该设置,说明您的所有文件都在这个目录下面(包括dir和dirbaseUrl都以这个为根目录)。如果不设置,则以baseUrl设置的路径为准。
2、dir
输出目录的路径。如果不设置,则默认为和 build 文件同级的 build 目录。
3、baseUrl
默认情况下,所有的模块都是相对于这个路径的。如果没有设置,则模块的加载是相对于 build 文件所在的目录。另外,如果设置了appDir,那么 baseUrl 应该定义为相对于 appDir 的路径。
4、optimize
JavaScript 代码优化方式。可选的值:
“uglify:使用 UglifyJS 压缩代码,默认值;
“uglify2″:使用 2.1.2+ 版本进行压缩;
“closure”: 使用 Google’s Closure Compiler 进行压缩,需要 Java 环境;
“closure.keepLines”:使用 Closure Compiler 进行压缩并保留换行;
“none”:不压缩;
5、optimizeCss
CSS 代码优化方式,可选的值有:
“standard”:标准的压缩方式;
“standard.keepLines”:保留换行;
6、fileExclusionRegExp
要排除的文件的正则匹配的表达式。
7、removeCombined
删除之前压缩合并的文件,默认值 false。如果为true,将从输出目录中删除已合并的文件。
8、modules
定义要被优化的模块数组。每一项是模块优化的配置,常用的几个参数如下:
name:模块名;
create:如果不存在,是否创建。默认 false;
include:额外引入的模块,和 name 定义的模块一起压缩合并;
xclude:要排除的模块。有些模块有公共的依赖模块,在合并的时候每个都会压缩进去,例如一些基础库。使用 exclude 就可以把这些模块在压缩在一个更早之前加载的模块中,其它模块不用重复引入。
更多参数配置,请查看:
https://github.com/requirejs/r.js/blob/master/build/example.build.js
http://nomospace.com/posts/r.js-example.build.js.html
三、运行r.js
当我们都配置好以后,就可以使用如下命令运行来压缩和合并了。
node r.js -o build.js
如下图所示:
优化后的项目图:(会发现原先空目录的dist有了src目录)
四、优化前后效果的对比
1、文件代码对比(以入口文件index.js为例)
优化前的index.js:(index.js大小1kB)
优化后index.js:(其实就是把上图中的slide、jquery、common依赖的模块都合并成新的index.js了,index.js大小变为88kB)。
2、请求文件次数的对比
优化前打开的index.html:(如图红线处,请求的js文件是5个)
优化后打开的index.html:(如图红线处,请求的js文件成2个了)
从图中对比可知,使用了r.js优化后,页面中请求文件的次数变少了,这样可以减少对服务器的请求,因为r.js把index.html页面所需要用到的js文件都全部合并到入口文件index.js中去了。
以上就是如何使用r.js的简单学习记录,欢迎指导!