使用requirejs實現模塊化編程


> 序言

- -# 公司大了,業務多了,前端代碼量也逐漸增大,我們漸漸的依賴js實現的交互越來越多,長期以來會導致我們的代碼維護越來越困難,所以依賴的插件也越來越多。。
比如這樣頁面中有大量的js外鏈引入。。

這么多的js 占用這么多的請求。。雖然放在頁面底部不影響頁面的正常顯示,但是過多的請求會給服務器帶來不小的壓力,同樣后期攻城師維護也不知道到底哪個js才是需要修改的那個了。。。。

那么下面引入正文 、、、、

如此多的js請求 。。。以及完全不相干的代碼、插件 我們所希望的是能有個東西將這些所有的js整理到1個js中 ,然后把一些較大的插件、較多代碼的js再分別做正常的引入。而這些文件的引入不在頁面里體現,以一個像配置文件的方式配置好引入這個配置文件到瀏覽器中執行,以減少服務器的請求次數,減少服務器壓力。
好吧,目前我所了解到的能夠實現我們的需求的工具有2個分別是:
1、Requirejs
2、Seajs

額。。。那么下面我們來講一下這個requirejs的基本使用。。。(至於為什么不說sea。。。聽說sea比require要難 ,所以。。出於對公司的項目能夠更加快捷的開發,我只好舍己為公司了。。。好吧。,我承認其實是我怕自己學不會。。。。)
咳咳。。。

接下來我們開始一起來學習requirejs。。。。。 
首先打開百度! 搜索requirejs官網 。。。好吧我告訴你們 
requirejs官網是:http://requirejs.org/
打開之后是這樣子的:

 

左側是導航 介紹requirejs 應該怎么調用等等。。。先看右邊 介紹的是require可以兼容的瀏覽器有 。。。。等等。。。
(還可以兼容到ie6 。。好棒,應該可以滿足絕大部分公司的變態需求了)

官方下載地址是:http://requirejs.org/docs/release/2.1.20/minified/require.js

額。。如果大家打不開官網或者覺得官網網速慢,可以下載我們公司的服務器地址下的require。。 
地址是:http://static.js.xywy.com/common/js/require.min.js

到15年8月21日我這使用的2.1.11版本

接下來我們需要做的是將require引入我們的頁面中。。

 

<script data-main="config" type="text/javascript" src="http://static.js.xywy.com/common/js/require.min.js"></script>

如此這般。。。我們來分析一下正常引入了個js文件 沒錯 那么問題來了。。
標簽中 data-main="config" 是????我們先把這個放在瀏覽器里執行一下 看看這段代碼都做了什么。,。

到此 。。我們可以看到 config 原來是個js 那么 data-main=”config” 引入了一個文件 
是的 沒錯 這就是require 幫我們做的 。。config 我打算把這個js叫做我們這個網頁的配置文件用它來控制其他文件的引用。。。而且在require的項目中,所有需要引入的文件都不要寫.js的后綴名哦。。因為requirejs 已經幫我們自動添加了.js后綴名 ,我們再自己添加會報錯(導致找不到文件)。

require配置:

require.config({
    path:{
        'jquery':'http://static.js.xywy.com/common/js/jqueryMin',
        'test':'./test',
        'banner':'/banner'
    }
});

require.config 就是配置require需要引進的文件 
path 參數為對象 代表需要引進來的js 可以是相對路徑,也可以是絕對路徑

require執行:

require(['jquery','test','banner'],function(){
    console.log($('h1').css('color','#f00'));
});

執行requirejs的require方法 他接受2個參數
第一個參數為數組 數組里的每一個值分別對應着上面require配置下path參數對應的鍵值
第二個參數為引入所需要的js的回調函數。

如果要引入的是一個框架或者是自己封裝的功能組件等。。可以在回調函數中調用其方法!。。
好吧 require 基本的使用就告一段落了。。。。。才剛剛開始!

> 總結

到目前為止 我們已經實現了一半我們的需求。。現在頁面中所有請求數量沒有發生改變(其實還增加了2個請求,一個配置文件,一個require。。不要怕。。等下會大幅度減少滴。。)。。但是我們已經可以做到將所有的js統一由一個配置文件(config.js)控制頁面中所有js模塊的引入!

下面我們解決最大的一個問題,就是將js合並減少服務器請求的問題 。。。 
我這邊是用的grunt來一步到位,完成壓縮與合並! (通過gulp也可以哦)

好吧 我們先安裝grunt的運行環境nodejs ,大概敘述一下nodejs的安裝過程吧。。百度搜索nodejs到官網點擊download下載對應着自己電腦的版本。。然后點擊安裝包直接一路next安裝完成即可。。(友情提示:最好不要更改nodejs的安裝目錄,如更改安裝目錄據說需要手動設置環境變量了) ,然后打開cmd命令行程序 輸入node -v 測試是否安裝成功 出現以下畫面輸出nodejs的版本號證明安裝成功:

好的,接下來我們來安裝grunt,首先在全局環境安裝grunt (在任何目錄下都可以)執行以下命令:

 

 npm install -g  grunt   -cli 

接下來進入到項目目錄下載grunt 以及下載grunt所需要用的壓縮、合並、等等插件,npm install xxxxxx即可 
具體插件看自己需求吧,下面我把我自己的grunt的pakeage.json文件貢獻出來大家僅供參考:

 {
      "name": "szy",
      "file": "file",
      "version": "0.0.1",
      "description": "szy",
      "license": "MIT",
      "devDependencies": {
        "grunt": "~0.4.1",    //grunt主程序
        "grunt-contrib-uglify": "~0.2.1",   //為壓縮js插件
        "grunt-contrib-requirejs": "~0.4.1",  //requirejs合並插件
      },
      "dependencies": {
        "express": "3.x",
        "grunt-css":  ">0.0.0",
        "grunt-contrib-cssmin":">0.0.0"    //壓縮css插件
      }
    }

如果使用鄙人的pakeage.json的話 直接將此文件拷貝到你的項目目錄然后在命令行執行 npm install 即可
出現以下畫面證明下載成功可以使用咯!

 

下載完成后我的項目目錄是這樣的:

 

node_modules是剛剛下載的一些插件。 
接下來們來創建grunt要執行的 Gruntfile.js文件

module.exports = function (grunt) {
    // 項目配置
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        requirejs:{
            compile:{
                options:{
                    name:'config',    //主文件名字
                    optimize:'uglify',   //指定壓縮工具類型  使用uglify工具壓縮
                    mainConfigFile:'./js/config.js',    //require 的主文件
                    out:'./src/all.js'            //壓縮后的文件
                    //其他無需指定  本插件會自動尋找require引進的所有文件
                }
            }
        }
    });
    // 加載提供"uglify"任務的插件
    grunt.loadNpmTasks('grunt-contrib-requirejs');

    // 默認任務
    grunt.registerTask('compile', ['requirejs']);

}

以上是我根據之前的項目目錄所做的配置,已經親測過,無問題,合並之后的文件會生成到我所設置的src文件夾中。。叫all.js 如果對應的src目錄不存在 grunt會親自創建該目錄,所以小伙伴們不用擔心哦。。另外提醒大家一下。。 如上面的例子,我引入了jquery插件用的http方式引入的。可最后的請求是這樣的:

 

由此可見 ,。合並后的請求 jquery 並沒有合並到一起! 請大家注意哦!

另外大家有什么問題,歡迎評論。。第一次發這種文章。。有說錯的地方,歡迎指正!。。大家一起交流! 
關於grunt的基本使用方法和gulp來實現合並壓縮requirejs的方法。。敬請關注我的下一篇文章。。。嘻嘻。。。

 

歡迎大家關注我的新浪微博:@前端的傻小子

本文作者:前端的傻小子  

原文鏈接:http://segmentfault.com/a/1190000003409854

可自由轉載、引用,但需署名作者且注明文章出處。

 

 


免責聲明!

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



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