(转)requirejs:杏仁的优化(almond)
使用场景
什么情况下需要使用 almond 呢?假设你手头有个基于requirejs的小项目,所有业务代码加起来就几十K(压缩后可能更小).出于性能优化的考虑,你可能在想:如果能够去掉requirejs的依赖就好了,毕竟,gzip后的requirejs还有大概20k(2.1.6版本)。
almond就是为了这个目的而诞生的,开发过程,你可以照常使用requirejs来管理你的依赖,而到了打包上线阶段,替换成almond就行了。gzip后的almond只有大约1k,优化幅度相当大。
例子:未使用almond
这一小节主要举个 requirejs+r.js 打包的例子,下一小杰会在本小节的基础上,通过 almond 进行进一步的优化。代码很简单,扫一下就可以了
目录结构如下:
demo.html
build.js
js/
js/main.js
js/cookie.js
js/util.js
demo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
</head>
<body>
<h1>简单的requirejs例子 - almond</h1>
<script type="text/javascript" src="js/require.js" data-main="js/main-built.js"></script>
<!-- <script type="text/javascript" src="js/main-almond-built.js"></script> -->
</body>
</html>
js/main.js
requirejs.config({
baseUrl: 'js'
});
require(['cookie', 'util'], function(Cookie, Util){
Cookie.say('hello');
Util.say('hello');
});
js/cookie.js
define([], function(){
return {
say: function(msg){
alert('cookie: '+msg);
}
};
});
js/util.js
define([], function(){
return {
say: function(msg){
alert('util: '+msg);
}
};
});
用r.js打包
首先,在 build.js 里声明打包的配置
({
baseUrl: "js",
name: "main",
optimize: "none",
out: "js/main-built.js"
})
然后,下载打包工具 r.js
npm install -g requirejs
最后,通过 r.js 打包
r.js -o build.js
恭喜!可以看到 js 目录下生成了打包后的文件 main-built.js
js/main-built.js
define('cookie',[], function(){
return {
say: function(msg){
alert('cookie: '+msg);
}
};
});
define('util',[], function(){
return {
say: function(msg){
alert('util: '+msg);
}
};
});
requirejs.config({
baseUrl: 'js'
});
require(['cookie', 'util'], function(Cookie, Util){
Cookie.say('hello');
Util.say('hello');
});
define("main", function(){});
运行demo
为了检验打包后的结果是运行的,我们需要到浏览器里验证一下。首先我们要把 demo.html 里的资源引用修改下
<script type="text/javascript" src="js/require.js" data-main="js/main-built.js"></script>
在浏览器里打开 demo.html ,看到下面的弹窗,搞定
例子:使用了almond
我们看到,上面的例子打包后生成了 main-built.js ,gzip后看下文件多大
gzip main-built.js
可以看到只有174B,这种情况下,在页面中引用requirejs有点不划算,这个时候我们就要引入almond了
-rw-r--r-- 1 user staff 174B 4 20 22:03 main-built.js.gz
很简单,首先 下载almond ,并放置到 js 目录下
然后,运行下面命令,通过 r.js + almond 生成打包后的文件 main-almond-built.js
r.js -o baseUrl=js name=almond include=main out=js/main-almond-built.js wrap=true optimize=none
js/main-almond-built.js
/**
* @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/almond for details
*/
// almond的代码篇幅略长,这里略过...
define("cookie",[],function(){return{say:function(e){alert("cookie: "+e)}}}),define("util",[],function(){return{say:function(e){alert("util: "+e)}}}),requirejs.config({baseUrl:"js"}),require(["cookie","util"],function(e,t){e.say("hello"),t.say("hello")}),define("main",function(){});
同样,在修改修改 main.js 的链接后,在浏览器里访问 demo.html ,done!
<script type="text/javascript" src="js/main-almond-built.js"></script>
看下gzip后的 main-almond-built.js 多大,只有1.6k!
-rw-r--r-- 1 user staff 1.6K 4 20 22:34 main-almond-built.js.gz
写在后面
本文简单介绍了下如何通过 almond 对依赖requirejs的项目进行进一步的优化。当然, almond 也存在着一些限制,比如无法动态加载模块、只能将模块打包成一个文件等,具体的可以 参考这里 。是否在打包阶段使用 almond 替代 requirejs ,得看具体场景,这里就不展开,后面有时间再简单介绍下。 requirejs:杏仁的优化(almond)
(转)requirejs:杏仁的优化(almond)的更多相关文章
- requirejs:杏仁的优化(almond)
这里只是调侃一下,“杏仁”其实指的是almond,requirejs作者的另一个开源项目,它的定位是作为requirejs的一个替代品. 本文概要: 1. 使用场景 2. 打包例子:未使用almond ...
- requirejs:性能优化-及早并行加载
为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...
- Grunt 之 RequireJS
RequireJs 提供了一个打包工具 r.js,可以将相关的模块打包为一个文件.相关说明:http://www.requirejs.org/docs/optimization.html 将相关的脚本 ...
- 关于web优化(一)
我们所说的web,无非就是html,css(web font, image),JavaScript. HTML优化建议: 1. 尽量不要用table进行布局. 2. 尽量用最新的带有语义的h5标签,这 ...
- RequireJS - 快速指南
原文: https://www.tutorialspoint.com/requirejs/requirejs_quick_guide.htm RequireJS - 概述 RequireJS是一个Ja ...
- 如何利用Require.Js管理多页面站点文件(译)
英文版地址 最近使用 Require.Js 的时候我发现它确实是一个改善代码管理的一个好方法.我以前发表Backbone类的文章时曾提到过 Require,但此前,我从未在传统的多页面网站内使用到 R ...
- 转:Cesium 和 Webpack
原文地址:https://www.jianshu.com/p/85917bcc023f 注意:webpack 和 webpack-cli 的安装参考 https://www.cnblogs.com/m ...
- Cesium官方教程13--Cesium和Webpack
原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript ...
- almond进一步优化requirejs
这里只是调侃一下,“杏仁”其实指的是almond,requirejs作者的另一个开源项目,它的定位是作为requirejs的一个替代品. 使用场景 什么情况下需要使用almond呢?假设你手头有个基于 ...
随机推荐
- Hostker云主机
Orz现在我的博客使用Hostker主机了,地址:http://wnjxyk.cn/ 速度一下子快了很多! Hostker真的是很便宜很好用的主机呢!大家可以去试一下! 注册时填写了有效邀请码的新用户 ...
- cluster maintain manager Software群集管理软件
1,ocfs2 2,crmsh(cluster management shell,)==crm shell [pacemaker OpenAIS,heartbeat,corosync,crmsh] 3 ...
- JavaFx初探
由于项目的须要,实在是没有办法了,试了非常多种方案(RCP,SWT,Flex,Smartinvoke...),终于还是决定開始研究JavaFx...为了给用户更好地体验我们的"智能家居&qu ...
- Android杂谈--ListView之BaseAdapter的使用
话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...
- xcode initWithCoder\awakeFromNib\layoutSubviews
控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...
- Cocos2d-x基础篇C++
1.C++类和对象 类的公有成员可以使用成员访问运算符(.)访问. (::)是范围解析运算符.调用成员函数是在对象上使用(.)运算符. 2.C++继承(C++中父类称为基类,子类称为派生类) clas ...
- UVA1471( LIS变形)
这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度. 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记 ...
- 【Kill】两条Linux命令彻底杀死Oracle
今天编写的两条极具杀伤力的命令,它可以瞬间将Oracle杀死在无形之中.后面我将给出简单注释并展示一下它的威力.$ ps -ef |grep $ORACLE_SID|grep -v grep|awk ...
- android 播放assets文件里视频文件的问题
今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件. 因为之前写webview加载assets文件夹时,是这样写的: webView = new WebView(this); w ...
- AssetManager中的路径参数不能包含"assets/"
String path = “music/bg.mp3”: //正确的参数 //String path = “assets/music/bg.mp3”: //错误的参数 //String path = ...