前言
本文的主要内容是通过描述作者自己学习koa源代码的过程,来和大家一起来学习koa的源码,koa设计的初衷是 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石,说白了就是 小巧 ,扩展性高所以koa的源码阅读起来也相对容易,如果你跟着我的文章学习 还学不会那么一定是我写的不好。
为什么要阅读源码
先说一下为什么要进行源码的学习,主要就两点:
- 提升对koa甚至egg(基于koa)的理解
- 提升自身编码能力
我觉得看源码的学习效率远远比单纯的学习原理概念更高(仅仅为了面试就当我没说),如果你学习过很多js的原理、概念、高阶用法但是发现实际项目中很少用到,通过阅读源码可以在高质量的开源项目中学习大神们是怎么应用这些技巧,如果你想提升你的编程能力,阅读源代码是非常好的的方式。
准备工作
准备工作比较简单
- 下载koa源码:
git clone https://github.com/koajs/koa.git
- 打开node文档:http://nodejs.cn/api/
- 启动一个koa项目:不会启动的自己上官网看一下 https://koa.bootcss.com/
注:本文不会先阐述koa思想,而是在代码学习的过程中学习思想
整体结构
源码已经准备就绪,我们先来看一下目录结构。
我在文章中会描述一些我学习koa源码使用的方法,和我对其的理解,难免有错漏请见谅。
通过我们打开了源码的目录结构,但是一下子看到很多的文件夹和文件不知从何入手怎么办?
一、不要慌,先看看自己有哪些认识的文件
- package.json(项目基本信息)
- readme.md(基本介绍)
- LICENSE、(开源协议相关)
- History.md(历史信息)
- AUTHORS(贡献者信息)
- .gitignore(git忽略配置)
二、再看一些虽然可能没有写过但是一定很眼熟的
- eslintrc.yml (eslint配置相关)
- .editorconfig (编辑器格式约定)
那么剩下的可能我们不认识但是不妨碍根据上面的信息我们推测,应该也都是某种配置或者信息记录。
三、我们再来看一下文件夹相关的信息,还是先从知道的下手。
文件夹很少除了.github外只有4个 test(测试相关) 、doc(文档相关) 这两个文件夹应该都可以看出来。
benchmarks可能不太常见,但是我们google一下就发现是验证性能以及基准数据用的对我们想要阅读源码来说影响不大。
而lib一般在前端工程中都是被调用的程序集(很多情况下都是将src编译后生成)。
了解了目录信息,从哪个文件看起
通过我们看到一个项目都是从 package.json 看起
我们通过package.json 可以获得基本描述信息、脚本信息、依赖 等等。
(如果对package.json不了解的同学可以先找一下文档简单学习一下)
打开package.json一眼就看到对现在的我们最重要的信息 位于第5行的
"main": "lib/application.js"
找到了入口文件,位于lib目录下的application.js
lib目录
通过上面的分析我们了解到其他的目录都是测试或者文档相关的,那么这个lib目录此时就显得非常关键。
打开lib目录发现这个目录没有子目录且只有4个文件。
这个时候我们先启动一个最基础的koa项目--hello world
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
同时我们知道入口文件 是 lib/application.js,由此我们得知上面代码中第一行 const Koa = require('koa')导出的Koa 指的就是这个 application.js 文件。
点开 application.js 文件发现是没有编译过的js文件(通常lib中的文件都是src文件编译过的不具有可读性),然后我打开了Koa项目(不是源码项目)中的node_module中的koa文件,发现那里面的lib文件和源码中的完全一样。
至此,我们可以确定Koa项目是不编译的,导出使用的就是源码,所以没有src目录只有lib目录,lib目录的内容就是源码。而且只有4个文件加一起只有不到2000行,真的是足够小巧精干。
总结
本篇目录结构我们先分析到这里,下一篇会讲述关于application.js的内容,本文完全按照作者自己学习源码的过程进行描述,文笔不好读起来可能会有一点流水账,但是作者会努力描述清楚,并且把阅读源码的一些方法技巧分享,请收藏点赞支持。
相关文章
手把手和你一起学习Koa源码(二)——Appilication
本文使用 mdnice 排版