require.js入門


    小穎目前所在的公司在用require.js,小穎一直說要寫個小demo,今天抽空把自己寫的小demo分享出來,希望對初學者有一些幫助,嘻嘻

    學習資料:

                 CSDN上的一篇文章:使用RequireJS優化Web應用前端

                 阮一峰老師的網絡日志:Javascript模塊化編程(三):require.js的用法

                 卷柏的花期的隨筆:requireJS 從概念到實戰

    demo目錄:

                                       

    小穎就不在自己博客里賣弄了,像:為什么要用require.js?、require.js的加載、主模塊的寫法等小穎就不在我的博客里面寫了,詳細的大家請移步到:阮一峰老師的網絡日志:Javascript模塊化編程(三):require.js的用法中去看看。小穎就主要給大家分享下小穎理解的  require.js模塊的加載和AMD模塊的寫法  

在看小穎寫的demo之前大家先看下阮一峰老師的網絡日志:Javascript模塊化編程(三):require.js的用法中模塊的加載和AMD模塊的寫法的詳解:

模塊的加載:

    上一節最后的示例中,主模塊的依賴模塊是['jquery', 'underscore', 'backbone']。默認情況下,require.js假定這三個模塊與main.js在同一個目錄,文件名分別為jquery.js,underscore.js和backbone.js,然后自動加載。

    使用require.config()方法,我們可以對模塊的加載行為進行自定義。require.config()就寫在主模塊(main.js)的頭部。參數就是一個對象,這個對象的paths屬性指定各個模塊的加載路徑。

require.config({    
    paths: {      
        "jquery": "jquery.min",
        "underscore": "underscore.min",
        "backbone": "backbone.min"    
    }  
});

  上面的代碼給出了三個模塊的文件名,路徑默認與main.js在同一個目錄(js子目錄)。如果這些模塊在其他目錄,比如js/lib目錄,則有兩種寫法。一種是逐一指定路徑。

require.config({    
    paths: {      
        "jquery": "lib/jquery.min",
        "underscore": "lib/underscore.min",
        "backbone": "lib/backbone.min"    
    }  
});

另一種則是直接改變基目錄(baseUrl)。

require.config({
    baseUrl: "js/lib",
    paths: {
      "jquery": "jquery.min",
      "underscore": "underscore.min",
      "backbone": "backbone.min"
    }
});

如果某個模塊在另一台主機上,也可以直接指定它的網址,比如:

require.config({
    paths: {
      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
    }
});

require.js要求,每個模塊是一個單獨的js文件。這樣的話,如果加載多個模塊,就會發出多次HTTP請求,會影響網頁的加載速度。因此,require.js提供了一個優化工具,當模塊部署完畢以后,可以用這個工具將多個模塊合並在一個文件中,減少HTTP請求數。

AMD模塊的寫法

     require.js加載的模塊,采用AMD規范。也就是說,模塊必須按照AMD的規定來寫。

     具體來說,就是模塊必須采用特定的define()函數來定義。如果一個模塊不依賴其他模塊,那么可以直接定義在define()函數之中。

     假定現在有一個math.js文件,它定義了一個math模塊。那么,math.js就要這樣寫:

  // math.js
  define(function (){
    var add = function (x,y){
      return x+y;
    };
    return {
      add: add
    };
  });

加載方法如下:

  // main.js
  require(['math'], function (math){
    alert(math.add(1,1));
  });

如果這個模塊還依賴其他模塊,那么define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。

  define(['myLib'], function(myLib){
    function foo(){
      myLib.doSomething();
    }
    return {
      foo : foo
    };
  });

當require()函數加載上面這個模塊的時候,就會先加載myLib.js文件。

大家再來看看小穎寫的代碼:

1.index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>require.js小demo</title>
    <link rel="stylesheet" href="css/bootstrap.css">
    <link rel="stylesheet" href="css/base.css">
    <!-- 加載require.js文件,也可能造成網頁失去響應。解決辦法有兩個,一個是把它放在網頁底部加載,另一個是寫成下面這樣: -->
    <!-- <script src="js/require.js" defer async="true" ></script> -->
    <!--async屬性表明這個文件需要異步加載,避免網頁失去響應。IE不支持這個屬性,只支持defer,所以把defer也寫上。  -->
    <!-- 加載require.js以后,下一步就要加載我們自己的代碼了。假定我們自己的代碼文件是main.js,也放在js目錄下面。只需要寫成下面這樣就行了: -->
    <!-- <script src="js/require.js" data-main="src/main.js"></script> -->
    <script defer async="true" data-main="app" src="js/require.js"></script>
</head>

<body>
    <div class="div-index">
        <div class="index-content">
            <form class="form-horizontal">
                <div class="form-group">
                    <label class="col-sm-2 col-xs-2 control-label">Username</label>
                    <div class="col-sm-5 col-xs-5">
                        <input type="text" class="form-control" id="inputUserName" placeholder="Username">
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-sm-2 col-xs-2 control-label">Password</label>
                    <div class="col-sm-5 col-xs-2">
                        <input type="password" class="form-control" id="inputPassword" placeholder="Password">
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-5 col-xs-5">
                        <button type="submit" class="btn btn-default" id='logBtn'>Sign in</button>
                    </div>
                </div>
            </form>
        </div>
    </div>

</body>

</html>

2.app.js

requirejs.config({
    baseUrl: 'js/lib',
    paths: {
        jquery: '../jquery'
    }
});
require(['main', 'jquery'], function(mains, jq) {
    jq('#logBtn').click(function() {
        var logon = mains.logon(jq('#logBtn').val(), jq('#inputPassword').val());
        if (logon) {
            alert('登陸成功!');
        } else {
            alert('登陸失敗!');
        }
    });
});

3.js/lib下的main.js

define(function() {
    var logon = function(userName, password) {
        if (userName === '小穎' && password === '1028') {
            return true;
        } else {
            return false;
        }
    };
    return {
        logon: logon
    }
});

      1.小穎的基目錄是:baseUrl: 'js/lib',大家看了阮一峰分享的日志應該對   baseUrl   也有所了解,小穎理解的  baseUrl  就是 如果你要調用很多一個目錄下的js,那么你就將這個目錄定位基目錄,

      2.paths:如果你在paths中引了你要用的js,那么后面你要用的時候只直接調用就好了,比如上面的app.js中,小穎在paths中已經引了jquery.js,所以在用jquery時:

require(['main', 'jquery'], function(mains, jq) {
    jq('#logBtn').click(function() {
        var logon = mains.logon(jq('#logBtn').val(), jq('#inputPassword').val());
        if (logon) {
            alert('登陸成功!');
        } else {
            alert('登陸失敗!');
        }
    });
});

小穎用AMD規范寫法,加載了main.js和jquery.js,並在回調函數中用  mains jq 代表他們。如果上面的示例不夠明了,大家看看下面這個:

app.js

requirejs.config({
    baseUrl: 'js/lib',
    paths: {
        jquery: '../jquery'
    }
});
require(['main'], function(mains) {
  console.log('調用main.js');
});

 main.js

define(['jquery'], function(jq) {
    jq('#logBtn').click(function() {
        var _logon = logon(jq('#inputUserName').val(), jq('#inputPassword').val());
        if (_logon) {
            alert('登陸成功!');
        } else {
            alert('登陸失敗!');
        }
    });
    var logon = function(userName, password) {
        if (userName === '小穎' && password === '1028') {
            return true;
        } else {
            return false;
        }
    };
    return {
        logon: logon
    }
});

如果只定義了基目錄而沒有在paths中引用jquery,那么當需要用jquery的時候,需要通過調用jquery的目錄下的jquery.js,才能調用,不能直接調用:

app.js

requirejs.config({
    baseUrl: 'js/lib',
    paths: {
        // jquery: '../jquery'
    }
});
require(['main'], function(mains) {
  console.log('調用main.js');
});

main.js

define(['../jquery'], function() {
    $('#logBtn').click(function() {
        var _logon = logon($('#inputUserName').val(), $('#inputPassword').val());
        if (_logon) {
            alert('登陸成功!');
        } else {
            alert('登陸失敗!');
        }
    });
    var logon = function(userName, password) {
        if (userName === '小穎' && password === '1028') {
            return true;
        } else {
            return false;
        }
    };
    return {
        logon: logon
    }
});

 好啦,小穎的分享到這里就結束啦,希望對大家有所幫助,明天就是禮拜五啦,哈哈哈哈,后天就是周末啦,提前祝大家周末愉快哦!!!嘻嘻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM