美文网首页
3.4 分析koa-static的源码

3.4 分析koa-static的源码

作者: 空无一码 | 来源:发表于2019-01-03 03:26 被阅读13次

本节我们将分析 koa-static 的源码。重点不在 熟记源码,而是掌握源码分析的方法。

如何看源码?

一般基于node开发时,我们有以下几种方式查看源码:

  • 在项目根目录下的node_modules 找到对应的依赖库查看,一般只包含核心文件,package.json文件,Readme文件和历史版本文件,通常我们会在代码编辑器中,先通过readme简单查看其介绍,然后通过package.json文件查看依赖库引用的有关依赖库,最后才去看依赖库的代码;
  • 在项目代码中 使用该依赖库 的地方 打断点,此时一般我们都是通过在浏览器打断点,node项目在支持的编辑器打断点,直接在运行到该断点时跳入依赖库源码的入口,然后简单浏览一下整个文件,然后在需要的地方再打断点,通过变量的变化和代码的执行理解依赖库的内部原理,比较直观,特别是便于理解复杂的依赖库;
  • 到依赖库的 源码 托管仓库,如github上查看,我们可以通过在npm上搜索找到该依赖库,然后查看你源码的托管网址,也可以在node_modules下的package.json 或 Readme 文件找到其仓库地址,这种方式比较利于参与系统掌握源码,并参与源码的开发维护。

选择哪种方式,可以根据实际情况而定,不过不管通过哪种方式看源码,都有以下建议:

  • 一是要抓住重点,而不是所有都看;
  • 二是要带着问题去看,有方向看起来才有思路。

koa-static 是如何设置默认请求文件的?

为何我们的请求url中并不包含index.html文件,而我们通过浏览器请求服务器的根路径时却返回了该文件,并且还正常展示了。

我们就带着这个问题通过方式一去看,在项目根目录下的node_modules 找到koa-static这个文件夹, 通过tree命令看到它包含了如下四个文件:

.
├── History.md
├── Readme.md
├── index.js
└── package.json

其中Readme.md介绍它是一个基于koa-send封装的静态文件处理中间件,并给出了使用方式,和有关的参数列表及作用。而package.json中的dependencies选项也确实主要就是koa-send。

然后查看依赖库的代码文件的核心部分:

const send = require('koa-send') // 11行
module.exports = serve // 17行

function serve (root, opts) {
 opts = Object.assign({}, opts)
 opts.root = resolve(root)
 if (opts.index !== false) opts.index = opts.index || 'index.html'
 if (!opts.defer) {
   return async function serve (ctx, next) {
     let done = false
     if (ctx.method === 'HEAD' || ctx.method === 'GET') {
       try {
         done = await send(ctx, ctx.path, opts)
       } catch (err) { if (err.status !== 404) { throw err } }
     }
     if (!done) { await next()}
   }
 }
 return async function serve (ctx, next) {
   await next()
   if (ctx.method !== 'HEAD' && ctx.method !== 'GET') return
   if (ctx.body != null || ctx.status !== 404) return // eslint-disable-line
   try {
     await send(ctx, ctx.path, opts)
   } catch (err) { if (err.status !== 404) { throw err } }
 }
} 

可以看到koa-static 向外提供了一个函数serve,接受两个参数,第一个参数为路径root,类型为字符串,第二个参数为配置项opts,类型为对象,Readme.md文件中提到它包括八个参数,但是koa-static只用到了其中的两个index和defer,其他六个要传给其依赖库koa-send去处理。

其中index这个配置项就决定了如果我们没有显示传入 index为false的时候,就会执行opts.index = opts.index || 'index.html',因为我们没有传入opts, 所以opts.index 为undefined,所以就把'index.html'付给它了。koa-send就会去传入的静态文件目录root下寻找改文件,找到后返回给浏览器。

以上,我们就解决我们的疑惑,当然他是怎么匹配各种文件类型的,这就需要去看koa-send的源码了,层层深入,无穷无尽,这里就不一致追根到底了,大家举一反三,按照我们分析源码的方法就能解决这个疑惑。

正确使用依赖库

依赖库虽然能大大提高我们的开发效率,但是也是一个不确定的定时炸弹,所以我们需要合理的使用它,建议如下:

  • 充分调研,通过npm的下载量,github上的issues,维护频繁度,和开发维护团队选择合理的依赖库;
  • 大体浏览,有时间最好能详细查看依赖库的源码及存在的issue,做到心中有数;
  • 参与该依赖库的迭代维护,或者进行二次开发,上传到企业内部的私有npm仓库。

本节到此结束,本章也到此结束,下一章我们将深入koa内部玩玩啦!

相关文章

网友评论

      本文标题:3.4 分析koa-static的源码

      本文链接:https://www.haomeiwen.com/subject/fcexrqtx.html