本文章是關於搭建和安裝grunt前端。言簡意賅分爲以下幾步,按步驟操作可搭建一個簡單的前端框架。以後再開發前端的時候,可以再根據實際項目需求,逐漸完善和增加相關插件和環境,這裏就不多做論述了。本隨筆若有錯誤之處歡迎指正,也歡迎各位同行一起交流成長。
一.安裝nodejs
在下載nodejs時候,應注意:1.最新版本的儘量別用,2.奇數版本號的版本被認爲是不穩定的開發版,不過從官網上下載下來的應該都是偶數的穩定版。
本例子,nodejs的版本爲:node-v4.4.5-x64
安裝時,點擊下一步到底即可。
安裝完成後,在制臺中輸入“node -v”來查看nodejs的版本,也順便試驗nodejs是否安裝成功。
二.安裝grunt-CLI
“CLI”:翻譯爲“命令行”。
在控制檯輸入:
1.windows系統:
npm install -g grunt-cli
2.mac os 系統、部分linux系統:
sudu npm install -g grunt-cli
驗證一下grunt-cli是否安裝完成並生效,在命令行中輸入“grunt”命令即可。生效則會出現以下結果:
三.搭建一個項目
新建一個“template”的文件夾,在裏面創建dist和src的文件夾,src爲項目內容,dist爲壓縮合並轉譯等處理過後的文件夾,在src裏面建立css,js文件夾,裏面對應放入相應的文件夾和文件。
在根目錄創建一個package.json文件。
在裏面寫入如下代碼:
{ "name": "template", "version": "1.0.0", "devDependencies": { } }最後一個“devDependencies”爲“開發依賴項”,即我們現在這個系統,將會依賴於哪些工具來開發,目前爲空對象,在之後的操作中,隨着安裝的進行,會逐漸填充起來的。
四. 安裝grunt
“—save-dev”的意思是,在當前目錄安裝 grunt 的同時,順便把 grunt 保存爲這個目錄的開發依賴項。由於grunt僅在開發階段使用,所以使用--save-dev。如果是運行時使用的,則用--save。
上文配置package.json時,其“devDependencies”的“devDependencies”中就會存儲開發依賴項。
在輸入npm install grunt --save-dev後:
並且,在項目文件下,多了一個“node_modules”文件夾。
在控制檯運行“grunt”命令。如果得到一個warning提示,那說明grunt已經起作用了。
五. 配置Gruntfile.js
module.exports = function( grunt ) { grunt.initConfig( { /* 任務配置,所有插件的配置信息 */ pkg: grunt.file.readJSON( "package.json" ) } ); //告訴grunt當我們在終端中輸入grunt時需要做些什麼(注意先後順序) grunt.registerTask( 'default', [] ); };再運行一下grunt命令,如下圖,說明正確。
六. Grunt插件安裝和配置
七. uglify插件安裝(壓縮javescript代碼)
/*======= 壓縮js,uglify插件的配置信息 =======*/ uglify: { options: { //在所有生成的文件上方加上 時間 banner: '/*! <%= pkg.file %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, minjs: { files: [ { expand: true, // 啓用下面的選項 cwd: 'src/js/', // 指定待壓縮的文件路徑 src: [ '**/*.js', '!**/*.min.js' ], // 匹配相對於cwd目錄下的所有js文件(排除.min.js文件) dest: 'dist/js', // 生成的壓縮文件存放的路徑 ext: '.min.js' // 生成的文件都使用.min.css替換原有擴展名,生成文件存放於dest指定的目錄中 } ] }, /* 合併js */ merge: { files: { /* 合併指定目錄下 所有的js文件 */ 'dist/js/merge/all/all.js': [ 'dist/js/**/*.js'], //前者爲合併的路徑,後者爲對象路徑 /* 合併指定目錄下 特定的js文件 */ 'dist/js/merge/some/some.js': [ 'dist/js/jquery/*.js'] } } },2、在 grunt.initConfig 方法之後,要讓grunt去加載這一個插件,如下:
//告訴grunt我們將使用插件 grunt.loadNpmTasks( 'grunt-contrib-uglify' );3、在grunt命令執行時,要不要立即執行uglify插件?如果要,就寫上,否則不寫。
//告訴grunt當我們在終端中輸入grunt時需要做些什麼(注意先後順序) grunt.registerTask( 'default', [ 'uglify'] );當然了,也可以這麼寫,簡化一點:
//告訴grunt當我們在終端中輸入grunt時需要做些什麼 grunt.registerTask( 'default', [], function() { //告訴grunt我們將使用插件 grunt.loadNpmTasks( 'grunt-contrib-uglify' ); //需要執行哪些任務(注意先後順序) grunt.task.run( 'newer:uglify' ); } );至此前期工作都做好了,可以在控制檯輸入命令運行了,在控制檯輸入grunt
/*======= 壓縮css,cssmin插件的配置信息 =======*/ cssmin: { /*壓縮 CSS 文件爲 .min.css */ options: { keepSpecialComments: 0 /* 移除 CSS 文件中的所有註釋 */ }, /* 合併CSS */ merge:{ files:{ /* 合併指定目錄下 所有的CSS文件 */ 'src/css/merge/all/all.css':[ 'src/css/**/*.css', '!src/css/**/*.min.css'], /* 合併指定目錄下 特定的CSS文件 */ 'src/css/merge/some/some.css':['src/css/bootstrap/*.css', 'src/css/some.css', '!src/css/**/*.min.css'] } }, minify: { expand: true, // 啓用下面的選項 cwd: 'src/css/', // 指定待壓縮的文件路徑 src: [ '**/*.css', '!**/*.min.css' ], // 匹配相對於cwd目錄下的所有css文件(排除.min.css文件) dest: 'dist/css', // 生成的壓縮文件存放的路徑 ext: '.min.css' // 生成的文件都使用.min.css替換原有擴展名,生成文件存放於dest指定的目錄中 } },2、在 grunt.initConfig 方法之後,要讓grunt去加載這一個插件,如下:
//告訴grunt我們將使用插件 grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); grunt.loadNpmTasks( 'grunt-contrib-uglify' );
//告訴grunt當我們在終端中輸入grunt時需要做些什麼(注意先後順序) grunt.registerTask( 'default', ['cssmin','uglify'] );
九. watch插件安裝和配置
/*======= 監控文件變化並執行相應任務 =======*/ watch: { /* 監聽當Gruntfile.js改變時,重新刷新加載 */ configFiles: { files: [ 'Gruntfile.js'], options: { reload: true } }, less: { files: [ 'src/css/less/*.less' ], //監聽的對象路徑 tasks: [ 'newer:less' ], //執行的事件 options: { spawn: false, debounceDelay:5000 //每次監聽的間隔時間 } }, css: { files: [ 'src/css/**/*.css' ], tasks: [ 'newer:cssmin' ], options: { spawn: false, debounceDelay:5000 } }, js: { files: [ 'src/js/**/*.js' ], tasks: [ 'newer:uglify' ], options: { spawn: false, debounceDelay:5000 } } }
/* 監聽當Gruntfile.js改變時,重新刷新加載 */ configFiles: { files: [ 'Gruntfile.js'], options: { reload: true } },
//告訴grunt我們將使用插件 grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); grunt.loadNpmTasks( 'grunt-contrib-uglify' );
grunt.loadNpmTasks( 'grunt-newer' );grunt.loadNpmTasks( 'grunt-contrib-watch' );
//告訴grunt當我們在終端中輸入grunt時需要做些什麼(注意先後順序) grunt.registerTask( 'default', ['cssmin','uglify',watch’] );
十. 批量安裝插件
在開發時候,如我本地搭建了前端的環境,其他同事沒有,不可能也不會把“node_modules”上傳到開發庫,其他一起開發的人,爲了得到這些grunt插件和工具,有2種方法:
1手動一個一個安裝,這是一個笨方法,其次如果我當年安裝的舊版本,而他們現在自己安裝的可能是新版本。新舊有可能不兼容。
2用此方法,批量安裝。
我們在把項目文件上傳服務器時,肯定會把根目錄的package.json上傳上去,而package.jso 的“devDependencies”就記錄了這個系統的開發依賴項,我們可以通過nodejs的npm即可批量安裝。
下面我們測試一下,在d盤中新建一個' template2 '文件,然後把“grunt_test”中的package.json拷過去。在打開命令行跳轉到“temple2” ,執行