认识
开发NPM模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候,require('myModule')会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的node_modules目录之中。对于开发中的模块,解决方法就是在全局的node_modules目录之中,生成一个符号链接,指向模块的本地目录。
npm link就能起到这个作用,会自动建立这个符号链接。
初始化一个package.json
npm init -y
{
"name": "webpack-cli",
"version": "1.0.0",
"main": "index.js",
"bin": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/fionaVg1/webpack.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/fionaVg1/webpack/issues"
},
"homepage": "https://github.com/fionaVg1/webpack#readme",
"description": ""
}
这个时候执行
npm link
则会将webpack-cli模块安装在全局的node_modules目录之中:
C:\Users\Administrator\AppData\Roaming\npm\node_modules\webpack-cli\index.js
这个时候执行
webpack-cli
其实执行的就是index.js(package.json中bin对应的是index.js)
console.log(1);
发现报错了

#!/usr/bin/env node
console.log(1);
发现控制台正常的输出了1

思考
如何实现webpack-cli create -t vue -n shop 该命令
实现一个工具:通过以上命令创建对应类型(vue、h5、node、react、angularJs等等)的项目
修改index.js
#!/usr/bin/env node
let program = require('commander');
program.version('0.0.0')
.option('-t,--type <type>', 'project type')
.option('-n,--name <name>', 'project name')
program.command('create').action(function (name) {
console.log(program.name,program.type);
});
program.parse(process.argv);
可以看到控制台已经打印出了

延伸
如果想完成上面那个小工具:创建对应类型的项目,则直接在action回调中执行creatProject()即可。createProject中实现项目初始化,模板拉取等。这个就不在这里实现了。