亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

egg.js插件分析

Kahn / 1127人閱讀

摘要:前言之前對的整體設(shè)計有過自己的理解,在中方便的插件機制也是這個框架的一大亮點,本文主要就是從的插件開始,對后臺中的插件機制做一些分析和總結(jié)。插件的特點它包含了中間件配置框架擴展等等。插件其余部分的運行原理也是類似的。

前言

之前對egg.js的整體設(shè)計有過自己的理解,在egg.js中方便的插件機制也是這個框架的一大亮點,本文主要就是從egg.js的插件開始,對node后臺中的插件機制做一些分析和總結(jié)。

插件

在koa的項目中可以發(fā)現(xiàn)有大量的中間件的使用,常見的中間件可以用來做,鑒權(quán),請求的參數(shù)合并,錯誤的統(tǒng)一處理等等。
中間件的特點大概總結(jié)一下就是:

會對請求進行處理,并且影響在請求上

中間件有自己的加載順序,不同的順序可能會帶來不同的結(jié)果,整個koa形成了一個類似洋蔥圈的模型

這樣就會發(fā)現(xiàn)整個項目中確實有一些部分的功能不適合放到中間件中,比如與請求無關(guān)的功能,需要在初始化中就執(zhí)行的功能,需要管理中間件功能的功能,這個時候就需要用到插件的功能了。
egg插件的特點:

它包含了 Service、中間件、配置、框架擴展等等。

它沒有獨立的 Router 和 Controller。

基本上插件和一個獨立的應(yīng)用沒有多大的區(qū)別。

插件的加載

前面說到了egg的插件其實可以直接看作是一個小的應(yīng)用,從目的上可以當(dāng)作是一些公共功能的egg應(yīng)用的抽象,那么這些插件究竟是如何被使用的呢?
首先是整個egg的應(yīng)用的加載,可以從源碼中看到分為了三個部分

/**
   * 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;
  }

運行的結(jié)果

[ { 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" } ]

可以認(rèn)為這每一個都是一個獨立的app,之后就是如何把這些應(yīng)用整合成一個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的運行結(jié)果是一致的。插件其余部分的運行原理也是類似的。

總結(jié)

在了解了整個egg插件機制后,編寫一個插件其實就變得很容易了,或者說后面可以從業(yè)務(wù)代碼中直接沉淀出一整個功能作為一個插件。
egg的插件的加載幾乎是復(fù)用了整個loader,將插件的功能于原本app的業(yè)務(wù)功能實現(xiàn)了解耦,而又保持了一個egg微應(yīng)用的整體結(jié)構(gòu),這塊的設(shè)計也是很值得學(xué)習(xí)的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/93341.html

相關(guān)文章

  • 基于Egg框架的日志鏈路追蹤實踐分享

    摘要:項目擴展自定義日志中間件封裝好之后,在實際項目應(yīng)用中我們還需要一步操作,提供了框架擴展功能,包含五項,可以對這幾項進行自定義擴展,對于日志因為每次日志記錄我們需要記錄當(dāng)前請求攜帶的做一個鏈路追蹤,需要用到是的請求上下文擴展項。 快速導(dǎo)航 [Logger-Custom] 需求背景 [Logger-Custom] 自定義日志插件開發(fā) [Logger-Custom] 項目擴展 ...

    EscapedDog 評論0 收藏0
  • 阿里egg.js初體驗(一)

    摘要:是阿里推出的基于的開發(fā)框架,今天抽空體驗了下,按官方教程做一個。用于解析用戶的輸入,處理后返回相應(yīng)的結(jié)果,具體參見。用于編寫業(yè)務(wù)邏輯層,可選,建議使用,具體參見。和用于自定義啟動時的初始化工作,可選,具體參見啟動自定義。 egg.js是阿里推出的基于koa的node開發(fā)框架,今天抽空體驗了下,按官方教程做一個Hacker News。其實官方有腳手架提供,但是這次我們不用。 開始之前,我...

    Dr_Noooo 評論0 收藏0
  • Eggjs小試

    摘要:項目都很小,但為了進一步了解,特意選擇了作為框架基礎(chǔ)開發(fā)后端服務(wù)。能將請求限制在同源網(wǎng)站,即只有擁有專有令牌的網(wǎng)站發(fā)送請求才會正確響應(yīng)。項目生產(chǎn)靜默部署,啟動使用,停止使用。不足工具函數(shù)的訪問需要自己手動添加擴展另沒有寫測試,希望下次補上。 前言 這段時間,用Eggjs作為后端服務(wù)框架開發(fā)了幾個項目。項目都很小,但為了進一步了解Eggjs,特意選擇了Eggjs作為框架基礎(chǔ)開發(fā)后端服務(wù)。...

    waltr 評論0 收藏0
  • Egg.js學(xué)習(xí)

    摘要:如果需要在構(gòu)造函數(shù)做一些處理,一定要有這句話,才能保證后面的使用。文件夾里面存放工具類引用拿到內(nèi)置對象也就是進入這個文件頁面渲染使用的是頁面模板在里面添加添加渲染 egg.js是什么 是一個node.js的后臺web框架,類似的還有express,koa 優(yōu)勢:規(guī)范、插件機制Egg.js約定了一套代碼目錄結(jié)構(gòu)(配置config、路由router、擴展extend、中間件middlewa...

    xiangchaobin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<