## 隐式调用node执行程序
前面我们在执行`node`程序的时候都是使用`node filePath`(比如,`node index`)的形式。但是,对于命令行程序,像`npm,git`,你在命令行使用这些命令行程序时,前面不会再带一个执行程序名称,而我们在[命令行参数处理](313192)这一小节使用自定义命令参数时,需要使用形如`node index exec`的命令,这个过程很繁琐,这一小节将介绍如何简化这个过程。
1.创建一个`node`工程(创建文件夹,将工作目录切换到文件加,`npm init`生成`package.json`,创建`index.js`文件)
2.打开`index.js`文件,输入下面内容:
~~~
#!/usr/bin/env node
console.log('Hello,world!');
~~~
我们在最前面加了`#!/usr/bin/env node`,它的作用是指定`index.js`的执行程序`node`,这时,你可以使用` ./index.js `直接执行`index.js`文件了。
3.虽然我们将第一个参数`node`去掉了,但是`index.js`这个文件名称太普遍了,并且,如果不在`index.js`的工作目录下,执行`index.js`的时候还要输入相对`index.js`的路径,这个过程很繁琐,我们需要更简单的方法。
下面介绍解决方案:
1)打开`package.json`文件,加入一个字段`bin`,如下:
~~~
"bin":{
"mymodule":"./index.js"
},
~~~
这里`mymodule`你可以自定义,如果是准备发布的模块,一般会使用模块名称,如果是本地使用,你开心就好。
package.json完整文件如下:
~~~
{
"name": "hello_module_outsider",
"version": "1.0.0",
"description": "My first node module",
"main": "index.js",
"bin":{
"mymodule":"./index.js"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"hello",
"module"
],
"author": "outsider",
"license": "ISC"
}
~~~
2)在当前工作目录下执行`npm link`,把模块链接的本地`npm`仓库
至此,我们可以完全使用 `mymodule`来替代`node index.js`了,而且,这个它是全局的,你可以在任何目录下使用。