• Stars
    star
    392
  • Rank 109,735 (Top 3 %)
  • Language
    JavaScript
  • Created almost 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

流行框架与库的源码分析与最小实现

流行框架与库的源码分析与最简实现

大家好,我是山月,这是我新开的一个坑:手写源码最小实现每一行代码都有注释

当我们在深入学习一个框架或者库时,为了了解它的思想及设计思路,也为了更好地使用和避免无意的 Bug,源码研究是最好的方法。

对于 koavdom 这种极为简单,而应用却很广泛的框架/库,莫不如是。为了验证是否已足够了解它,可以实现一个仅具备核心功能的迷你的库。正所谓,麻雀虽小,五脏俱全。

对于源码,我将尽可能注释每一行代码,并以文章讲述原理与实现过程。目前已实现列表为:

由于目前浏览器对 ESM 已支持良好,对于客户端相关源码使用 ESM 书写,比如 vDOM、React 等。而对于服务端使用 CommonJS 书写,如 koa、express 等。

运行与目录结构

本项目采用 monorepo 进行维护,如果你对它不了解,可直接忽略。

所有的迷你版本实现置于 code 文件夹,源文件置于 index.js 中,示例文件置于两个位置:

  • example.js
  • example/

关于查看及运行示例,请使用命令 npm run example

$ git clone [email protected]:shfshanyue/mini-code.git

# 在 npm v7 中,会对所有 workspace 中的依赖进行安装
$ npm i

# 在 monorepo 中运行某个源码示例
# 或者进入代码目录,再运行示例: cd code/express && npm run example
$ npm run example -w mini-express

如果你对 monorepo 不了解:

$ git clone [email protected]:shfshanyue/mini-code.git

$ npm i
$ cd example/express
$ npm i
$ npm run example

源码之前

在调试了千万遍源码之后,才能对源码稍微理解,摆在这里的问题是:如何调试源码?

TODO: 以前三篇文章,随后附上

  1. 浏览器中如何调试源码?
  2. Node 中如何调试源码?

与我交流

添加我的微信 shanyue-bot:

  • 拉你进仓库对应的源码交流群,和 5000+ 小伙伴们一起交流源码
  • 山月的原创文章与分享

推荐阅读源码清单

以下源码按次序,从易到难进行阅读,否则碰到大块头(比如 React),读不下去,容易怀疑自我,从简单的开始读起,有助于培养自信心

偏客户端

  • ms: 时间转换器,Vercel 出品,周下载量 8000 万,几乎是 npm 下载量最高的 package 之一,从它看起,让你知道看源码/发包其实也很简单。
  • github markdown style: 以为很简单,实际上很难。锻炼 CSS 的最好方法,就是给 markdown 写一个主题。
  • lru-cache: LRU Cache,前端及服务端框架中的常用依赖。
  • tsdx: 零配置的 npm 库开发利器,与 CRA 相似,不过它主要面向库开发者而非业务开发者,了解它是如何提供零配置功能,看懂默认配置做了那些优化,并了解它的所有工具链 (prettier、eslint、size、bundleanalyzer、rollup、typescript、storybook)。
  • create-react-app: React 最广泛的脚手架,读懂三点。一,如何生成脚手架;二,如何实现 eject;三,了解 cra 的所有重要依赖,读懂默认 webpack 配置。
  • webpack (runtime code): 读懂两点。一、打包 cjs/esm 后的运行时代码;二、打包有 chunk 后的运行时代码。
  • axios: 请求库,了解它是如何封装源码且如何实现拦截器的。
  • immer: 不可变数据,可提升做深拷贝时的性能,可应用在 React 中。
  • use-debounce: React 中的一个 debounce hook。减少 React 的渲染次数,可提升性能。
  • react-virtualized: React 中的虚拟列表优化,可提升性能。
  • react-query: 用以请求优化的 react hooks,可提升性能。
  • react-router: React 最受欢迎的路由库
  • redux/react-redux: React 最受欢迎的状态库
  • vite: 秒级启动及热更行,可大幅提升开发体验。
  • vue3: 最难的放到最后边,读懂 vue3 的性能优化体验在哪些方面。
  • react: 最难的放到最后边,读懂 Fiber 及其它所提供的性能优化。

偏服务端

  • koa
  • body-parser: express 甚至是大部分服务端框架所依赖的用以解析 body 的库
  • next
  • ws: 了解 websocket 是如何构造 Frame 并发送数据的 (在此之前可阅读 node/http 源码)
  • serve-handler: 静态资源服务器
  • apollo-server: GraphQL 框架,值得一看
  • node: 最难的放到最后边

其它

  • ws
  • native http server
  • native http client
  • lru cache
  • trie router
  • vdom
  • react
  • redux
  • react-query
  • use-debuounce
  • axios
  • vue
  • vite
  • dataloader
  • mustable
  • parser (re/js/css/md)
  • stream pipeline (nodejs)
  • code highlighter
  • babel
  • html-webpack-plugin
  • react-dnd
  • react-dropzone

More Repositories

1

Daily-Question

互联网大厂内推及大厂面经整理,并且每天一道面试题推送。每天五分钟,半年大厂中
Vue
4,360
star
2

blog

在这里写一些工作中遇到的前端,后端以及运维的问题
JavaScript
1,584
star
3

fp-jargon-zh

函数式编程术语及示例。本项目译自 https://github.com/hemanth/functional-programming-jargon
1,222
star
4

op-note

该仓库已迁移至我的博客 https://github.com/shfshanyue/blog/tree/master/op
804
star
5

2019-ncov

全国新型冠状病毒,肺炎疫情实时省市地图
JavaScript
539
star
6

wechat-chatgpt

基于 ChatGPT/MidJourney 的 AI 助手微信机器人,支持个人微信与企业微信,支持客服模式并实时更新
TypeScript
505
star
7

learn-k8s

k8s实践指南
Shell
106
star
8

node-examples

学习 node.js 最好的示例代码
JavaScript
91
star
9

wechat-bot

一个微信机器人的脚手架
TypeScript
83
star
10

shici

使用 next.js 与 graphql 做一个诗词小站
TypeScript
80
star
11

chatdocs

基于 GPT4 & LangChain,并适用于 PDF/Markdown/Docx/Txt 等任意文件格式的智能知识库 AI 机器人
TypeScript
77
star
12

china-region

根据国家标准《中华人民共和国行政区划代码》即 GB2260 标准制定,用以查看各个省地县的行政区划代码,并支持多级联动查询
TypeScript
76
star
13

cheat-sheets

CSS
65
star
14

tmux-config

my config of tmux, with solarized color theme
63
star
15

feishu-chatgpt

三分钟,将 ChatGPT 飞书机器人、钉钉机器人、企业微信机器人、公众号部署到 vercel 及 docker 等,并同时支持多个应用,可一次性添加多个机器人。
TypeScript
59
star
16

vim-config

Vim for FE
Vim Script
55
star
17

apollo-server-starter

使用 apollo-server 做一个脚手架
TypeScript
54
star
18

markdown-read

Read markdown from URL
TypeScript
47
star
19

simple-deploy

Dockerfile
42
star
20

cra-deploy

JavaScript
36
star
21

tiankui

使用python flask搭建在leancloud上的个人网站,主要用来贴吧自动签到,自动收集帖子。
HTML
28
star
22

tieba_post

python模拟百度贴吧登陆,发帖
Python
27
star
23

ansible-op

山月的服务器配置 ansible 脚本
27
star
24

midash

An alternative to lodash with the same API.
TypeScript
26
star
25

wechat

黑客增长: 从博客引流到公众号
JavaScript
21
star
26

graph

awesome-graph
20
star
27

you-dont-need-vps

有可能你并不需要云服务器
19
star
28

httpstatus

MDX
16
star
29

we-api

微信公众号 API 封装,并且支持 Typescript,并且上传素材自动替换为微信内域名
TypeScript
14
star
30

next-app

Next App Starter
TypeScript
14
star
31

interview-api

关于面试每日一题的 graphql api server
TypeScript
12
star
32

md-to-html-api

API convert markdown to beautiful html.
JavaScript
10
star
33

notebook

网页版记事本,使用vue.js
JavaScript
9
star
34

vercel-api

TypeScript
9
star
35

compose

Dockerfile
8
star
36

graphql-sequelize-starter

JavaScript
8
star
37

promise-utils

Useful utils about promise. (map, filter, retry, sleep
TypeScript
8
star
38

react-rubic

JavaScript
7
star
39

graphql-guide

使用 GraphQL 构建 web 应用
7
star
40

serverless-template-zh

中国云厂商 serverless framework 模板及示例 (更快的访问速度)
TypeScript
7
star
41

diary2

使用requests+bs4做爬虫收集贴吧帖子,在leancloud上使用cron设置定时任务,每天凌晨两点进行更新。爬虫在tiankui项目。
Vue
7
star
42

markdown-theme

Markdown Themes
CSS
5
star
43

cls-session

a cls session impletation using async_hooks
TypeScript
5
star
44

vue-slide

使用vue制作幻灯片应用
HTML
4
star
45

whoami

Tiny node.js webserver that prints os information and HTTP request to output
JavaScript
4
star
46

biweekly

两周做一个项目,或学习一门新技术,或对所学技术系统整理和输出
4
star
47

openai-proxy

openai proxy with vercel、cloudflare、nginx、docker、traefik
TypeScript
3
star
48

Daily-Question-Next

TypeScript
3
star
49

serverless-http

Serverless Http Component for Tencent Cloud
JavaScript
2
star
50

tomato

http://shfshanyue.github.io/tomato/www/
Vue
2
star
51

micro

TypeScript
2
star
52

Grid-Guide-Chinese

[译] Grid 布局完全指南
HTML
2
star
53

react-apollo-starter

JavaScript
2
star
54

plant

JavaScript
2
star
55

resume-docs

如何更好地写简历
MDX
2
star
56

poem

Python
1
star
57

spider

定时备份网页
Python
1
star
58

interview-weapp

TypeScript
1
star
59

shici-weapp

JavaScript
1
star
60

nest-app

TypeScript
1
star
61

assets

个人图床
1
star
62

china-geojson

中国高精度 GeoJSON
JavaScript
1
star
63

http

1
star
64

rubic

一个使用 React 做的魔方
TypeScript
1
star
65

less-circle-menu

使用less做的径向菜单
CSS
1
star