锋言锋语

NferZhuang的自留地

bin/www进化史

概述

bin/www文件是expressjs框架生成器生成的项目默认启动入口:

  "scripts": {
    "start": "node ./bin/www"
  },

其作用就是启动一个http服务,并把根目录下的app.js作为requestListener传递给http.createServer()函数。

首次出现(v3.0.0)

express-generator最初的版本(v1.0.0 2013-11-20)并没有生成bin/www文件,所有的初始化逻辑都在app.js文件;到了第二个版本(v3.0.0 2014-03-05)的时候,生成器生成的代码就有了bin/www文件,但是这个时候的bin/www文件还是比较简陋:

#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

bin/www迭代1(v4.2.0)

expressjs在发布了v3.0.0版本的生成器后,很快就又做了大版本升级v4.0.0(2014-04-09),但是这一版本修改并没有涉及到到bin/www文件。

接下来的版本升级中(v4.2.0,v4.8.0,v4.9.0)只是修改了bin/www文件的一行代码:

< var debug = require('debug')('my-application');
---
> var debug = require('debug')('myapp')

注:生成器中的代码实际改动为:

-var debug = require('debug')('my-application');
+var debug = require('debug')('{name}');

即,使用目录名作为app_name,而不是hardcode为’my-application’。点击链接可以查看GitHub上关于该pr的详细讨论。

bin/www迭代2(v4.10.0)

注意,在v1.0.0的app.js中,创建http server部分的代码如下:

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

而,在接下来的bin/www中,创建http server部分的代码则使用了app.listen

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

因此,为了在出错时进行更好的提示,expressjs生成器v4.10.0版本重新使用了http.createServer(app)的方式创建http server,并对常见的异常错误’EACCES’和’EADDRINUSE’进行了异常处理。

这一版还有一个重要的改动就是:增加了详细的代码注释(然而代码炒鸡简单,其实并不需要注释~~~)

bin/www迭代3(v4.11.0)

通常express是指定端口的方式进行启动,其默认端口是3000,但在一些场景下,比如在windows下使用iisnode来运行express则是通过“命名管道”的方式来启动express(然鹅我并没有这么run过)。

因此,expressjs在这一版中增加了named pipe的支持,使用了函数进行处理:

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

最新版本(v4.12.0 ~ 4.15.5)

和上一个版本相比,最新版本只是增加了一个分号,这也充分说明了,bin/www文件已经相当稳定。

文 / nfer
LEAVE A REPLY

loading