实现思路
- 引入必要模块:在Node.js中,使用
http
模块创建HTTP服务器,使用url
模块解析URL,构建路由系统需要一个对象来存储路径和对应的处理函数映射。
- 创建服务器实例:通过
http.createServer
方法创建服务器实例,在请求事件回调中处理请求。
- 解析请求路径:利用
url.parse
方法解析请求URL,获取路径部分。
- 匹配路由:根据解析出的路径,在路由映射对象中查找对应的处理函数。
- 处理请求并响应:调用匹配到的处理函数,处理请求并向客户端返回响应。
核心代码示例
const http = require('http');
const url = require('url');
// 路由映射对象
const routes = {};
// 定义路由注册函数
function registerRoute(path, handler) {
routes[path] = handler;
}
// 处理请求
function handleRequest(req, res) {
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
const handler = routes[path];
if (handler) {
handler(req, res);
} else {
res.statusCode = 404;
res.end('Not Found');
}
}
// 创建服务器
const server = http.createServer(handleRequest);
// 示例路由注册
registerRoute('/', (req, res) => {
res.statusCode = 200;
res.end('Home Page');
});
registerRoute('/about', (req, res) => {
res.statusCode = 200;
res.end('About Page');
});
// 监听端口
const port = 3000;
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
优化路由性能
- 使用高效数据结构:如果路由数量较多,可以考虑使用更高效的数据结构,例如前缀树(Trie树)。Trie树可以在匹配路径时更快地定位到目标路由,特别是对于有共同前缀的路径。
- 缓存路由匹配结果:对于一些静态不变的路由,可以缓存匹配结果。在请求到达时,先检查缓存中是否有该路径的处理函数,若有则直接使用,避免重复查找。
- 按路由访问频率排序:将经常访问的路由放在路由映射对象靠前的位置,这样在匹配路由时,能更快找到处理函数,减少平均查找时间。
- 使用中间件分层处理:将一些通用的处理逻辑(如日志记录、身份验证等)提取成中间件,在进入具体路由处理函数之前进行处理,这样可以避免在每个路由处理函数中重复编写相同代码,提高代码复用性和可维护性,间接提升性能。