美文网首页
从手写node静态文件服务器开始

从手写node静态文件服务器开始

作者: duffy990 | 来源:发表于2018-03-18 00:23 被阅读0次

说明一下这个静态支持功能:

  • 读取静态文件
  • 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出
  • 文件列表
  • MIME类型支持
  • 缓存支持/控制
  • 支持gzip压缩
  • Range支持,断点续传
  • 全局命令执行
  • 子进程运行

其中 Range支持,断点续传和子进程运行将过有空补上,最近赶项目,嘿嘿~

如何发布自己的npm包

  1. 注册npm
  2. 登陆之后验证你的邮箱
  3. 代码提交github
  4. 进入项目跟目录,命令行 npm -y生成package.json文件
  5. npm adduser 输入完用户名,密码,邮箱后没有错误信息就完成了
  6. 发布包 npm publish

下面是我的静态服务器,安装方法:

npm install df-server

项目github地址

创建服务读取静态文件

首先引入http模块,创建一个服务器,并监听配置端口:

const http = require('http');
    
    const server = http.createServer();
    
    // 监听请求
    server.on('request', request.bind(this));
    
    server.listen(config.port, () => {
        console.log(`静态文件服务启动成功, 访问localhost:${config.port}`);
    });

写了一个专门的方法 ,读取静态文件

 async request(req, res) {
        let { pathname } = url.parse(req.url)
        let filepath = path.join(this.config.root, pathname);
        try {
            let statObj = await stat(filepath);
            if (statObj.isDirectory()) {//如果是目录的话,应该显示目录 下面的文件列表
                let files = await readdir(filepath);
                files = files.map(file => ({
                    name: file,
                    url: path.join(pathname, file)
                }));
                let html = this.list({
                    title: pathname,
                    files
                });
                res.setHeader('Content-Type', 'text/html');
                res.end(html);
            } else {
                this.sendFile(req, res, filepath, statObj);
            }
        } catch (e) {
            this.sendError(e, req, res)
        }

关于MIME类型支持

利用mime模块得到文件类型,并设置编码:

res.setHeader('Content-Type', mime.getType(filepath) + ';charset=utf-8');

关于处理压缩

浏览器请求头中,都会携带自己的压缩类型,最常用的两种是gzip和deflate,服务端可以根据Accept-Ecoding头来返回响应的压缩资源 具体实现代码:

getEncoding(req,res){
       let acceptEncoding = req.headers['accept-encoding'];
       if(/\bgzip\b/.test(acceptEncoding)){
           res.setHeaders('Content-Encoding','gzip');
           return zlib.createGzip();
       }else if(/\bdeflate\b/.test(acceptEncoding)){
           res.setHeader('Content-Encoding', 'deflate');
           return zlib.createDeflate();
       }else{
           return null;
       }
    }

详细的请看github地址

相关文章

  • 从手写node静态文件服务器开始

    说明一下这个静态支持功能: 读取静态文件 访问目录可以自动寻找下面的index.html文件, 如果没有index...

  • java Socket 实现多线程静态文件服务器

    关于静态文件服务器,我觉得博文共赏:Node.js静态文件服务器实战写的不错,简单易懂,思路清晰,不过使用Node...

  • 使用Node.js搭建简单静态文件服务器

    这半个多月一直在学Node.js,还是在入门阶段,不过已经对Node很感兴趣了。这里介绍一个简单的静态文件服务器,...

  • node 创建静态文件服务器

    创建静态文件服务器既要用到 Node 内置的功能,也要用第三方的 mime 附加模块来确定文件的 MIME 类型。...

  • 通过手写文件服务器,说说前后端交互

    前言 最近用node写了一个静态文件服务器(已发布到npm),想通过这个小例子说说前后端基于HTTP协议交互过程中...

  • 实战node静态文件服务器

    支持功能: 读取静态文件 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出...

  • 手写Node资源文件服务器

    想写静态资源服务器,首先我们需要知道如何创建一个http服务器,它的原理是什么 http服务器是继承自tcp服务器...

  • flask

    如何使用flask做vue的静态文件服务器? 原理: 让flask的静态文件与模板文件的根目录指向vue的静态文件...

  • Nginx笔记

    基本使用 添加一个静态文件服务器, 并以目录方式呈现

  • node手写静态资源服务器

    背景 学习服务端知识,入门就是要把文件挂载到服务器上,我们才能去访问相应的文件。本地开发的时候,我们也会经常把文件...

网友评论

      本文标题:从手写node静态文件服务器开始

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