Nodemon跟Grunt-Contrib-Watch: 有什么不同
在过去一个月,我一直使用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?