美文网首页
day4--node的静态资源服务器

day4--node的静态资源服务器

作者: 3feeb4458361 | 来源:发表于2016-08-10 09:59 被阅读0次

笔记

var http=require("http");//引入http模块
var fs=require("fs");//引入文件读写模块
var url=require("url");//引入url处理模块
var server=new http.Server();//实例化一个服务器对象
//监听请求事件
server.on("request",(req,res)=>{
  var pathname=url.parse(req.url).pathname;//请求路径
  switch(pathname){//路径分析。根据不同的路径返回不同的资源
    case ""||"/":
    
  }
});

作业:完善上的代码,实现一个静态资源服务器。

作用

完善课上的代码实现一个静态资源服务器。

创建三个文件:程序入口文件app.js、资源映射文件mime.js、配置文件config.js

程序入口文件app.js

var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
var zlib = require("zlib");//压缩模块
var mime = require("./mime").types;
var config = require("./config");
var server = new http.Server();
server.on("request", function (request, response) {//监听请求事件
    var pathname = url.parse(request.url).pathname;

    switch(pathname){//路由控制;
        case "/"||"index":
            pathname="/index.html";
            break;
    }

    var realPath = path.join("assets", path.normalize(pathname));
    var ext = path.extname(realPath);//解析文件的后缀名;
    if(ext){//不处理没有后缀名的realPath,这一点交给路由控制;
        fs.stat(realPath, function (err, stat) {//读取文件属性
            if (err) {//如果没找到文件返回404
                response.writeHead(404, "Not Found", {'Content-Type': 'text/plain'});
                response.write("NOT FOUND on this server");
                response.end();
            } else {
                ext = ext.slice(1);
                var contentType = mime[ext] || "text/plain";
                response.setHeader('Content-Type', contentType);
                var lastModified = stat.mtime.toUTCString();//文件的最后修改时间
                response.setHeader("Last-Modified", lastModified);
                if (ext.match(config.Expires.fileMatch)) {//缓存
                    var expires = new Date();
                    expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
                    response.setHeader("Expires", expires.toUTCString());
                    response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
                }
                if (request.headers["if-modified-since"] && lastModified == request.headers["if-modified-since"]) {//判断文件是否修改过
                    response.writeHead(304, "Not Modified");
                    response.end();
                } else {如果修改过或者第一次传输则返回文件
                    var raw = fs.createReadStream(realPath);
                    var ae = request.headers["accept-encoding"] || "";//获取浏览器支持的压缩格式
                    var matched = ext.match(config.Compress.match);
                    if (matched && ae.match(/\bgzip\b/)) {
                        response.writeHead(200, "ok", {"Content-Encoding": "gzip"});
                        raw.pipe(zlib.createGzip()).pipe(response);
                    } else if (matched && ae.match(/\bdeflate\b/)) {
                        response.writeHead(200, "ok", {"Content-Encoding": "deflate"});
                        raw.pipe(zlib.createDeflate()).pipe(response);
                    } else {//如果不支持压缩,则直接传输
                        response.writeHead(200, "ok");
                        raw.pipe(response);
                    }
                }
            }
        });
    }else{//如果没有后缀名,则直接断开连接
        response.end();
    }
});
server.listen(3000);

资源映射文件mime.js

exports.types = {

    "css": "text/css",

    "gif": "image/gif",

    "html": "text/html",

    "ico": "image/x-icon",

    "jpeg": "image/jpeg",

    "jpg": "image/jpeg",

    "js": "text/javascript",

    "json": "application/json",

    "pdf": "application/pdf",

    "png": "image/png",

    "svg": "image/svg+xml",

    "swf": "application/x-shockwave-flash",

    "tiff": "image/tiff",

    "txt": "text/plain",

    "wav": "audio/x-wav",

    "wma": "audio/x-ms-wma",

    "wmv": "video/x-ms-wmv",

    "xml": "text/xml"

};

配置文件config.js

exports.Expires = {//缓存
  fileMatch: /^(gif|png|jpg|js|css)$/ig,//需要缓存的文件类型
  maxAge: 60*60*24*365//到期时间
};
exports.Compress={//需要压缩传输的文件类型
  match:/css|js|html/ig
};

相关文章

  • day4--node的静态资源服务器

    笔记 作业:完善上的代码,实现一个静态资源服务器。 作用 完善课上的代码实现一个静态资源服务器。 创建三个文件:程...

  • java完成ftp传输(将文件上传至静态资源服务器)

    Nginx实现静态资源服务器 apache实现静态资源服务器 参考文章记录 JavaWeb静态资源分离思路 jav...

  • 场景实践篇

    静态资源web服务 静态资源 定义 非服务器动态生成的文件 静态资源服务场景-CDN 文件读取配置 sendfil...

  • 07.Nginx静态资源配置

    1.静态资源类型 Nginx 作为静态资源 Web 服务器部署配置, 传输⾮常的⾼效, 常常⽤于静态资源处理, 请...

  • Python mini-web框架1:WSGI-mini-web

    总体内容 1、多进程-web服务器面向对象web服务器,返回的是静态界面 2、静态资源、动态资源、web服务器支持...

  • Nginx开启gzip压缩

    配置nginx 现在博客是通过hexo生成public静态资源上传到阿里云服务器,用nginx作为静态资源服务器的...

  • nginx能做什么好玩的事情?

    一、HTTP服务器 Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,...

  • Nginx从入门到实践(二)

    静态资源web服务 静态资源类型 CDN CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问...

  • CGI是什么

    CGI 早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。...

  • HTML服务端渲染(SSR)和客户端渲染(CSR)

    服务器端渲染需要消耗更多的服务器资源(CPU,内存等),js动态生成静态html 客户端渲染可以将静态资源部署到静...

网友评论

      本文标题:day4--node的静态资源服务器

      本文链接:https://www.haomeiwen.com/subject/opzdsttx.html