npm的黑魔法
前几天在学习reactjs
,去github闲逛时发现了一个react
的项目——universal-react-boilerplate。git clone
后进行项目启动的时候,竟然发现是通过npm start
来启动的。
说好的node index/app.js
呢?
于是便打开了package.json
文件,有以下配置:
"scripts": {
"start": "babel-node app/index.js && npm run start-healthcheck",
"debug": "babel-node --debug app/index.js",
"inspect": "node-inspector",
"test": "babel-node app/test/unit/index.js | tap-bail",
"test-dev": "babel-node app/test/unit/index.js | tap-bail | faucet",
"functional": "babel-node app/test/functional/index.js",
"lint": "eslint app",
"build": "mkdir -p config && git rev-parse --short HEAD > config/BUILD && NODE_ENV=production webpack && npm run build:min",
"build:min": "NODE_ENV=production MINIFY=1 webpack",
"validate": "npm run lint && npm run build && npm run test && npm outdated --depth 0",
"validate-dev": "npm run lint && npm run build && npm outdated && npm run test-dev",
"watch:build": "watch --wait=8 'npm run validate-dev' ./app/",
"dev": "webpack --watch",
"start-healthcheck": "babel-node app/healthcheck.js",
"audit": "nsp package",
"precheck": "npm run validate",
"check": "npm run audit && npm outdated --depth 0"
}
这样就发现,原来npm
原来可以读取scripts
中的命令啊。于是运行npm start
就是运行babel-node app/index.js && npm run start-healthcheck
。这就太酸爽了。比如说运行项目的时候,需要先通过browserify
编译项目的文件,使浏览器也能使用使用服务端的js代码,就可以直接在package.json
中的scripts
添加命令:
scripts:{
run : browerify mr-files.js > bundls.js && node app.js
}
npm
中的命令类似一个管道,所以运行npm run
就好比先运行了browerify mr-file.js > bundls.js
再运行了node app.js
。有没有很省力气呢!
默认值
install
这个就不说了。start
在项目的根目录下如果存在server.js
的话,那么package.json
中没有start
的命令,也能通过npm start
来运行node server.js
。
可以更改的config
可以在命令端更改package.json
中的config
对象:
比如package.json
:
{
"name" : "foo",
"config" : {
"port" : "6677"
},
"scripts" : {
"start" : "node server.js"
}
}
server.js
:
var http = require('http');
http.createServer(function (req, res) {
res.writeHeader(200, {"Content-Type" : "text/plain"});
res.end('hello word');})
.listen(process.env.npm_package_config_port);
正常情况下,启动程序后可以程序会在6677端口运行,但是如果先运行npm config set foo:port 7788
,再启动程序虽然package.json
没有改动,但是会在端口7788运行。
简直不要太溜!
main
另外,在npm_modules
的package.json
中会有一个main
,用来表示整个包的入口。
Written on November 7, 2015