摘要:前言之前對的整體設計有過自己的理解,在中方便的插件機制也是這個框架的一大亮點,本文主要就是從的插件開始,對后臺中的插件機制做一些分析和總結。插件的特點它包含了中間件配置框架擴展等等。插件其余部分的運行原理也是類似的。
前言
之前對egg.js的整體設計有過自己的理解,在egg.js中方便的插件機制也是這個框架的一大亮點,本文主要就是從egg.js的插件開始,對node后臺中的插件機制做一些分析和總結。
插件在koa的項目中可以發現有大量的中間件的使用,常見的中間件可以用來做,鑒權,請求的參數合并,錯誤的統一處理等等。
中間件的特點大概總結一下就是:
會對請求進行處理,并且影響在請求上
中間件有自己的加載順序,不同的順序可能會帶來不同的結果,整個koa形成了一個類似洋蔥圈的模型
這樣就會發現整個項目中確實有一些部分的功能不適合放到中間件中,比如與請求無關的功能,需要在初始化中就執行的功能,需要管理中間件功能的功能,這個時候就需要用到插件的功能了。
egg插件的特點:
它包含了 Service、中間件、配置、框架擴展等等。
它沒有獨立的 Router 和 Controller。
基本上插件和一個獨立的應用沒有多大的區別。
插件的加載前面說到了egg的插件其實可以直接看作是一個小的應用,從目的上可以當作是一些公共功能的egg應用的抽象,那么這些插件究竟是如何被使用的呢?
首先是整個egg的應用的加載,可以從源碼中看到分為了三個部分
/** * loadUnit is a directory that can be loaded by EggLoader, it has the same structure. * * The order of the loadUnits: * * 1. plugin * 2. framework * 3. app */ getLoadUnits() { const dirs = this.dirs = []; if (this.orderPlugins) { for (const plugin of this.orderPlugins) { dirs.push({ path: plugin.path, type: "plugin", }); } } // framework or egg path for (const eggPath of this.eggPaths) { dirs.push({ path: eggPath, type: "framework", }); } // application dirs.push({ path: this.options.baseDir, type: "app", }); return dirs; }
運行的結果
[ { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-session", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-security", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-jsonp", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-onerror", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-i18n", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-watcher", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-multipart", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-development", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-schedule", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-logrotator", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-static", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-view", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-sequelize", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-view-art", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg-validate", type: "plugin" }, { path: "/Users/qitmac000458/Workspace/developer/node_modules/egg", type: "framework" }, { path: "/Users/qitmac000458/Workspace/developer", type: "app" } ]
可以認為這每一個都是一個獨立的app,之后就是如何把這些應用整合成一個app。那么簡單的來看,只看app.js的整合吧
loadFile(filepath, ...inject) { if (!fs.existsSync(filepath)) { return null; } const ret = utils.loadFile(filepath); // function(arg1, args, ...) {} if (inject.length === 0) inject = [ this.app ]; return isFunction(ret) ? ret(...inject) : ret; } loadCustomApp() { this.getLoadUnits() .forEach(unit => this.loadFile(path.join(unit.path, "app.js"))); },
再回憶一下app.js的一般寫法,也就是
module.exports = app => { do something };
這樣插件中的每個app.js就都得已運行,并且運行順序也就很容易知道,是和getLoadUnits的運行結果是一致的。插件其余部分的運行原理也是類似的。
總結在了解了整個egg插件機制后,編寫一個插件其實就變得很容易了,或者說后面可以從業務代碼中直接沉淀出一整個功能作為一個插件。
egg的插件的加載幾乎是復用了整個loader,將插件的功能于原本app的業務功能實現了解耦,而又保持了一個egg微應用的整體結構,這塊的設計也是很值得學習的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93341.html
摘要:項目擴展自定義日志中間件封裝好之后,在實際項目應用中我們還需要一步操作,提供了框架擴展功能,包含五項,可以對這幾項進行自定義擴展,對于日志因為每次日志記錄我們需要記錄當前請求攜帶的做一個鏈路追蹤,需要用到是的請求上下文擴展項。 快速導航 [Logger-Custom] 需求背景 [Logger-Custom] 自定義日志插件開發 [Logger-Custom] 項目擴展 ...
摘要:是阿里推出的基于的開發框架,今天抽空體驗了下,按官方教程做一個。用于解析用戶的輸入,處理后返回相應的結果,具體參見。用于編寫業務邏輯層,可選,建議使用,具體參見。和用于自定義啟動時的初始化工作,可選,具體參見啟動自定義。 egg.js是阿里推出的基于koa的node開發框架,今天抽空體驗了下,按官方教程做一個Hacker News。其實官方有腳手架提供,但是這次我們不用。 開始之前,我...
摘要:如果需要在構造函數做一些處理,一定要有這句話,才能保證后面的使用。文件夾里面存放工具類引用拿到內置對象也就是進入這個文件頁面渲染使用的是頁面模板在里面添加添加渲染 egg.js是什么 是一個node.js的后臺web框架,類似的還有express,koa 優勢:規范、插件機制Egg.js約定了一套代碼目錄結構(配置config、路由router、擴展extend、中間件middlewa...
閱讀 4983·2021-11-25 09:43
閱讀 1685·2021-10-27 14:18
閱讀 1057·2021-09-22 16:03
閱讀 1349·2019-08-30 13:19
閱讀 1572·2019-08-30 11:15
閱讀 1645·2019-08-26 14:04
閱讀 3124·2019-08-23 18:40
閱讀 1166·2019-08-23 18:17