本节我们将分析 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内部玩玩啦!
网友评论