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

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

  • 读取静态文件
  • 访问目录可以自动寻找下面的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手把手的构建一个静态文件服务器,那么废话不多说,开发流程走起来,我们先看一下将要做的这...
    嘿_那个谁阅读 1,189评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,812评论 25 709
  • 支持功能: 读取静态文件 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出...
    lihuanji阅读 419评论 0 0
  • 背景 学习服务端知识,入门就是要把文件挂载到服务器上,我们才能去访问相应的文件。本地开发的时候,我们也会经常把文件...
    小武song阅读 586评论 0 1
  • 文/仲先生 书接上文。 前情回顾:Miss Li择业记-13 1. 鱼池边上,我收近鱼杆,把那条“俘获”的鱼放进篮...
    仲虺阅读 264评论 0 2