深入浅出Node.js

第五章 内存控制

  • 5.1.3
    V8分配的堆内存在64位和32位下的的最大值分别为1400MB和700MB。堆分为新生代和旧生代两部分。新生内存的最大值在64位系统32位系统上分别为32 MB和16 MB。
  • 5.1.4
    垃圾回收时,新生代中的对象采用Scavenge算法进行垃圾回收
    老生代采用 Mark-Sweep(标记清除) & Mark-Compact(标记整理)回收算法。
  • 5.4
    通常,造成内存泄漏的原因有如下几个:
    • 缓存
    • 队列消费不及时
    • 作用域未释放

第八章

8.1.6 缓存

If-Modified-Since/Last-Modified

缺点:只能精确到秒级,更新频繁的内容则无效,文件的时间戳改动文件内容不一定改动。

1
2
3
4
5
6
7
if (lastModified === req.headers['if-modified-since']) {
res.writeHead(304, "Not Modified");
res.end();
} else {
fs.readFile(filename, function(err, file) {
var lastModified = stat.mtime.toUTCString();
res.setHeader("Last-Modified", lastModified);
HTTP1.1中引入了ETag来解决这个问题, If-None-Match/ETag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var handle = function (req, res) {
fs.readFile(filename, function(err, file) {
var hash = getHash(file);
var noneMatch = req.headers['if-none-match'];
if (hash === noneMatch) {
res.writeHead(304, "Not Modified");
res.end();
} else {
res.setHeader("ETag", hash);
res.writeHead(200, "Ok");
res.end(file);
}
});
};
Cache-Control(http1.1)
设置了 max-age,它比Expires 优秀的地方在于, Cache-Control能解决客户端与服务端时间不同步带来的不一致性问题,由于在HTTP1.0时还不支持max-age ,如今的服务器端同时支持对Expires和Cache-Control进行设置,此时max-age会覆盖Expires。

清除缓存

每次发布,路径中跟随Web应用的版本号:http://url.com/?v=20130501。
每次发布,路径中跟随文件内容的hash: http://url.com/?hash=afadfadwe。

8.2 数据上传

表单数据

  • 默认的表单提交,请求头中的 Content-Type为 application/x-www-form-urlencoded,如:Content-Type: application/x-www-form-urlencoded
  • JSON和XML文件,JSON文件的Content-Type为 application/json ,XML的为application/xml
    需要注意的是,在 Content-Type 中可能还附带如下的编码信息:
    Content-Type: application/json; charset=utf-8

8.2.3 附件上传

1
2
Content-Type: multipart/form-data; boundary=AaB03x
Content-Length: 18231

8.2.4 数据上传与安全

  1. 内存限制
    限制上传内容的大小,一旦超过限制,停止接收数据,并相应400状态码
    通过流式解析,将数据导向磁盘中,Node只保存文件路径等小数据

8.5 页面渲染

  1. MIME
    MIME的全称是Multipurpose Internet Mail Extensions,最早用在电子邮件中,后来也用到浏览器中。不同的文件类型有不同的MIME,浏览器也有相应不同的处理方式。
  2. 附件下载
    设置Content-Disposition字段:
    即时查看时字段为为 inline ,数据可以存为附件时,值为attachment,如:
    Content-Disposition: attachment; filename="filename.ext"