zoukankan      html  css  js  c++  java
  • requirejs:杏仁的优化(almond)

    requirejs:杏仁的优化(almond)

    这里只是调侃一下,“杏仁”其实指的是almond,requirejs作者的另一个开源项目,它的定位是作为requirejs的一个替代品。

    使用场景

    什么情况下需要使用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>
    <metacharset="utf-8">
    <title>demo</title>
    </head>
    <body>
    <h1>简单的requirejs例子 - almond</h1>
    <scripttype="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里的资源引用修改下

    <scripttype="text/javascript"src="js/require.js"data-main="js/main-built.js"></script>
    

    在浏览器里打开demo.html,看到下面的弹窗,搞定

    Alt text

    例子:使用了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!

    <scripttype="text/javascript"src="js/main-almond-built.js"></script>
    

    Alt text

    看下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,得看具体场景,这里就不展开,后面有时间再简单介绍下。

    demo下载

     
    标签: requirejsalmond
  • 相关阅读:
    docker容器跑tomcat遇到的坑
    PCL 编程多个点云合成
    PCL 常用小知识
    PCL点云库中的坐标系(CoordinateSystem)
    Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建
    Windows cmd 快捷操作
    #Pragma Pack与内存分配
    线段上的整数点个数
    基于PCL绘制模型并渲染
    rosbag数据记录及转换图片、视频
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3677476.html
Copyright © 2011-2022 走看看