SpaceX-API開源已久, 一度想要好好寫一篇關於它的源碼剖析文章, 可拖延症當頭, 一直未能動筆. 趁著一年之始, 好好寫一篇學習文章, 就當作2021年一個好的開頭吧.
02-Project-Introduction開始讀SpaceX-API之前, 讓我們先簡單了解一下SpaceX是什麼? SpaceX-API又是什麼?
SpaceX是一家傳奇的民營航天製造商. 伴隨隨著它旗下的獵鷹系列火箭在2018年將特斯拉送入太空而一舉成名. 其高性能可回收低成本特性在當時震驚了整個業界. SpaceX的多項第一預示著它達成了很多國家航天機構未能達成的成就. 而它除了民營這個特殊標籤外, 還有一個特殊標籤——它是第一個以軟體工程開發方式來開發火箭的航天機構.SpaceX-API即是它軟體工程下的一個產物.
SpaceX-API是用來控制SpaceX下火箭,核心艙,太空艙,發射臺和發射信息的後臺程序. 它基於Nodejs的koa框架, 採用Rest API結構, 加上Redis和MongoDB 做數據緩存與存儲來實現火箭各模塊之間的核心交互. 它的代碼整體來說是比較優雅乾淨的, 並且由於是較新的項目, 也符合現代Nodejs的風格, 很少會有以前JS上的一些編程陋習和包袱. SpaceX-API在去年6月剛開源的時候成功火爆了nodejs社區, 並登頂github熱榜.
03-Dependence-Introduction輔助編程類blake3: hash生成器
cheerio: 移除dom和瀏覽器相關部分的jQuery, 可以比較方便的處理html標籤及其內容
cron: schedule job, 相比於原生的node timer有以下三點優勢 1.接受的時間種類更廣 2.支持創建child_process來做定時任務
fuzzball: 字符串模糊查找
lodash: 編程實用工具庫
moment-range: 時間範圍上的工具庫, 比如判斷合併兩個時間段或者判斷某個時間是否在指定時間範圍內等等.SpaceX這裡用來通過比較數據的時間做數據版本的管理
moment-timezone: 時區
tle.js: 處理衛星經緯度相關的庫
b.Io類got: http request庫
tough-cookie: http cookie的set/get
pino: 日誌庫. (除此之外還有一些比較常見的日誌庫morgan, winston, log4js, bunyun, 各有優劣, 展開不述, 相關差別可見: https://zhuanlan.zhihu.com/p/85815779)
ioredis: redis中間件
mongoose: mongodb中間件
mongoose-id: 用id替換mongodb中的_id的mongoose插件
mongoose-paginate-v2: 用於mongo數據分頁的mongoose插件, 直接在查詢本身時改變返回值鍵而不用做額外處理
c.Koa類koa: koa框架核心
koa-bodyparser: koa對於http request body部分的解析模塊
koa-conditional-get: 可以配合koa-etag使用, 條件式請求, 常見實現有 Last-Modified 和 ETag
koa-etag: koa etag模塊, 用於檢查http請求的resource版本, 提高緩存效率
koa-helmet: 字面意思, 給http加一個頭盔. 即使用一些http header來保護這個koa應用
koa-router: koa路由模塊
koa2-cors: 處理跨域問題
koa-pino-logger: koa的pino官方插件, 這裡會根據環境來選擇使用koa-pino-logger還是pino, 沒有本質區別
未完待續, 下一章將講述SpaceX-API的項目結構~
(小小的吐槽一下, 公眾號裡面的排版有點憨憨,不支持markdown = =/)