Node.js 的热门之处就在于其命令行开发能力。
一个在 shell 下编码的程序员绝对要比在常规编辑器上编码的程序员酷!

基础环境

  1. win10 x64
  2. node.js
  3. npm

hello world

一切从 hello world 开始!

#!/usr/bin/env node
console.log('hello world');

普通的 node.js 脚本需要使用node 文件名的形式执行,在脚本首行加上#!/usr/bin/env node可以在linux环境中指定脚本的解释程序。

> hello.js
hello world

全局命令

以上的做法只能在特定的目录下执行该脚本文件,如果想做到如node般的无处不在,需要借用npm了。

在当前目录新建package.json,如下编码:

{
"name": "hello",
"bin": {
"hello": "hello.js"
}
}

然后执行npm link命令,将会把以上配置注册到全局,这样在任何一个目录都可以调用hello输出hello world了。

命令行参数

光有特定命令名也只能执行一项特定任务,现在该实现多态了。

写一个小工具吧。
需求很简单,执行run name打开对应的应用程序。

新建文件config.jsonrun.jsconfig.json用于配置应用程序的路径。

{
"qq": "D:\\qq\\Bin\\QQ.exe"
}

先拿企鹅开刀,在config.json文件中配置qq.exe的绝对路径。
另外别忘了在package.json中添加run.js

#!/usr/bin/env node
var name = process.argv[2],
exec = require('child_process').exec,
fs = require('fs');
var cfg = JSON.parse(fs.readFileSync(__dirname + '/config.json'));
var child = exec('start ' + cfg[name], function(err, stdout, stderr) {
if (err) throw err;
});

使用系统变量process.argv获取输入参数,引用fs模块用于读取配置文件,child_process模块用于执行系统命令。

可为什么参数索引是 2 呢?难道命令行索引从 1 开始吗?

其实是因为我们实际执行的命令还是node run namenode索引为 0

开始测试。

run qq

企鹅登录窗口应声而出。
如果还需要其他应用程序的命令行启动可以在config.json中添加新的配置项。

以上代码使用的是 node.js 原生的命令行模块,还有一些更方便的包装模块,参考:阮一峰 - Node.js 命令行程序开发教程