成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Egg.js定制業務Web框架(一) - 框架擴展

開發 前端
通過實現擴展Controller,擴展ctx,以及添加默認插件,演示了對Egg.js基本的擴展。當然對于一個完整的業務框架,還缺少很多東西,但以上提供了一種對Egg.js的擴展的思路,希望可以為你擴展提供思路。

[[398340]]

前言

談到Node.js Web開發,你會想到的是什么?

  • 首先是框架選型:Express、Koa、NestJS、EggJS等,需要從繁多的框架中選擇一個適合團隊的。
  • 框架選好之后,需要初始化項目,安裝依賴、插件、中間件、配置常見庫;
  • 假如再一次做新項目,還得從頭初始化再來一次。好一點的可以封裝一個骨架,從骨架中生成新項目,周而復始。

我們先想想這樣做的缺陷是什么?

  • 如果沒有骨架,團隊成員技術選型不一致,變成遍地開花;每個新項目維護都有學習成本。
  • 即便有骨架,發生一些升級也需要每個項目都統一升級一遍,后續也會導致不統一。

基于以上的原因,我們考慮的解法是:基于通用框架封裝一個統一的業務框架,將團隊用到的公共功能下沉到業務框架中。

業務框架封裝

框架選型

為了選擇合適的底層框架,小編整理了awesome-nodejs的倉庫(每個分類按github star數排序),從Web框架部分可以看到非常豐富,那么我們如何選擇。

awesome-nodejs地址: https://github.com/huaize2020/awesome-nodejs/blob/main/README-zh-CN.md

主流的Web框架選型主要分為兩大流派,基于Express 和 基于Koa,他們都是由同一團隊打造。Express和Koa在設計思路上的區別在于:

  • Express本身功能內置了很多中間件,集成度高,使用省心,上手即用;
  • Koa使用精簡的內核,更輕量,使用需要使用者做技術選型按需搭建積木;

基于以上的設計思路上的差別,基于對靈活配置型的考慮,筆者選擇了 基于Koa 的 流派。但他們都太底層,對于搭建企業級業務框架還需要做較多定制。

Egg.js是什么

基于上述的訴求,最后小編選擇了Egg.js。

Egg.js地址:https://eggjs.org/zh-cn/

Egg.js是阿里開源的基于Koa2企業級Node.JS框架,其核心設計就是希望基于Egg.js孕育出更多上層框架。

引用官網的一句話

  • 我們深知企業級應用在追求規范和共建的同時,還需要考慮如何平衡不同團隊之間的差異,求同存異。所以我們沒有選擇社區常見框架的大集市模式(集成如數據庫、模板引擎、前端框架等功能),而是專注于提供 Web 開發的核心功能和一套靈活可擴展的插件機制。「——官網」

定制目標

在開始定制業務框架前,我們先設定一下需要定制的目標。

  • 擴展Controller,添加API成功/失敗返回結果函數;
  • 設置默認模板引擎為 pug;
  • 擴展ctx,添加util, 將dayjs作為統一日期處理庫;

編碼

如果對Egg.js不太熟悉,建議可以先學習下Egg.js的基本使用。

框架初始化

通過以下命令,初始化項目。其中 --type=framework 表示框架骨架

villa-framework為框架名和項目文件夾名

  1. $ npm init egg --type=framework villa-framework 

以下是初始化出來的目錄

  1. villa-framework 
  2. ├── app 
  3. │   ├── extend 
  4. │   └── service 
  5. ├── config 
  6. │   ├── config.default.js 
  7. │   └── plugin.js 
  8. ├── lib 
  9. │   └── framework.js 
  10. ├── test 
  11. │   ├── fixtures 
  12. │   └── framework.test.js 
  13. ├── README.md 
  14. ├── index.js 
  15. └── package.json 

其中app、config目錄基本跟正常的Egg.js應用無差異,但增加了framework.js文件,對應用進行擴展。

  1. // lib/framework.js 
  2. 'use strict'
  3.  
  4. const path = require('path'); 
  5. const egg = require('egg'); 
  6. const EGG_PATH = Symbol.for('egg#eggPath'); 
  7.  
  8. class Application extends egg.Application { 
  9.   get [EGG_PATH]() { 
  10.     return path.dirname(__dirname); 
  11.   } 
  12.  
  13. class Agent extends egg.Agent { 
  14.   get [EGG_PATH]() { 
  15.     return path.dirname(__dirname); 
  16.   } 
  17.  
  18. module.exports = Object.assign(egg, { 
  19.   Application, 
  20.   Agent, 
  21. }); 

擴展Controller,添加成功失敗返回結果處理函數

  1. // 以下是Egg.js Controller使用的代碼 
  2. const Controller = require('egg').Controller; 
  3.  
  4. // 未來修改為 
  5. const Controller = require('villa-framework').Controller; 

由上面源碼我們知道,Controller來自egg對象,因此我們只需要替換為我們定義的Controller即可。

  1. // lib/framework.js 增加 
  2. class Controller extends egg.Controller { 
  3.   ok(data) { 
  4.     this.ctx.body = { 
  5.       success: true
  6.       data, 
  7.     }; 
  8.   } 
  9.  
  10.   fail(message, code) { 
  11.     this.ctx.body = { 
  12.       code, 
  13.       message, 
  14.     }; 
  15.   } 
  16.  
  17. // 導出增加Controller 
  18. module.exports = Object.assign(egg, { 
  19.   Application, 
  20.   Agent, 
  21.   Controller, 
  22. }); 

這樣用戶使用的Controller就變成框架的Controller。

模板引擎設置為 pug

安裝依賴

  1. $ npm i --save egg-view-pug 

啟動插件

  1. // config/plugin.js 
  2. exports.pug = { 
  3.   enable: true
  4.   package: 'egg-view-pug'
  5. }; 

設置view渲染

  1. // config/config.default.js 
  2. config.view = { 
  3.   mapping: { 
  4.     '.pug''pug'
  5.   }, 
  6. }; 

這樣應用框架就不需要再單獨安裝配置,默認擁有pug模板引擎能力。不同的業務可以根據自己的需求,默認加載并配置一些默認插件。

擴展ctx.util, 將dayjs作為統一日期處理庫

安裝依賴

  1. $ npm i --save dayjs 

app文件夾中新建util文件,添加day.js并導出

  1. // app/util/dayjs.js 
  2. 'use strict'
  3. const dayjs = require('dayjs'); 
  4. exports.dayjs = dayjs; 

因為新增的util不會默認加載,配置自定義加載器。

  1. // config/config.default.js 
  2. config.customLoader = { 
  3.   // 定義在 app 上的屬性名 app.util 
  4.   util: { 
  5.     directory: 'app/util'
  6.     // 如果是 ctx 則使用 loadToContext 
  7.     inject: 'ctx'
  8.     // 是否加載框架和插件的目錄 
  9.     loadunit: true
  10.   }, 
  11. }; 

這樣框架就會默認加載util。

應用創建

接下來我們創建應用,使用上面的villa-framework

初始化應用

  1. $ npm init egg --type=simple villa-project 
  2. $ npm i --save villa-framework 
  3. $ npm i 
  4. $ npm run dev 

將Egg.js上層框架修改為villa-framework

package.json中egg字段中添加 "framework": "villa-framework"

  1. "egg": { 
  2.   "framework""villa-framework"
  3. }, 

修改controller進行測試

  1. 'use strict'
  2. // app/controller/home.js 
  3. const Controller = require('villa-framework').Controller; 
  4.  
  5. class HomeController extends Controller { 
  6.   async index() { 
  7.     const { dayjs } = this.ctx.util.dayjs; 
  8.     const now = dayjs().format('YYYY-MM-DD HH:mm:ss'); 
  9.     await this.ctx.render('index.pug', { now }); 
  10.   } 
  11.  
  12.   renderOk() { 
  13.     this.ok('hi, egg'); 
  14.   } 
  15.  
  16.   renderFail() { 
  17.     this.fail('fail', 200); 
  18.   } 
  19.  
  20. module.exports = HomeController; 

添加路由

  1. 'use strict'
  2. // app/router.js 
  3. /** 
  4.  * @param {Egg.Application} app - egg application 
  5.  */ 
  6. module.exports = (app) => { 
  7.   const { router, controller } = app; 
  8.   router.get('/', controller.home.index); 
  9.   router.get('/ok', controller.home.renderOk); 
  10.   router.get('/fail', controller.home.renderFail); 
  11. }; 

添加首頁模板

在app中創建view文件夾,并添加index.pug

  1. html 
  2.     head 
  3.         title hello world 
  4.     body 
  5.         p hello world 
  6.         p #{now} 

啟動后即可看到演示的結果。

打開 http:///127.0.0.1:7001

打開 http:///127.0.0.1:7001/ok

打開 http:///127.0.0.1:7001/fail

總結

以上通過實現擴展Controller,擴展ctx,以及添加默認插件,演示了對Egg.js基本的擴展。

當然對于一個完整的業務框架,還缺少很多東西,但以上提供了一種對Egg.js的擴展的思路,希望可以為你擴展提供思路。

當前系列作為《基于Egg.js定制業務Web框架》系列一, 后續將持續輸出:定制IoC容器,定制注解系統、monorepo改造、框架CLI系列,敬請關注。

框架地址:https://github.com/huaize2020/blog/tree/main/projects/villa-v1/villa-framework

應用調用地址:https://github.com/huaize2020/blog/tree/main/projects/villa-v1/villa-project

awesome-nodejs: https://github.com/huaize2020/awesome-nodejs/blob/main/README-zh-CN.md

 

責任編輯:姜華 來源: Eval Studio
相關推薦

2010-03-29 13:37:15

ibmdwJAXB

2024-03-11 10:19:30

Plasmo瀏覽器Web

2024-03-14 08:32:37

HTMLWeb 框架PPT

2019-08-29 10:58:02

Web 開發框架

2023-11-03 08:04:47

Web微前端框架

2012-03-07 14:32:41

Node.js

2009-06-25 17:14:59

JSF框架

2009-11-12 16:17:13

.NET

2012-09-26 09:46:29

ASP.NETWeb框架

2010-08-10 14:53:32

FlexRiawave

2010-08-05 13:50:54

Flex框架

2010-08-13 14:29:45

Flex框架

2017-07-18 15:13:17

2023-04-27 08:23:38

JavaScriptVue.jsMVVC

2012-02-08 13:49:53

Node.js

2009-03-17 09:15:20

圖表框架CSSJavaScript

2009-06-19 09:52:46

Acegi安全框架Spring框架

2021-07-15 11:16:31

Spring WebWebFlux架構

2022-05-30 09:32:07

Spring容器

2012-02-22 14:21:13

Web開發框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品99久久久久久久久 | 国产二区视频 | 久久免费精彩视频 | 亚洲欧美一区二区三区1000 | 国产伊人精品 | 日韩国产中文字幕 | 三级视频在线观看电影 | 久久33 | 日韩亚洲欧美综合 | 久久大陆 | 在线免费观看黄色 | 一区二区三区四区毛片 | 欧美日韩在线精品 | 91极品尤物在线播放国产 | 伊人国产精品 | 色综合久久久久 | 在线视频国产一区 | 国产一区二区麻豆 | 国产精品九九视频 | 91免费观看国产 | 韩国av网站在线观看 | 粉嫩国产精品一区二区在线观看 | 国产成人精品一区二区三区 | 日本在线免费视频 | 国产精品视频免费观看 | 久www | 中文字幕成人在线 | h小视频 | 国产欧美在线播放 | 欧美中文在线 | 亚洲高清在线播放 | 99久久免费精品国产男女高不卡 | 麻豆视频国产在线观看 | 天啪| 国产精品无码专区在线观看 | 一级片网址 | 中文字幕在线观看日韩 | 亚洲精品68久久久一区 | 最新日韩在线视频 | 免费黄色的视频 | 欧美99|