在過去一個月,我一直使用Nodemon
和grunt-contrib-watch
。這些都是很好的工具,我認爲任何人使用NodeJS至少應該有這些在你的“我熟悉”類別(“I’m familiar with” )。但是因爲我最近一直在使用這些工具,我一直問自己“爲什麼我使用這兩個?爲什麼不堅持其中之一呢?“…和我坐在這裏,思考我目前做的項目,想知道如果我可以切換到其中一個的一切,發現Nodemon
和grunt-contrib-watch
的區別。
Nodemon
Nodemon的核心是一個命令行工具,它取代了標準的node
命令行,目標是隻要一個文件發生變化就重新啓動node應用程序。在大多數情況下,你只是在命令行上將node
替換爲nodemon
。
Nodemon會開啓一個正常的node進程並監視文件系統的變化。當nodemon監測到文件已經改變,nodemon將停止並重新啓動node進程。這對搭建一個長時間運行的node app程序特別有用,像ExpressJS web應用程序一樣,替代一直需要手動停止並重新啓動服務器的操作,你就讓nodemon幫你吧。
Nodemon讓生活簡單,文件發生變化的時候會重啓你的node 進程。
Grunt-Contrib-Watch
這也是監測文件系統的變化的一個工具。但其並不是在文件系統發生變化的時候重新啓動程序,它可以讓你做許多其他的事情包括運行各種Grunt Tasks
在這個配置中,我監測 public/javascripts文件夾中JavaScript 文件的變化,然後運行jshint browserify任務。與grunt-contrib-watch還有其他事情可以做,但它的核心,也是它最好的,就是監測到文件變化的時候可以執行Grunt Tasks。
So, What’s The Difference?
真正的區別——Nodemon
是旨在重啓node process,而grunt-contrib-watch
是運行一組特定的grunt tasks。是的,它們二者都是監測文件系統的變化並做一些作爲迴應,但作爲迴應,它們所做的就是二者真正的區別。我的應用程序同時使用nodemon
和grunt-contrib-watch
因爲他們提供兩個不同的目的。當我改變ExpressJS app.js文件或我的一個路由處理程序,nodemon
會爲我介入和重新啓動應用程序。當我在相同的ExpressJS 應用程序的 public/ javascripts文件夾下修改JavaScript文件的時候,grunt-contrib-watch
介入並運行相關代碼下我的所有任務。我對grunt-contrib-watch
做更多的不僅僅是這一點,但我想,這很好地說明了它們的差異
Should I Use Both?
最後,我意識到這些工具非常相輔相成的。他們攜手並進,創造一個史詩般的NodeJS應用程序開發環境。所以,同時使用,因爲他們有不同的用途。
最後給出自己練習的一個gruntfile.js配置文件代碼
module.exports=function(grunt){
grunt.initConfig({
watch:{
jade:{
files:['views/**'],
option:{
livereload:true
}
},
js:{
files:['public/js/**','models/**/*.js','schemas/**/*.js'],
// tasks:['jshint'],
options:{
livereload:true
}
}
},
nodemon:{
dev:{
options:{
file:'app.js',
args:[],
ignoredFiles:['README.md','node_modules/**','.DS_Store'],
watchedExtensions:['js'],
watchedFolders:['app','config'],
debug:true,
delayTime:1,
env:{
PORT:3000
},
cwd:__dirname
}
}
},
concurrent:{
tasks:['nodemon','watch'],
options:{
logConcurrentOutput:true
}
}
})
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-nodemon');//文件改變後,會自動啓動服務
grunt.loadNpmTasks('grunt-concurrent');// Run grunt tasks concurrently 併發執行任務
grunt.option('force',true);//避免編譯的時候出現錯誤而中斷服務
grunt.registerTask('default',['concurrent']);//註冊default任務
}
水平有限,意思大概翻譯,原文請看:
Nodemon vs Grunt-Contrib-Watch: What’s The Difference?