从手写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静态文件服务器开始)