nodemon
1.1、nodemon简介
是什么 ?:node monitor that helps developnode.jsbased applications by automatically restarting the node application when file changes in the directory are detected.
开发语言:C
官方主页:https://nodemon.io
源码仓库:https://github.com/remy/nodemon

nodemonnode-supervisor功能完全一样,而且用法也几乎一样。

nodemon据说比较轻量级。它比node-supervisor多一个配置文件, 里面可以配置那个命令行的参数,最重要的是,它有事件通知的功能,而node-supervisor没有, 另外,node-supervisor已经连续几年没有更新了。

1.2、通过包管理器安装nodemon
包管理器安装命令
npmnpm install -g nodemon
yarnyarn global add nodemon
1.3、nodemon命令的使用

nodemon命令的使用方式有如下两种:

nodemon <option>
nodemon [option]... <program>
nodemon [option]... -- <program> [args ...]

上面后两种使用方式中都必须指定要执行的program, 对于Node.js程序来说,program就是指的启动Node.js程序的入口.js文件,比如./bin/www./src/private/server.js

上面两种使用方式的不同点,就在于,启动指定的Node.js程序的时候,是否要给它传递参数, 如果要传递参数,就在program的前面加上--

option都是可选的。

1.3.1、--help

查看nodemon命令的帮助文档。

1.3.2、-v | --version

显示nodemon的版本号。

1.3.3、nodemon --verbose xx.js

如果指定了-V--verbose参数,运行过程中会打印出nodemon内部的一些额外的信息,否则信息很少,不便于我们观察。

假设,我们现在开发一个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程序的入口文件。

使用nodemon命令启动它:

cd ~/git/fpliu-blog
nodemon --verbose src/private/server.js

运行效果如下:

从运行后的日志可以看出,使用node命令启动了src/private/server.js--watch--ext--exec这3个参数我们没有指定,都使用了默认的值。--watch的默认值是.,在这个例子中就是~/git/fpliu-blog目录。

修改一下./src/private/目录中的任意一个.js文件,然后保存,我们会看到,立即打印出如下的日志:

这就表明,我们修改了--watch参数指定的被监控目录中的.js文件之后,nodemon自动重启了这个Node.js程序, 这样,我们就不用自己重启这个Node.js程序了,开发效率大大提高。

1.3.4、--watch <files | dirs>

--watch参数指定了要监控的目录或者文件。当监控到--watch指定的目录中的文件发生了变化, 就会重新启动程序。

示例:

cd ~/git/fpliu-blog
nodemon --watch src/private src/private/server.js

运行效果如下:

上面的命令等同如下的命令:

cd ~/git/fpliu-blog/src/private
nodemon --verbose server.js

运行效果如下:

注意:--watch参数的值是一个或多个文件、一个或多个文件夹,多个之间可以用逗号隔开,也可以多次使用该参数。

示例:

cd ~/git/fpliu-blog
nodemon --watch src/private,src/public src/private/server.js
nodemon --watch src/private --watch src/public src/private/server.js
1.3.5、--ignore <files | dirs>

--ignore是排除--watch参数指定的目录下的一些文件。

示例:

cd ~/git/fpliu-blog
nodemon --watch src/private --ignore src/private/views src/private/server.js

因为src/private/views目录中存放的是ejs模板文件,这些文件变化了是不需要重新启动程序的。

1.3.6、--exec <command>

--exec参数指定用command执行program

该参数大多数情况下是不用指定的,它通过后缀名就能识别出来。

示例:

cd ~/git/fpliu-blog
nodemon --exec "node" src/private/server.js
nodemon --exec "$HOME/.nvm/versions/node/v10.15.1/bin/node" src/private/server.js
1.3.7、--ext <extensions>

--ext参数指定检测--watch指定的目录中的哪些后缀名的文件。

--ext的默认值是js,mjs,json

示例:

cd ~/git/fpliu-blog
nodemon --ext "js,jade,hbs" src/private/server.js
1.3.8、--config <FILE>

--config参数指定配置文件。

nodemon命令的除了--config参数之外的其他参数都可以使用配置指定。 另外配置文件中还可以指定nodemon命令的参数所没有的参数。

示例:

cd ~/git/fpliu-blog
nodemon --config nodemon.json src/private/server.js

注意:nodemon的配置文件默认是nodemon.json,如果已经存在该文件,就可以不用在参数重显示指定。 另外,nodemon命令的参数的优先级比配置文件的参数的优先级高。

示例:

{
    "restartable": "rs",
    "ignore": [
        ".git",
        "node_modules/**/node_modules"
    ],
    "verbose": true,
    "execMap": {
        "js": "node --harmony"
    },
    "events": {
        "start": "browser-sync start --port 3001 --proxy \"localhost:3000\" -f \"**/*\"",
        "restart": "broser-sync reload -f '$FILENAME'"
    },
    "watch": [ "src/private" ],
    "env": {
        "NODE_ENV": "development"
    },
    "ext": "js,json"
}

事件通知是node-supervisor没有的功能,他与BrowserSync结合起来,让全栈开发无比流畅,完全自动化。

1.3.9、nodemon [option]... -- <program> [args ...]

你如果需要给program传递参数,就需要这样的使用方式。其实就是多了个--参数。

cd ~/git/fpliu-blog
nodemon -- src/private/server.js -env development

Node.js中获取命令行参数的方法如下:

var env;
if (process.argv[2] == "-env") {
    env = process.argv[3] || "production";
    if (env !== "development" && env !== "production") {
        env = "development";
    }
} else {
    env = "production";
}
console.log("env = " + env);

//设置环境,取值:development|production
app.set('env', env);
1.3.10、DEBUG=* nodemon

debug模块的使用。

DEBUG=* nodemon src/private/server.js