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
