直到今天,在我的所有node \ express项目中,我已经在某个文件中创建了HTTP服务器
var server = http.createServer(app);
http.globalAgent.maxSockets = maxSockets;
server.listen(port, function() {
logger.info('App starting on : ' + port );
});
并直接调用该文件以启动应用程序。最近我注意到一些样板,使用调用启动器文件并基于参数的方法,产生子进程,无论是构建应用程序还是启动应用程序
in package json
"start": "babel-node tools/run.js"
in run .js
// Launch `node build/server.js` on a background thread
function spawnServer() {
return cp.spawn(
'node',
[
// Pre-load application dependencies to improve "hot reload" restart time
...Object.keys(pkg.dependencies).reduce(
(requires, val) => requires.concat(['--require', val]),
[],
),
// If the parent Node.js process is running in debug (inspect) mode,
// launch a debugger for Express.js app on the next port
...process.execArgv.map(arg => {
if (arg.startsWith('--inspect')) {
const match = arg.match(/^--inspect=(\S+:|)(\d+)$/);
if (match) debugPort = Number(match[2]) + 1;
return `--inspect=${match ? match[1] : '0.0.0.0:'}${debugPort}`;
}
return arg;
}),
'--no-lazy',
// Enable "hot reload", it only works when debugger is off
...(isDebug
? ['./server.js']
: [
'--eval',
'process.stdin.on("data", data => { if (data.toString() === "load") require("./server.js"); });',
]),
],
{ cwd: './build', stdio: ['pipe', 'inherit', 'inherit'], timeout: 3000 },
);
}
例如:https://github.com/kriasoft/nodejs-api-starter/
这有什么好处?
答案 0 :(得分:0)
根据我的经验,这不是一种普遍的做法。它基于它们正在执行的注释显示,以便能够基于环境等对命令行选项进行配置。说实话,这对我来说似乎有点适得其反。
我经常看到的是仅使用npm start
从命令行启动节点。 package.json
有几个选项可用于定义将要执行的操作,但最常见的是我会调用类似node server.js
或类似内容的简单操作。如果您有多个要启动的选项(例如,打开调试标志等),那么只需添加更多脚本并调用npm run <scriptname>
即可实现。
任何其他特殊的酱料都会被选择为流程管理器(systemd是我的首选,但是像pm2这样的其他人存在并运行良好),在它和环境变量之间你可以完成上述脚本中的所有或大部分内容没有所有的间接。如果我开始维护应用程序并且不知道它正在为我做这样的事情,那么我觉得你发布的例子会真正提升'wtf-factor'。