我们今朝读取文件返回给赏识器的操纵是通过readFile一次性读出来,一次性返回,这样虽然可以实现成果,但我们有更好的方法——用stream(流)举办IO操纵。stream并不是node.js独占的观念,而是操纵体系最根基的一种操纵情势,以是理论上讲,任何一门server端说话都实现了stream的API。
为什么讲用stream是一种更好的方法?由于一次性读取、操纵大文件,内存和收集是吃不用的,尤其在用户会见量较量大的环境下更为明明;而借助stream可以让数据活动起来,一点一点操纵,从而晋升机能。代码修改如下:
- if (stats.isFile()) {
- //是文件,返回文件内容
- //在createServer时传入的回调函数被添加到了"request"变乱上,回调函数的两个形参req和res
- //别离为http.IncomingMessage工具和http.ServerResponse工具
- //而且它们都实现了流接口
- let readStream = fs.createReadStream(_path);
- readStream.pipe(res);
- }
编码实现很是简朴,在必要返回文件内容时,我们建设了一个可读流,并把它直接导向了res工具。
2. gzip压缩
gzip压缩带来的机能(用户会见体验)晋升长短常明明的,尤其在当下spa应用大行其道的期间,开启gzip压缩,可以大幅减小js、css等文件资源的体积,晋升用户会见速率。作为一个静态资源处事器,我们虽然要加上这个成果。
node中有一个zlib的模块,提供了许多压缩相干的api,我们就用它来实现:
- const zlib = require("zlib");
- if (stats.isFile()) {
- //是文件,返回文件内容
- res.setHeader("content-encoding", "gzip");
- const gzip = zlib.createGzip();
- let readStream = fs.createReadStream(_path);
- readStream.pipe(gzip).pipe(res);
- }
有了stream的行使履历,我们再看这段代码的时辰就好领略多了。把文件流先导向gzip工具,再导向res工具。另外,行使gzip压缩的时辰还必要留意一点:必要把相应头里的content-encoding配置为gzip。不然赏识器会把一堆乱码展示出来。
3. http缓存
缓存这个对象让人又爱又恨,用得好,可以晋升用户体验,减轻处事器压力;用得欠好,也许就谋面对各类百般奇稀疏怪的题目。一样平常来讲赏识器http缓存分为强缓存(非验证性缓存)和协商缓存(验证性缓存)。
什么叫强缓存呢?强缓存是由cache-control和expires两个首部字段节制的,,此刻一样平常用cache-control。好比我们配置了cache-control: max-age=31536000的相应头,就是汇报赏识器这个资源有一年的缓存期,一年内不消向处事端发送哀求,直接从缓存中读取资源。
而协商性缓存是行使if-modified-since/last-modified、if-none-match/etag等首部字段,共同强缓存,在强缓存没有掷中(或奉告赏识器no-cache)的时辰,向处事器发送哀求,确认资源的有用性,抉择从缓存中读取或是返回新的资源。
有了以上观念,我们便可以拟定我们的缓存计策:
- if (stats.isFile()) {
- //是文件,返回文件内容
- //增进判定文件是否有窜改,没有窜改返回304的逻辑
- //从哀求头获取modified时刻
- let IfModifiedSince = req.headers["if-modified-since"];
- //获取文件的修他日期——时刻戳名目
- let mtime = stats.mtime;
- //假如处事器上的文件修改时刻小于便是哀求头携带的修改时刻,则认定文件没有变革
- if (IfModifiedSince && mtime <= new Date(IfModifiedSince).getTime()) {
- //返回304
- res.writeHead(304, "not modify");
- return res.end();
- }
- //第一次哀求或文件被修改后,返回给客户端新的修改时刻
- res.setHeader("last-modified", new Date(mtime).toString());
- res.setHeader("content-encoding", "gzip");
- let reg = /.html$/;
- //差异的文件范例配置差异的cache-control
- if (reg.test(_path)) {
- //我们对html文件执行每次必需向处事器验证资源有用性的计策
- res.setHeader("cache-control", "no-cache");
- } else {
- //我们对别的的静态资源文件采纳强缓存计策,一个月内无需向处事器索取
- res.setHeader("cache-control", `max-age=${1 * 60 * 60 * 24 * 30}`);
- }
- //执行gzip压缩
- const gzip = zlib.createGzip();
- let readStream = fs.createReadStream(_path);
- readStream.pipe(gzip).pipe(res);
- }
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|