});
res.end(html);
}
处理缓存
在前面的一篇文章里我介绍过node处理缓存的几种方式,这里为了方便我只使用的协商缓存,通过ETag来做验证
cacheHandler(req, res, filepath) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(filepath);
const md5 = crypto.createHash('md5');
const ifNoneMatch = req.headers['if-none-match'];
readStream.on('data', data => {
md5.update(data);
}); readStream.on('end', () => {
let etag = md5.digest('hex');
if (ifNoneMatch === etag) {
resolve(true);
}
resolve(etag);
});
readStream.on('error', err => {
reject(err);
});
});
}
处理压缩
通过请求头accept-encoding来判断浏览器支持的压缩方式
设置压缩响应头,并创建对文件的压缩方式
compressHandler(req, res) {
const acceptEncoding = req.headers['accept-encoding'];
if (/bgzipb/.test(acceptEncoding)) {
res.setHeader('Content-Encoding', 'gzip');
return zlib.createGzip();
} else if (/bdeflateb/.test(acceptEncoding)) {
res.setHeader('Content-Encoding', 'deflate');
return zlib.createDeflate();
} else {
return false;
}
}
启动静态服务器
添加一个启动服务器的方法
所有请求都交给this.requestHandler这个函数来处理
监听端口号
start() {
const server = http.createSercer((req, res) => this.requestHandler(req, res));
server.listen(this.port, () => {
if (this.openbrowser) {
openbrowser(`http://${this.host}:${this.port}`);
}
console.log(`server started in http://${this.host}:${this.port}`);
});
}请求处理
通过url模块解析请求路径,获取请求资源名
获取请求的文件路径
通过fs模块判断文件是否存在,这里分三种情况
请求路径是一个文件夹,则调用responseDirectory处理
请求路径是一个文件,则调用responseFile处理
如果请求的文件不存在,则调用responseNotFound处理
requestHandler(req, res) {
// 通过url模块解析请求路径,获取请求文件
const { pathname } = url.parse(req.url);
// 获取请求的文件路径
const filepath = path.join(this.rootPath, pathname); // 判断文件是否存在
fs.stat(filepath, (err, stat) => {
if (!err) {
if (stat.isDirectory()) {
this.responseDirectory(req, res, filepath, pathname);









