说明一下这个静态支持功能:
- 读取静态文件
- 访问目录可以自动寻找下面的index.html文件, 如果没有index.html则列出
- 文件列表
- MIME类型支持
- 缓存支持/控制
- 支持gzip压缩
- Range支持,断点续传
- 全局命令执行
- 子进程运行
其中 Range支持,断点续传和子进程运行将过有空补上,最近赶项目,嘿嘿~
如何发布自己的npm包
- 注册npm
- 登陆之后验证你的邮箱
- 代码提交github
- 进入项目跟目录,命令行 npm -y生成package.json文件
- npm adduser 输入完用户名,密码,邮箱后没有错误信息就完成了
- 发布包 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;
}
}
复制代码