第1页
Node 技术栈实践
张宇⾠辰 (pw) @ 猿题库
第2页
后端Java/Python/PHP … 前端HTML/CSS/JavaScript…
?
第3页
猿题库前端进化之路
第4页
Node 实践中的那些坑
第5页
后端Java/Python/PHP … 前端HTML/CSS/JavaScript…
?
第6页
浏览器
服务器
数据库
模板 静态资源
第7页
浏览器
服务器
数据库
模板 静态资源
后端
前端
第8页
浏览器
服务器
数据库
模板 静态资源
后端
前端
第9页
浏览器
服务器
数据库
模板 静态资源
后端
灰⾊色地带
前端
第10页
⽤用接⼝口来解决问题
服务器
数据库
模板
后端
前端
第11页
前端包圆
服务器
数据库
模板
后端
前端
第12页
猿题库前端进化之路
第13页
猿题库
Java
HTML Template
CSS / JS / IMG
第14页
主站
公务员
司法考试 ⾼高考
Java
HTML Tmpl
CSS / JS / IMG
Java
HTML Tmpl
CSS / JS / IMG
Java
HTML Tmpl
CSS / JS / IMG
Java
HTML Tmpl
CSS / JS / IMG
第15页
主站
公务员
司法考试 ⾼高考
Java
Java
Java
Java
前端代码
HTML Tmpl CSS / JS / IMG
第16页
主站
公务员
司法考试 ⾼高考
Java
Java
Java
Java
前端服务器
Node
HTML Tmpl CSS / JS / IMG
第17页
主站
公务员
司法考试 ⾼高考
Java
Java
Java
后端 前端
HTTP
前端服务器
Node
HTML Tmpl
CSS / JS / IMG
Java
第18页
前端包圆 (By Node)
服务器
数据库
模板
后端
前端
第19页
那些坑
• HTTP • 异常处理 • 内存泄露 • 多核优化, 部署 • ⼀一些⼯工具: 开发, 调试, 性能调优
第20页
client api request
2n
2n
n
Nginx
Node
n
API Server
第21页
client api request
n
Nginx
n
2n
Nginx
2n
Node
API Server
第22页
10.0.1.3
Nginx
Node
yuantiku.com
/ Nginx
/api
API Server
API Server
API Server
第23页
http.globalAgent.maxSockets = Infinity;
第24页
var agent = new http.Agent({ maxSockets: 2
});
!
req.request = request.defaults({ pool: agent
});
第25页
那些坑
• HTTP • 异常处理 • 内存泄露 • 多核优化, 部署 • ⼀一些⼯工具: 开发, 调试, 性能调优
第26页
app.get('/foo', function (req, res) { throw new Error('foo');
});
!
app.use(function (err, req, res, next) { res.send(500, err.message);
});
第27页
app.get('/bar', function (req, res) { process.nextTick(function () { throw new Error(‘bar'); // 异步函数中的异常
}); });
第28页
process.on('uncaughtException', function () { return;
});
第29页
Domain
Express
http://lostjs.com/2014/01/25/handle-exception-in-node/
第30页
那些坑
• HTTP • 异常处理 • 内存泄露 • 多核优化, 部署 • ⼀一些⼯工具: 开发, 调试, 性能调优
第31页
var val = 'hello world'; function outer() {
var val = 'bar'; return function inner() {
return val; }; } global.inner = outer();
第32页
var getUserData = (function () { var cache = {}; return function (userId, callback) { if (cache[id]) { process.nextTick(function () { callback(cache[id]); }); return; } getUser(id, function (data) { cache[id] = data; callback(data); }); };
}());
第33页
var getUserData = (function () { var cache = new LRU({max: 100}); return function (userId, callback) { if (cache.has(id)) { var user = cache.get(‘id’); process.nextTick(function () { callback(user); }); return; } getUser(id, function (data) { cache.set(id, data); callback(data); }); };
}());
第34页
app.get(‘/users/:id’, function (req, res) { getUser(function (req.param(‘id’), data) { user = data; getOrderByUser(user.id, function (order) { res.render({ user: user, order: order }); }); });
});
第35页
app.get(‘/users/:id’, function (req, res) { getUser(function (req.param(‘id’), data) { user = data; getOrderByUser(user.id, function (order) { res.render({ user: user, order: order }); }); });
});
第36页
app.get(‘/users/:id’, function (req, res) { getUser(function (req.param(‘id’), data) { var user = data; getOrderByUser(user.id, function (order) { res.render({ user: user, order: order }); }); });
});
第37页
‘use strict’; app.get(‘/users/:id’, function (req, res) {
getUser(function (req.param(‘id’), data) { var user = data; getOrderByUser(user.id, function (order) { res.render({ user: user, order: order }); });
}); });
第38页
那些坑
• HTTP • 异常处理 • 内存泄露 • 多核优化, 部署 • ⼀一些⼯工具: 开发, 调试, 性能调优
第39页
• node • pm2 • NODE_ENV
第40页
那些坑
• HTTP • 异常处理 • 内存泄露 • 多核优化, 部署 • ⼀一些⼯工具: 开发, 调试, 性能调优
第41页
• npm • node inspector • webkit-devtools-agent • console.trace
第42页
perfectworks@gmail.com @__pw__ lostjs.com