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;
       }
    }
复制代码

转载于:https://juejin.im/post/5ab354de51882555791890bb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值