学习从koa-static中间件搭建静态文件服务器原文地址koa-sendStaticfileservingmiddlewarekoa-static声明它只是对koa-send的一个封装constsend=require('koa-send');app.use(async(ctx)=>{awaitsend(ctx,ctx.path,{root:__dirname+'/public'});})查看koa-send的源码可以发现它所做的工作就是根据传入的路径查找文件是否存在,存在则创建流,不存在则抛出错误。send函数可以传入第三个参数maxageBrowsercachemax-age,单位毫秒。(默认为0)immutable告诉浏览器资源是不可变的,可以无限期缓存。(默认为false)hidden允许传输隐藏文件。(默认为false)root限制文件访问的根目录。index访问根位置时自动提供的索引文件的名称。(默认为无)gzip当客户端支持gzip并且请求的扩展名为.gz的文件存在时,尝试自动提供文件的gzip版本。(默认为true).brotli当客户端支持brotli并且请求f时,尝试自动提供文件的brotli版本存在扩展名为.br的文件。(默认为true).format如果不为false(默认为true),格式化路径以服务于静态文件服务器并且目录不需要尾部斜杠,这样你就可以同时执行/directory和/directory/.setHeaders函数来设置response.extensions上的自定义标头当URL中没有足够的扩展名时,尝试匹配传递数组中的扩展名以搜索文件。首先找到的服务。(默认为false)可以看看index的作用,其实当我们在地址栏输入http://www.aaa.com/或者http://www.aaa.com/index.html的时候,我们可以发现效果是一样的。原因是配置了索引选项。服务器首先检查你的路径是否以'/'结尾?如果你配置的index选项以'/'结尾,服务器会自动拼接你的path和index选项,如下:consttrailingSlash=path[path.length-1]==='/'...if(index&&trailingSlash)path+=index再看看format的作用。其实我们经常在地址栏输入http://www.aaa.com而不是http://www。aaa.com/但它们的效果是一样的,原因是配置了格式,resolve后的路径返回的是绝对路径,是其中一种状态(文件或文件夹),如果是文件夹,则设置格式(默认为true)和索引,然后自动添加索引stats=awaitfs.stat(path)//格式化路径为静态文件服务器提供服务//目录不需要尾部斜杠,//这样你就可以同时执行`/directory`和`/directory/`if(stats.isDirectory()){if(format&&index){path+='/'+indexstats=awaitfs.stat(path)}else{return}}extensions的作用好像很少见,比如你的a文件夹|-一个|-演示.txt|-演示.json|-demo.html如果你设置了扩展名(假设是['json','txt']),那么你在地址栏输入http://www.aaa.com/a/demo其实就相当于http://www.aaa.com/a/demo.json服务端会先判断你是否设置了扩展名且路径没有以'.**'结尾if(extensions&&!/\..*$/.exec(path)){constlist=[].concat(extensions)for(leti=0;i
