如何利用Grunt生成對應的Source Map檔案,線上程式碼壓縮使用chrome瀏覽器便於調式

龍恩0707發表於2014-09-06

如何利用Grunt生成對應的Source Map檔案,線上程式碼壓縮使用chrome瀏覽器便於調式

    首先我們來說說為何要生成sourceMap檔案呢?簡單的說,sourceMap是為了壓縮後的程式碼調式提供方便,比如線上的JS檔案已經壓縮了,但是線上比如說有bug,但是程式碼已經是壓縮後的,對於開發並不好調式,所以想生存一個對應的Map檔案,然後使用chrome瀏覽器在原始檔未壓縮的JS檔案下調式。

  那麼Map檔案到底是什麼呢?簡單的來講它就是記錄資訊,記錄一些為壓縮之前的js檔案的位置,及壓縮後的檔案對應未壓縮之前的檔案,對應第幾行第幾列的那些程式碼!

  在講解使用grunt生存Map檔案之前,我們還是來簡單複習下grunt如何合併及壓縮程式碼,對於grunt我們並不陌生,之前有幾篇文章我們也講過如何使用grunt 但是我們這邊還是一步一步先來講解下grunt合併,壓縮及生成Map檔案,及在chrome瀏覽器下如何調式程式碼的整個過程吧,也更使初學者更容易理解及掌握!

  Grunt是一套前端自動化工具,基於nodeJS基礎之上,對於我們前端一般用於以下幾點:

  1. 壓縮JS或者CSS檔案。

  2. 合併JS或者CSS檔案。

1:Grunt是基於nodeJS,所以未安裝nodeJS,先需要安裝nodeJS。

     1.下載安裝檔案:下載地址:http://www.nodejs.org/download/如下:

      

根據作業系統的多少位 下載那個版本。下載完成後,雙擊:

執行相應的安裝,完成後,在終端命令下,做如下操作:

Node 和 npm的版本號,說明都已經安裝成功了(注:新版本的node安裝檔案已經包含了npm,所以現在只需要安裝這個node版本的檔案就ok)。

2. Grunt安裝:客戶端安裝命令npm install -g grunt-cli (全域性安裝)

如上:安裝已完成!

Demo實列如下:

假如有如下這麼一個專案檔案,如下:

 一:如何壓縮檔案?(主要使用外掛grunt-contrib-uglify)

     1.package.json檔案

      如果專案根目錄沒有package.json檔案,我們可以建立一個(或者使用命令 npm init),在這裡我們手動建立一個。這個檔案主要用來儲存npm模組的依賴項,如下          

      package.json程式碼如下:

{

  "name": "demo",

  "version": "0.1.0",

  "description": "demo",

  "license": "MIT",

  "devDependencies": {

    "grunt": "~0.4.1",

    "grunt-contrib-jshint": "~0.6.3",

    "grunt-contrib-uglify": " ~0.5.1",

    "grunt-contrib-clean": "~0.5.0"

  }

}

接著我們進入根目錄直接執行npm install就能提取依賴項。

如下已經生成了檔案:

Gruntfile.js

  如果專案的根目錄沒有Gruntfile.js,我們可以手動建立一個,它一般做以下事情。

  1. 讀取package.json資訊。
  2. 外掛載入、註冊任務,執行任務.

Gruntfile.js資訊如下

module.exports = function (grunt) {

       // 專案配置

       grunt.initConfig({

           pkg: grunt.file.readJSON('package.json'),

           uglify: {

               build: {

                  src: 'src/*.js',

                  dest: 'dest/dest.min.js'

              }

          }

    });

      // 載入提供"uglify"任務的外掛

     grunt.loadNpmTasks('grunt-contrib-uglify');

     // 預設任務

     grunt.registerTask('default', ['uglify']);

}

上面的含義是指:把所有src下面的js檔案壓縮到dest檔案下的dest.min.js檔案。

在根目錄下執行grunt 就可以生成,如下:

二:如何對檔案合併?

還是以上面的專案檔案為例,在package.json增加一項 "grunt-contrib-concat": "~0.3.0"

 即可,然後在專案根目錄再執行 npm install 如下:

即可把合併外掛(grunt-contrib-concat)新增進來。如下:

接著我們可以在Gruntfile.js增加concat任務配置,這邊為了綜合演示合併及壓縮,所以一起先合併,再壓縮了。程式碼如下:
module.exports = function (grunt) {
  // 專案配置
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
     concat: {
      options: {
        separator: ';'
      },
      dist: {
        src: 'src/*.js',
        dest: 'dest/dest.js'
      }
    },
     uglify: {
      build: {
        src: 'dest/dest.js',
        dest: 'dest/dest.min.js'
      }
    }
  });
  // 載入提供"uglify"任務的外掛
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-concat');
  // 預設任務
  grunt.registerTask('default', ['concat', 'uglify']);
}
上面程式碼的含義是:先合併src目錄下所有的檔案到dest目錄下的dest.js裡面去,接著對dest.js檔案進行壓縮,生成dest.min.js檔案,如下所示:

三:壓縮src下的所有JS到dest目錄下生成,可以如下配置:

module.exports = function (grunt) {

  grunt.initConfig({

    uglify: {

      my_target: {

        files: [{

          expand: true,

          cwd: 'src',

          src: '*.js',

          dest: 'dest'

        }]

      }

    }

  });

  grunt.loadNpmTasks('grunt-contrib-uglify');

  // 預設任務

  grunt.registerTask('default', ['uglify']);

}

執行grunt,即可生成如下:

上面的意思是指把src所有的js,在dest目錄下生成且壓縮。

以上是基本知識點,好了,下面我們來回到主題,壓縮JS後,如何來生成對應的map檔案。

還是我之前的專案gruntTest。

Package.json還是之前一樣的,如下程式碼:

{

  "name": "demo",

  "version": "0.1.0",

  "description": "demo",

  "license": "MIT",

  "devDependencies": {

    "grunt": "~0.4.1",

    "grunt-contrib-jshint": "~0.6.3",

    "grunt-contrib-uglify": "~0.5.1",

    "grunt-contrib-concat": "~0.3.0",

    "grunt-contrib-clean": "~0.5.0"

  }

}

下面我們只要在Gruntfile.js配置成如下即可。

module.exports = function (grunt) {

    // 構建任務配置

    grunt.initConfig({

        //讀取package.json的內容,形成json資料

        pkg: grunt.file.readJSON('package.json'),

     // 對build目錄進行清理

        clean: {

            build: {

                src: 'dest/*'

         }

        },

     // 合併所有的JS

     concat:{

         dist: {

             src: 'src/*.js',

             dest: 'dest/dest.js'

         }

     },

     // 壓縮所有js並生成source map

        uglify: {

            "my_target": {

                options: {

                    sourceMap: true

                },

                files: [

                    // 可以直接作用於資料夾下所有檔案

                    {

                        expand: true,

                        cwd: 'dest/',

                        src: ['dest.js'],

                        // 輸出和輸入在同一目錄

                        dest: 'dest/',

                        ext: '.min.js'

                    }

                ]

            }

        }

    });


    // 載入指定外掛任務

    grunt.loadNpmTasks('grunt-contrib-uglify');

   grunt.loadNpmTasks('grunt-contrib-clean');

   grunt.loadNpmTasks('grunt-contrib-concat');

    // 預設執行的任務

    grunt.registerTask('default', ['clean','concat','uglify']);

};

上面的程式碼的意思是:對src下的所有JS檔案 先合併後 在dest目錄下生成dest.js的合併檔案,接著對dest.js檔案在同一目錄下壓縮生成dest.min.js,同時生成map檔案dest.min.js.map。如下所示:

在chrome瀏覽器下如何設定調式?

  首先我們來看看對chrome不設定情況下 是這樣的 ,在Setting -> General ->

如上,沒有勾選Enable javascript source maps選項,我們在chrome瀏覽器下 按F12看到這樣的:

檔案已經壓縮了的,對於我們調式JS非常不方便,所以我們需要對chrome瀏覽器設定下,勾選上Enable javascript source maps檔案,如下所示:

我們再來看下chrome瀏覽器,如下:

如果dest.js程式碼有問題的話,我們可以直接對未壓縮的dest.js進行調式程式碼。

我們開啟map檔案 看到如下資訊:

{

    "version": 3,

    "file": "dest.min.js",

    sourceRoot:'',

    "sources": [

        "dest.js"

    ],

    "names": [

        "Test1",

        "test1",

        "init",

        "console",

        "log",

        "Test2",

        "test2"

    ],

    "mappings": "AAKC,QAASA,SACT,GAAIC,IACHC,KAAM,WACLC,QAAQC,IAAI,UAGd,OAAOH,GAGR,QAASI,SACR,GAAIC,IACHJ,KAAM,WACLC,QAAQC,IAAI,UAGd,OAAOE"

}

- version:Source map的版本,目前為3。
- file:轉換後的檔名。
- sourceRoot:轉換前的檔案所在的目錄。如果與轉換前的檔案在同一目錄,該項為空。
- sources:轉換前的檔案。該項是一個陣列,表示可能存在多個檔案合併。
- names:轉換前的所有變數名和屬性名。
- mappings:記錄位置資訊的字串.

demo下載

相關文章