r.js
是RequireJS
的一个附产品,支持在 NodeJS
环境下运行AMD
程序,并且其包含了一个名为RequireJS Optimizer
的工具,可以为项目完成合并脚本等优化操作
RequireJS Optimizer常规用法
写好一个配置文件, 比如 config.js
,常用属性有:
({
// 程序的根路径
appDir: "xxx",
// 脚本的根路径
// 相对于程序的根路径
baseUrl: "xxx",
// 打包输出到的路径
dir: "xxx",
// 需要打包合并的js模块,数组形式,可以有多个
// name 以 baseUrl 为相对路径,无需写 .js 后缀
// 比如 main 依赖 a 和 b,a 又依赖 c,则 {name: 'main'} 会把 c.js a.js b.js main.js 合并成一个 main.js
modules: [
{
name: "main"
}
...
],
// 通过正则以文件名排除文件/文件夹
// 比如当前的正则表示排除 .svn、.git 这类的隐藏文件
fileExclusionRegExp: /^\./
})
运行node
命令
node r.js -o config.js
这时 RequireJS Optimizer
就会:
- 把配置信息的
modules
下的所有模块建立好完整的依赖关系,再把相应的文件打包合并到dir
目录 - 把所有的
css
文件中,使用@import
语法的文件自动打包合并到dir
目录 - 把其他文件赋值到
dir
目录,比如图片、附件等
适合老旧传统项目使用的api
modules[i].include
modules: [
{
name: "main",
include: ["a", "b"]
}
]
这里include
字段提供了"强制建立依赖关系"的功能,也就是说,即使在 main.js
的代码里没有依赖 a.js
和 b.js
,它们也会在合并代码的时候插入到 main.js
的前面,这种打包方式非常适合传统老旧项目
two small demos using r.js to pack files
demo one:给使用`AMD`模块化开发方式的项目打包
目录结构
|——build
|——config.js
|——r.js
|——js
|——moduleA.js
|——moduleB.js
|——moduleC.js
|——main.js
|——require.min.js
|——index.html
文件详情
index.html
<script src="js/require.min.js" data-main="js/main.js">script>
moduleA.js
define(function () {
return {
a: 5
}
});
moduleB.js
define(function () {
return {
b: 10
}
});
moduleC.js
define([
'moduleA',
'moduleB'
], function(moduleA, moduleB) {
'use strict';
let a = moduleA.a;
let b = moduleB.b;
function add (x, y) {
return x + y;
}
function init() {
console.log('app init');
console.log('the result is: ' + add(a, b));
}
return {
init: init
}
});
main.js
// don't use moduleA.js or js/moduleA.js here
require(["moduleC"], function (moduleC) {
moduleC.init();
})
打包配置文件config.js
({
appDir: '../',
baseUrl: './js',
dir: "../dist",
keepBuildDir: false,
// 打包结果优化; 压缩等
optimize: "none",
skipModuleInsertion: true,
removeCombined: true,
modules: [
{
name: "main"
}
],
fileExclusionRegExp: /^(\.|build|dist|README)/,
})
运行打包命令
node r.js -o config.js
打包结果
dist 目录结构
|——js
|——main.js
|——require.min.js
|——build.txt
|——index.html
打包完的 main.js
;自动分析依赖,并将所有依赖到的文件统一打包到 main.js
中
define('moduleA',[],function () {
return {
a: 5
}
});
define('moduleB',[],function () {
return {
b: 10
}
});
define('moduleC',[
'moduleA',
'moduleB'
], function(moduleA, moduleB) {
let a = moduleA.a;
let b = moduleB.b;
function add (x, y) {
return x + y;
}
function init() {
console.log('app init');
console.log('the result is: ' + add(a, b));
}
return {
init: init
}
});
// don't use moduleA.js or js/moduleA.js here
require(["moduleC"], function (moduleC) {
moduleC.init();
});
demo two:给传统旧项目打包
目录结构
|——build
|——config.js
|——r.js
|——css
|——a.css
|——b.css
|——main.css
|——image
|——a.jpg
|——js
|——a.js
|——b.js
|——main.js
|——index.html
文件详情
index.html
...
"stylesheet" href="css/main.css">
...
<img src="images/a.jpg" alt="">div>
...