npm的黑魔法

前几天在学习reactjs,去github闲逛时发现了一个react的项目——universal-react-boilerplategit 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_modulespackage.json中会有一个main,用来表示整个包的入口。

Written on November 7, 2015