在开发或调试Node.js应用程序的时候, 当修改了.js
文件后,总是要先按下CTRL+C
终止程序,然后再重新启动, 即使是修改一点小小的参数,也总是要不断地重复这几个很烦人的操作。
这是因为Node.js只有在第一次引用到某部份时才会去解析脚本文件, 以后都会直接访问内存,避免重复载入。
Node.js的这种设计虽然有利于提高性能,却不利于开发调试, 因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。
有没有办法做到当.js
文件修改之后,Node.js自动重新启动(或重新加载文件)以节省时间呢?node-supervisor
正是这样一个可以实现这种需求的Node.js包。
node-supervisor
官网:https://github.com/petruisfan/node-supervisor
包管理器 | 安装命令 |
---|---|
npm | npm install -g supervisor |
yarn | yarn global add supervisor |
supervisor
命令的使用方式有如下两种:
supervisor [options] <program>
supervisor [options] -- <program> [args ...]
上面两种使用方式中都必须指定要执行的program
, 对于Node.js程序来说,program
就是指的启动Node.js程序的入口.js
文件,比如./bin/www
、./src/private/server.js
。
上面两种使用方式的不同点,就在于,启动指定的Node.js程序的时候,是否要给它传递参数, 如果要传递参数,就在program
的前面加上--
。
option
都是可选的。
这是最简单的使用方式。没有任何的option
。
假设,我们现在开发一个Node.js程序,这个Node.js程序的工程位于~/git/fpliu-blog
,下面是该工程的目录结构:
~/git/fpliu-blog
├── gulpfile.js
├── node_modules
│ └── gulp
├── package-lock.json
├── package.json
└── src
├── public
│ └── bower_components
│ └── jquery
└── private
├── app.js
├── config.js
├── server.js
├── routes
│ └── index.js
└── views
└── index.ejs
./src/private/server.js
就是该Node.js程序的入口文件。
使用supervisor
命令启动它:
cd ~/git/fpliu-blog
supervisor src/private/server.js
运行效果如下:
从运行后的日志可以看出,使用node
命令启动了src/private/server.js
。--watch
、--extensions
、--exec
这3个参数我们没有指定,都使用了默认的值。--watch
的默认值是.
,在这个例子中就是~/git/fpliu-blog
目录。
修改一下./src/private/
目录中的任意一个.js
文件,然后保存,我们会看到,立即打印出如下的日志:
这就表明,我们修改了--watch
参数指定的被监控目录中的.js
文件之后,node-supervisor
自动重启了这个Node.js程序, 这样,我们就不用自己重启这个Node.js程序了,开发效率大大提高。
--watch
参数指定了要监控的目录或者文件。当监控到--watch
指定的目录中的文件发生了变化, 就会重新启动程序。
--watch
参数的值是一个或多个文件、一个或多个文件夹,多个之间用逗号隔开。
示例:
cd ~/git/fpliu-blog
supervisor --watch src/private src/private/server.js
运行效果如下:
上面的命令等同如下的命令:
cd ~/git/fpliu-blog/src/private
supervisor server.js
运行效果如下:
--ignore
是排除--watch
参数指定的目录下的一些文件。
示例:
cd ~/git/fpliu-blog
supervisor --watch src/private --ignore src/private/views src/private/server.js
因为src/private/views
目录中存放的是ejs模板文件,这些文件变化了是不需要重新启动程序的。
如果指定了--timestamp
参数,每次重新启动服务,都会打印出这次启动的时间戳。
示例:
cd ~/git/fpliu-blog/src/private
supervisor --ignore views --timestamp server.js
运行效果如下:
如果指定了-V
参数,启动的时候就会打印出一些额外的信息。
示例:
cd ~/git/fpliu-blog/src/private
supervisor --ignore views --timestamp -V server.js
运行效果如下: