在吉特倉儲管理系統開發的過程中大量使用到了JS,隨着JS文件的增多我們需要對JS進行有效的管理,同時也要對JS文件進行一些壓縮。文本用於記錄一下使用grunt壓縮JS的操作步驟,便於遺忘之后記錄查找,文章內容非常淺顯。
一. 什么是grunt
JavaScript世界的構建工具,官網上是這么描述的,姑且這么描述,個人感覺還比較好用。官網地址: http://www.gruntjs.net/ 更多的參考資料也可以查詢官網
二. 安裝grunt
Grunt和Grunt插件是通過npm安裝並管理的,npm是Node.js的一個包管理器,不理解的可以查看NodeJS 的相關資料。本文操作都是在Windows系統環境中操作,其他的操作系統命令行可能稍微有點不一樣。(如果沒有nodejs環境的請先安裝nodejs環境)
npm install -g grunt-cli
在CMD命令窗口中輸入如上命令,grunt命令就會加入到你的系統路徑中,后面你就可以可以使用grunt命令構建壓縮JavaScript了。
上面的命令是按照grunt-cli,但是這並不等於按照了grunt,grunt-cli用於協調調用任務的。
三. 項目准備
在編輯JS的時候我使用的sublime編輯器,這個編輯非常的不錯,個人比較喜歡這個編輯器
如上圖是在吉特倉儲管理系統開發的過程中使用到的部分JS截圖,在這里我們將處理如何壓縮這些JS文件。在使用grunt壓縮JS的時候我們需要兩個文件package.json 和 Gruntfile。
package.json 用於npm存儲項目的元數據,可以設置項目的描述信息以及項目依賴的grunt以及grunt插件。
Gruntfile 可以使用Gruntfile.js或者Gruntfile.coffee,個人喜歡使用Gruntfile.js文件,這個文件用於配置和定義任務並加重Grunt插件的。
在CMD命令行中進入到JS項目對應的根目錄。
在此目錄下輸入命令行

G:\Mui\gitwms>npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg> --save` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. name: (gitwms) version: (1.0.0) description: entry point: (index.js) test command: "" git repository: keywords: gitwms author: hechen license: (ISC) About to write to G:\Mui\gitwms\package.json: { "name": "gitwms", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "\"\"" }, "keywords": [ "gitwms" ], "author": "hechen", "license": "ISC" } Is this ok? (yes) yes
在命令行輸入npm init 后會自動生成package.json文件,生成的文件內容如下:

{ "name": "gitwms", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "\"\"" }, "keywords": [ "gitwms" ], "author": "hechen", "license": "ISC" }
在項目中安裝grunt,使用如下的命令,如果安裝成功命令行中會顯示相關成功的信息。
npm install grunt --save-dev
grunt 本身不會壓縮JS文件,我們需要使用grunt的插件grunt-contrib-uglify 來處理文件的壓縮
npm install grunt-contrib-uglify --save-dev
安裝好grunt 以及壓縮的插件之后,我們會發現package.json文件內容會發生一些變化

{ "name": "gitwms", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "\"\"" }, "keywords": [ "gitwms" ], "author": "hechen", "license": "ISC", "devDependencies": { "grunt": "^1.0.1", "grunt-contrib-uglify": "^2.0.0" } }
devDependencies 之后的內容發生了變化,指向了grunt的依賴。
在項目的根目錄新建文件Gruntfile.js, 然后將如下代碼復制到該JS文件中。

module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'customer/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // 加載包含 "uglify" 任務的插件。 grunt.loadNpmTasks('grunt-contrib-uglify'); // 默認被執行的任務列表。 grunt.registerTask('default', ['uglify']); };
先不管該代碼的意思,在項目根目錄下執行grunt命令 (CMD命令窗口中執行)
G:\Mui\gitwms>grunt Running "uglify:build" (uglify) task >> Destination build/gitwms.min.js not written because src files were empty. >> No files created.
命令行輸出錯誤信息,沒有壓縮創建文件成功。這個主要是Gruntfile.js中的文件配置錯誤引起的
src: 'customer/<%= pkg.name %>.js', 這里找不到src 對應的目錄下的文件,修改代碼如下:
build: { src: 'customer/*.js', dest: 'build/<%= pkg.name %>.min.js' }
然后再次運行grunt 命令,發現在根目錄下創建了一個build文件夾,並且生成了一個gitwms.min.js 的壓縮JS文件。在這里grunt壓縮JS文件的操作任務成功了。
四. 文件被合並了
上面的操作執行成功,但是多個文件被壓縮成了一個文件,我們需要每個文件壓縮成一個文件。修改Gruntfile.js文件內容如下:

module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, /*build: { src: 'customer/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' }*/ my_target:{ files:[ {expand:true,cwd:"customer/",src:"*.js",dest:"build/",ext:".<%= pkg.version %>.min.js"}, {expand:true,cwd:"customer/User/",src:"*.js",dest:"build/User/",ext:".<%= pkg.version %>.min.js"}, ] } } }); // 加載包含 "uglify" 任務的插件。 grunt.loadNpmTasks('grunt-contrib-uglify'); // 默認被執行的任務列表。 grunt.registerTask('default', ['uglify']); };
編輯上述代碼之后再次使用grunt命令進行壓縮文件,發現生成了兩個目錄。但是同一個目錄的文件還是被壓縮成了一個文件,而且查看文件名稱存在較大的問題。
上面被壓縮的代碼並不是我們想要的,文件還是被合並了。導致這個問題的原因是JS源文件的命名 . 導致的。 這里修改代碼如下:
{expand:true,cwd:"customer/",src:"*.js",dest:"build/",ext:".<%= pkg.version %>.min.js",extDot:"last"}, {expand:true,cwd:"customer/User/",src:"*.js",dest:"build/User/",ext:".<%= pkg.version %>.min.js",extDot:"last"},
重新運行grunt 命令現在可以滿足要求了。這里主要使用到了extDot 屬性。extDot:first:表示以文件名后的第一個點后面開始作為后綴名;last:表示以文件名后的最后一個點后面開始作為后綴名。
files 中屬性說明:
expand: 值 true 或 false ,如果設置為true 標識后面文件名的占位符(*)都要具象到具體的文件
cwd: 需要輸出的處理文件目錄
src: 需要匹配的文件,和cwd相對,如果是數組形式,數組每一個item都是一個文件名(可以使用通配符)
dest:壓縮生成的文件路徑前綴
ext: 處理之后的文件后綴名
extDpt: first 表示源文件名的第一個. 后面的開始作為后綴名 | last 表示源文件名的最后一個. 后面的開始作為后綴名
flatten: 刪除所有生成的dest的路徑部分,值為boolean類型(true、false)用來指定是否保持文件目錄結構,true是保持文件目錄
五. 配置簡單說明
pkg: grunt.file.readJSON('package.json')
用於讀取package.json中的內容,並且可以賦值到pkg中。后面就可以使用<% %>
模板字符串引用任意的配置屬性。
作者:情緣
出處:http://www.cnblogs.com/qingyuan/
關於作者:從事倉庫,生產軟件方面的開發,在項目管理以及企業經營方面尋求發展之路
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
聯系方式: 個人QQ 821865130 ; 倉儲技術QQ群 88718955,142050808 ;
吉特倉儲管理系統 開源地址: https://github.com/hechenqingyuan/gitwms