前端js和css的壓縮合并之grunt

關(guān)于css和js壓縮和合并的方法史煎,記得我在前端面試題目中有寫道。方法很多驳糯,今天主要介紹grunt方法篇梭。

使用前提

grunt是基于node的,要在你電腦上使用grunt酝枢,電腦上必須已安裝node環(huán)境恬偷。具體node環(huán)境的安裝和搭建。centos請(qǐng)看帘睦,windows安裝相對(duì)簡(jiǎn)單袍患,下載安裝包安裝就可以了。關(guān)于mac的安裝竣付,后面有時(shí)間在詳細(xì)介紹诡延。

一、新建package.json

package.json放在根目錄下古胆,它包含了該項(xiàng)目的一些元信息肆良,如項(xiàng)目名稱、描述逸绎、版本號(hào)惹恃,插件等。

{
  "name": "haorooms.com",
  "version": "v0.1.0",
  "devDependencies": {
    "grunt": "~0.4.5",
    "grunt-contrib-jshint": "~0.10.0",
    "grunt-contrib-nodeunit": "~0.4.1",
    "grunt-contrib-uglify": "~0.5.0",
    "grunt-contrib-concat": "~0.5.1",
    "grunt-contrib-cssmin": "~0.12.3",
    "grunt-htmlhint": "~0.9.2"
  }
}

grunt-contrib-jshint(js語法檢查)棺牧、grunt-contrib-concat(js合并)巫糙、grunt-contrib-uglify(采用UglifyJS壓縮js)、grunt-contrib-cssmin(Css壓縮合并)陨帆、grunt-htmlhint(html語法驗(yàn)查)曲秉,以上都是常用的插件采蚀。
更多插件疲牵,請(qǐng)?jiān)L問:http://gruntjs.com/plugins

二承二、插件安裝

安裝:uglify

npm install grunt-contrib-uglify

安裝concat

npm install grunt-contrib-concat

安裝:cssmin

npm install grunt-contrib-cssmin

插件安裝完成后,查看根目錄纲爸,會(huì)發(fā)現(xiàn)node_modules目錄亥鸠,包含了相應(yīng)的插件目錄。

三识啦、新建Gruntfile.js

Gruntfile.js由以下內(nèi)容組成
1负蚊、wrapper函數(shù),結(jié)構(gòu)如下颓哮,這是Node.js的典型寫法家妆,使用exports公開API

 module.exports = function(grunt) { 
    // Do grunt-related things in here 
};

2、項(xiàng)目和任務(wù)配置
3冕茅、載入grunt插件和任務(wù)
4伤极、定制執(zhí)行任務(wù)
例如:

module.exports = function(grunt) {
 //配置參數(shù)
 grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concat: {
        options: {
            separator: ';',
            stripBanners: true
        },
        dist: {
            src: [
                "js/config.js",
                "js/smeite.js",
                "js/index.js"
            ],
            dest: "assets/js/default.js"
        }
    },
    uglify: {
        options: {
        },
        dist: {
            files: {
                'assets/js/default.min.js': 'assets/js/default.js'
            }
        }
    },
    cssmin: {
        options: {
            keepSpecialComments: 0
        },
        compress: {
            files: {
                'assets/css/default.css': [
                    "css/global.css",
                    "css/pops.css",
                    "css/index.css"
                ]
            }
        }
    }
 });

 //載入concat和uglify插件,分別對(duì)于合并和壓縮
 grunt.loadNpmTasks('grunt-contrib-concat');
 grunt.loadNpmTasks('grunt-contrib-uglify');
 grunt.loadNpmTasks('grunt-contrib-cssmin');

 //注冊(cè)任務(wù)
 grunt.registerTask('default', ['concat', 'uglify', 'cssmin']);
}

也可以單獨(dú)壓縮js和css姨伤,不進(jìn)行合并哨坪,例如:

module.exports = function (grunt) {

    // 構(gòu)建任務(wù)配置
    grunt.initConfig({

        //讀取package.json的內(nèi)容,形成個(gè)json數(shù)據(jù)
        pkg: grunt.file.readJSON('package.json'),

        //壓縮js
        uglify: {
            //文件頭部輸出信息
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
            },
            my_target: {
                files: [
                    {
                        expand: true,
                        //相對(duì)路徑
                        cwd: 'js/',
                        src: '*.js',
                       //src: ['**/*.js', '!**/*.min.js'],  //不包含某個(gè)js,某個(gè)文件夾下的js
                        dest: 'dest/js/',
                        rename: function (dest, src) {  
                                  var folder = src.substring(0, src.lastIndexOf('/'));  
                                  var filename = src.substring(src.lastIndexOf('/'), src.length);  
                                  //  var filename=src;  
                                  filename = filename.substring(0, filename.lastIndexOf('.'));  
                                  var fileresult=dest + folder + filename + '.min.js';  
                                  grunt.log.writeln("現(xiàn)處理文件:"+src+"  處理后文件:"+fileresult);  

                                  return fileresult;  
                                  //return  filename + '.min.js';  
                              } 
                    }
                ]
            }
        },

        //壓縮css
        cssmin: {
            //文件頭部輸出信息
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
                //美化代碼
                beautify: {
                    //中文ascii化乍楚,非常有用当编!防止中文亂碼的神配置
                    ascii_only: true
                }
            },
            my_target: {
                files: [
                    {
                        expand: true,
                        //相對(duì)路徑
                        cwd: 'css/',
                        src: '*.css',
                        dest: 'dest/css/',
                        rename: function (dest, src) {  
                                var folder = src.substring(0, src.lastIndexOf('/'));  
                                var filename = src.substring(src.lastIndexOf('/'), src.length);  
                                //  var filename=src;  
                                filename = filename.substring(0, filename.lastIndexOf('.'));  
                                var fileresult=dest + folder + filename + '.min.css';  
                                grunt.log.writeln("現(xiàn)處理文件:"+src+"  處理后文件:"+fileresult);  

                                return fileresult;  
                              //return  filename + '.min.js';
                                }
                    }
                ]
            }
        }

    });

    // 加載指定插件任務(wù)
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');

    // 默認(rèn)執(zhí)行的任務(wù)
    grunt.registerTask('default', ['uglify', 'cssmin']);

};

grunt api文檔:http://gruntjs.com/api/grunt
grunt.initConfig方法
用于模塊配置,它接受一個(gè)對(duì)象作為參數(shù)徒溪。該對(duì)象的成員與使用的同名模塊一一對(duì)應(yīng)忿偷。
每個(gè)目標(biāo)的具體設(shè)置,需要參考該模板的文檔臊泌。就cssmin來講鲤桥,minify目標(biāo)的參數(shù)具體含義如下:
expand:如果設(shè)為true,就表示下面文件名的占位符(即*號(hào))都要擴(kuò)展成具體的文件名缺虐。
cwd:需要處理的文件(input)所在的目錄芜壁。
src:表示需要處理的文件。如果采用數(shù)組形式高氮,數(shù)組的每一項(xiàng)就是一個(gè)文件名慧妄,可以使用通配符。
dest:表示處理后的文件名或所在目錄剪芍。
ext:表示處理后的文件后綴名塞淹。
grunt常用函數(shù)說明:
grunt.initConfig:定義各種模塊的參數(shù),每一個(gè)成員項(xiàng)對(duì)應(yīng)一個(gè)同名模塊罪裹。
grunt.loadNpmTasks:加載完成任務(wù)所需的模塊饱普。
grunt.registerTask:定義具體的任務(wù)运挫。第一個(gè)參數(shù)為任務(wù)名,第二個(gè)參數(shù)是一個(gè)數(shù)組套耕, 表示該任務(wù)需要依次使用的模塊谁帕。

命令行執(zhí)行g(shù)runt任務(wù)

進(jìn)入到項(xiàng)目根目錄,敲:

grunt

就會(huì)按Gruntfile配置的文件進(jìn)行壓縮合并冯袍。
也可以單獨(dú)執(zhí)行匈挖,例執(zhí)行js壓縮命令:

grunt uglify

css壓縮命令:

grunt cssmin

視頻教程

視頻教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市康愤,隨后出現(xiàn)的幾起案子儡循,更是在濱河造成了極大的恐慌,老刑警劉巖征冷,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件择膝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡检激,警方通過查閱死者的電腦和手機(jī)肴捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呵扛,“玉大人每庆,你說我怎么就攤上這事〗翊” “怎么了缤灵?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蓝晒。 經(jīng)常有香客問我腮出,道長(zhǎng),這世上最難降的妖魔是什么芝薇? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任胚嘲,我火速辦了婚禮,結(jié)果婚禮上洛二,老公的妹妹穿的比我還像新娘馋劈。我一直安慰自己,他們只是感情好晾嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布妓雾。 她就那樣靜靜地躺著,像睡著了一般垒迂。 火紅的嫁衣襯著肌膚如雪械姻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天机断,我揣著相機(jī)與錄音楷拳,去河邊找鬼绣夺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欢揖,可吹牛的內(nèi)容都是我干的陶耍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼浸颓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼物臂!你這毒婦竟也來了旺拉?” 一聲冷哼從身側(cè)響起产上,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛾狗,沒想到半個(gè)月后晋涣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沉桌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谢鹊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留凭。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佃扼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔼夜,到底是詐尸還是另有隱情兼耀,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布求冷,位于F島的核電站瘤运,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匠题。R本人自食惡果不足惜拯坟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韭山。 院中可真熱鬧郁季,春花似錦、人聲如沸钱磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽续搀。三九已至塞琼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禁舷,已是汗流浹背彪杉。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工毅往, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人派近。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓攀唯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親渴丸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侯嘀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 快速入門 Grunt和 Grunt 插件是通過 npm 安裝并管理的,npm是 Node.js 的包管理器谱轨。 在安...
    angelwgh閱讀 1,097評(píng)論 0 0
  • gulpjs是一個(gè)前端構(gòu)建工具戒幔,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)土童,API也非常簡(jiǎn)單诗茎,學(xué)...
    小裁縫sun閱讀 921評(píng)論 0 3
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,166評(píng)論 40 247
  • grunt gulp grunt: 壓縮代碼,合并代碼献汗,檢測(cè)代碼書寫規(guī)范... 前端自動(dòng)化工具 構(gòu)建項(xiàng)目 官網(wǎng):h...
    嘬煙盒的程序員閱讀 393評(píng)論 3 4
  • :六點(diǎn)鐘就起來了敢订,沒辦法,在外面睡的樓主認(rèn)床罢吃。傷感楚午,睡都睡不好。 去熊貓基地尿招,做了一個(gè)多小時(shí)的車矾柜,終于八點(diǎn)多趕到了...
    西瓜西瓜FL閱讀 179評(píng)論 0 1