背景
npm start 與 node app.js 的區(qū)別毫深? 寫下這個標(biāo)題吩坝,對于不清楚背景的人來說,不知所云哑蔫。 因為二者本來沒什么必然的聯(lián)系钉寝,也就談不上區(qū)別弧呐。 不過對于 MEAN 全棧初學(xué)者來說嵌纲,產(chǎn)生這個疑問也合乎常理俘枫。
對于 node.js 開發(fā)者來說,首先接觸到的就是 node app.js
回顧下node.js 的學(xué)習(xí)歷程: 創(chuàng)建一個 應(yīng)用程序鸠蚪, 通常命名為 app.js 或 server.js 师溅。 那么墓臭,如何運(yùn)行這個應(yīng)用程序呢榆综?
啟動app.js 的方法: 打開終端窗口,進(jìn)入到 app.js 文件所在的路徑崭篡,
node app.js
npm start 又是怎么回事呢斯入?
npm start 這個命令滋迈,是來自創(chuàng)建的 Express 工程。 我們可以創(chuàng)建 node.js 工程女责,也可以創(chuàng)建 express 工程残制。Express是基于node.js 的后臺框架搁宾,用Express 會簡單很多堕伪。
那么禁炒,如何創(chuàng)建 express 工程呢悠瞬?
(1) 全局安裝 express: $ sudo npm install -g express
(2) 安裝 express 命令行工具: $ sudo npm install -g express-generator
打開終端窗口辩尊,進(jìn)入到工程(文件夾)所在路徑惦辛,執(zhí)行命令:
express --view=ejs myShop
需要注意的是添坊,創(chuàng)建Express工程時雨女,默認(rèn)的視圖模板引擎是Jade。在這個實例中帮寻,我們選用EJS模板引擎
Express 工程創(chuàng)建完畢后 耘戚,在它的 package.json 文件中串结,有這么一行代碼:
"scripts": {
"start": "node ./bin/www"
},
npm start
命令耽装,就是這么來的期揪。 執(zhí)行 npm start
指令掉奄,就相當(dāng)于執(zhí)行 node ./bin/www
www 文件才是 Express 應(yīng)用的真正的入口。
仔細(xì)看下 www 文件的代碼横侦,如下:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('myshop:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
如果把 www 文件中代碼全部移到 app.js 中挥萌, 就可以用 node app.js
替代 npm start
了绰姻。
小結(jié)
從www 代碼可以看出,配置了端口號 : 3000引瀑。 還有狂芋,增加了些異常處理。 這些異常處理機(jī)制憨栽,通常不用改動帜矾。 唯一有可能要改動的,就是 端口號屑柔。
瀏覽器訪問時屡萤,http://localhost:3000 中的 3000 就是在這里設(shè)置的。
參考書: 《 全棧開發(fā)之道:MongoDB+Express+AngularJS+Node.js 》
更多全棧技術(shù)掸宛,請關(guān)注微信公眾號: “全棧工程師的早讀課”死陆,每天早8:00 準(zhǔn)時推送技術(shù)文章。