r.js打包
久闻r.js的大名,但实际没有用它做过任何东西。今天用它时,发现网上许多教程都不对。研究一下,把我的实际经验分享给大家。
例子1
先是HTML页面
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<script data-main="scripts/main-built" src="scripts/require.js"></script>
</head>
<body>
<h1>My App</h1>
</body>
</html>
js都放在scripts目录下,换言之 html与scripts是平级。此目录下有r.js, require.js, one.js, two.js, three.js, main.js

上面HTML提到的main-built.js是一会儿动态生成的。
r.js 可以在这里找到https://github.com/jrburke/r.js/blob/master/dist/r.js,总共7MB,非常疯狂!听说把各种情况都hold住了, 比spm强大多了!
接着是几个JS的内容:
one.js
define(function(){
return 1
})
two.js
define(function(){
return 2
})
three.js
define(function(){
return 3
})
main.js
require(["one", "two", "three"], function (one, two, three) {
alert(one+two+three)
});
好了,我们再看一下build.js如何写
({
baseUrl: ".",
name: "main",
out: "main-built.js"
})
定位到此目的,执行node r.js -o build.js

最后生成main-built.js文件,我格式化它一下,里面内容如下:
define("one",[],function(){return 1}),
define("two",[],function(){return 2}),
define("three",[],function(){return 3}),
require(["one","two","three"],function(e,t,n){alert(e+t+n)}),define("main",function(){});
最后运行服务器,发现真的能alert出6!
例子2
就是在上面的例子里面改一下

其他变化如下:
three.js放到sub目录下,内容改成:
define(["./two"], function(a){
return 1 + a
})
one.js
define(["./two"], function(a){
return 1 + a
})
main.js改成
require(["one","sub/three"], function (one, three) {
console.log(one + three)
})
执行r.js,生成main-built.js为:
define("two", [], function() {
return 2
}), define("one", ["./two"], function(e) {
return 1 + e
}), define("sub/three", [], function() {
return 30
}), require(["one", "sub/three"], function(e, t) {
console.log(e + t)
}), define("main", function() {
});
下面合并前后的请求数比较


例子3, paths配置项的使用
目录结构改成这样,jquery自行到官网下载

main.js改成这样
require.config({
paths: {
jquery: "jquery/jquery-1.11.2"
}
})
require(["one", "sub/three","jquery"], function(one, three, $) {
console.log(one + three)
console.log($)
});
main.js改成这样
({
baseUrl: ".",
name: "main",
paths: {
jquery: "jquery/jquery-1.11.2"
},
out: "main-built.js"
})
然后执行node r.js -o build.js打包命令,生成的文件就可以用了。并且发现r.js有个非常智能的地方,如果把main.js中的require语句的依赖项中的jquery去掉,再执行打包,它会将jquery源码从main-built.js中去掉。
例子4, 让生产环境用的脚本放在另一个文件中
我们通常把我们自己工作的环境叫做发展环境, 上线的环境叫生产坏境,将它们分开是非常有好处的。我们把上面的目录复制一下,改一名字:

相对而言, 页面也改一下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>My App</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<script data-main="develop/main-built" src="develop/avalon.js"></script>
<!-- <script data-main="develop/main" src="develop/avalon.js"></script>-->
<!-- <script data-main="develop/main-built" src="develop/require.js"></script>-->
</head>
<body>
<h1>My App</h1>
</body>
</html>
打包的脚本build.js变成这样,
({
baseUrl: ".",
paths: {
jquery: "jquery/jquery-1.11.2"
},
dir: "../production",
name: "main"
})
对比一下,有了dir,就不能使用out配置项了,你在编译时它有非常明确的提示。执行node r.js -o build.js打包命令,你的项目变成这样了

既然目录变了,我们有两个办法,1自己修改或通过脚本修改index.html引用脚本的路径,2后端配置一下,对请求进行重定向,我们通常是使用后面一种。
例子5, shim配置项的使用
在例子4里面jquery目录添加一个jquery.aaa.js,内容如下:
jQuery.fn.aaa = function(){
alert("aaa")
}
main.js改成
require.config({
paths: {
jquery: "jquery/jquery-1.11.2",
aaa: "jquery/jquery.aaa"
},
shim: {
aaa: {
deps: ["jquery"],
exports: "jQuery"
}
}
})
require(["one", "sub/three", "aaa"], function(one, three, $) {
console.log(one + three)
console.log($.fn.aaa)
})
build.js也跟着改成
require.config({
paths: {
jquery: "jquery/jquery-1.11.2",
aaa: "jquery/jquery.aaa"
},
shim: {
aaa: {
deps: ["jquery"],
exports: "jQuery"
}
}
})
require(["one", "sub/three", "aaa"], function(one, three, $) {
console.log(one + three)
console.log($.fn.aaa)
})
然后执行node r.js -o build.js打包命令,生成的文件就可以用了。
如果大家还有更好的打包方式, 可以https://github.com/avalonjs/avalonjs.github.io/tree/master/zh/engineering,添加到这里,pull request给我
r.js打包的更多相关文章
- requirejs 使用实例r.js打包
在这里,请先看基础文章与相关技术文档: 安装: npm init npm install requirejs --save npm install jquery@1.11.1 --save 创建基本目 ...
- r.js打包注意事项 r.js打包 这个是配合require.js打包的
这个./代表的是当前文件的父目录....打包的资源一定要在这个父目录中下面才行,,,,一定一定,要放在这个目录一下才能被正确找到. 不然只是copy了一份一模一样的文件夹和文件过去,并不会处理压缩啥的 ...
- 转载 r.js打包经验
例子1 先是HTML页面 <!DOCTYPE html> <html> <head> <title>My App</tit ...
- requirejs r.js 打包报错paths fallback not supported in optimizer please provide a build config path override for jquery
错误原因: 改为:
- requirejs原理深究以及r.js和gulp的打包【转】
转自:http://blog.csdn.net/why_fly/article/details/75088378 requirejs原理 requirejs的用法和原理分析:https://githu ...
- requirejs 多页面,多js 打包代码,requirejs多对多打包【收藏】
这段代码来自 http://stackoverflow.com/questions/20583812/grunt-requirejs-optimizer-for-a-multi-app-project ...
- requirejs 多页面,多js 打包代码,requirejs多对多打包
这段代码来自 http://stackoverflow.com/questions/20583812/grunt-requirejs-optimizer-for-a-multi-app-project ...
- requireJS的优化工具 ---- r.js
requireJS是javascript的模块加载器,是基于AMD规范实现的. r.js是其提供的对模块进行打包和构建的一个工具 下载 r.js 创建r.js 的配置文件 build.js build ...
- 转: requirejs压缩打包r.js使用示例 2 (~~很详细的教程)
这一篇来认识下打包工具的paths参数,在入门一中 就介绍了require.config方法的paths参数.用来配置jquery模块的文件名(jQuery作为AMD模块时id为“jquery”, 但 ...
随机推荐
- tomcat和servlet关系
https://blog.csdn.net/weixin_30531261/article/details/78574410 图不错:https://www.cnblogs.com/fengli999 ...
- IE 10 如何设置支持CRM4 正常浏览
通过工具—> 选择兼容性视图 就可以了.具体如下图:
- 启动servlet报错:The servlets named [DemoServlet] and [main.java.com.wlf.demo.servlet.DemoServlet] are both mapped to the url-pattern [/hello] which is not permitted
先看具体错误日志: [2019-04-26 09:29:25,484] Artifact demo-servlet:war: Artifact is being deployed, please wa ...
- phper必知必会(二)
1.说说你对进程,线程以及协程的理解 进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础.进程是程序基本执行的实体.进程与进程之间是独立的,拥有完全独立的地址空间,进程的切换只发生在内 ...
- 用SqlConnectionStringBuilder修改连接超时时间
连接是通过参数传入,欲修改超时时间. SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(connStr); scsb.C ...
- You Arent Gonna Need It 理解
软件开发是一项无法驾驭全局的工作,其工作效率,工作精神都高度依赖需求反馈. 开发不存在需求的功能,实际上是除了要开发软件,还要构思需求,这样一正一反,严重消耗了脑力资源. 如果是自己开发软件,需求来自 ...
- Fatal error: Unable to find local grunt.
https://stackoverflow.com/questions/15483735/fatal-error-unable-to-find-local-grunt-when-running-gru ...
- fiddler抓包HTTPS请求
fiddler抓包HTTPS请求 标签: fiddlerhttps抓包 2016-03-29 21:24 23293人阅读 评论(2) 收藏 举报 分类: 不登高山不知天之高也(1) 版权声明:本 ...
- JAVA面向对象编程课程设计——网络版单机斗地主
一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...
- ALGO-3_蓝桥杯_算法训练_K好数(DP)
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = ,L = 2的时候,所有K好数为11...... 共7个 ...