文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Egg.js定制业务Web框架扩展的示例分析

2024-04-02 19:55

关注

这篇文章给大家介绍Egg.js定制业务Web框架扩展的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

谈到Node.js Web开发,你会想到的是什么?

我们先想想这样做的缺陷是什么?

基于以上的原因,我们考虑的解法是:基于通用框架封装一个统一的业务框架,将团队用到的公共功能下沉到业务框架中。

业务框架封装

框架选型

主流的Web框架选型主要分为两大流派,基于Express 和 基于Koa,他们都是由同一团队打造。Express和Koa在设计思路上的区别在于:

基于以上的设计思路上的差别,基于对灵活配置型的考虑,笔者选择了 基于Koa 的 流派。但他们都太底层,对于搭建企业级业务框架还需要做较多定制。

Egg.js是什么

基于上述的诉求,最后小编选择了Egg.js。

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

Egg.js是阿里开源的基于Koa2企业级Node.JS框架,其核心设计就是希望基于Egg.js孕育出更多上层框架。

引用官网的一句话

定制目标

在开始定制业务框架前,我们先设定一下需要定制的目标。

编码

如果对Egg.js不太熟悉,建议可以先学习下Egg.js的基本使用。

框架初始化

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

villa-framework为框架名和项目文件夹名

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

以下是初始化出来的目录

villa-framework ├── app │   ├── extend │   └── service ├── config │   ├── config.default.js │   └── plugin.js ├── lib │   └── framework.js ├── test │   ├── fixtures │   └── framework.test.js ├── README.md ├── index.js └── package.json

其中app、config目录基本跟正常的Egg.js应用无差异,但增加了framework.js文件,对应用进行扩展。

// lib/framework.js 'use strict';  const path = require('path'); const egg = require('egg'); const EGG_PATH = Symbol.for('egg#eggPath');  class Application extends egg.Application {   get [EGG_PATH]() {     return path.dirname(__dirname);   } }  class Agent extends egg.Agent {   get [EGG_PATH]() {     return path.dirname(__dirname);   } }  module.exports = Object.assign(egg, {   Application,   Agent, });

扩展Controller,添加成功失败返回结果处理函数

// 以下是Egg.js Controller使用的代码 const Controller = require('egg').Controller;  // 未来修改为 const Controller = require('villa-framework').Controller;

由上面源码我们知道,Controller来自egg对象,因此我们只需要替换为我们定义的Controller即可。

// lib/framework.js 增加 class Controller extends egg.Controller {   ok(data) {     this.ctx.body = {       success: true,       data,     };   }    fail(message, code) {     this.ctx.body = {       code,       message,     };   } }  // 导出增加Controller module.exports = Object.assign(egg, {   Application,   Agent,   Controller, });

这样用户使用的Controller就变成框架的Controller。

模板引擎设置为 pug

安装依赖

$ npm i --save egg-view-pug

启动插件

// config/plugin.js exports.pug = {   enable: true,   package: 'egg-view-pug', };

设置view渲染

// config/config.default.js config.view = {   mapping: {     '.pug': 'pug',   }, };

这样应用框架就不需要再单独安装配置,默认拥有pug模板引擎能力。不同的业务可以根据自己的需求,默认加载并配置一些默认插件。

扩展ctx.util, 将dayjs作为统一日期处理库

安装依赖

$ npm i --save dayjs

app文件夹中新建util文件,添加day.js并导出

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

因为新增的util不会默认加载,配置自定义加载器。

// config/config.default.js config.customLoader = {   // 定义在 app 上的属性名 app.util   util: {     directory: 'app/util',     // 如果是 ctx 则使用 loadToContext     inject: 'ctx',     // 是否加载框架和插件的目录     loadunit: true,   }, };

这样框架就会默认加载util。

应用创建

接下来我们创建应用,使用上面的villa-framework

初始化应用

$ npm init egg --type=simple villa-project $ npm i --save villa-framework $ npm i $ npm run dev

将Egg.js上层框架修改为villa-framework

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

"egg": {   "framework": "villa-framework", },

修改controller进行测试

'use strict'; // app/controller/home.js const Controller = require('villa-framework').Controller;  class HomeController extends Controller {   async index() {     const { dayjs } = this.ctx.util.dayjs;     const now = dayjs().format('YYYY-MM-DD HH:mm:ss');     await this.ctx.render('index.pug', { now });   }    renderOk() {     this.ok('hi, egg');   }    renderFail() {     this.fail('fail', 200);   } }  module.exports = HomeController;

添加路由

'use strict'; // app/router.js  module.exports = (app) => {   const { router, controller } = app;   router.get('/', controller.home.index);   router.get('/ok', controller.home.renderOk);   router.get('/fail', controller.home.renderFail); };

添加首页模板

在app中创建view文件夹,并添加index.pug

html     head         title hello world     body         p hello world         p #{now}

启动后即可看到演示的结果。

打开 http:///127.0.0.1:7001

Egg.js定制业务Web框架扩展的示例分析

打开 http:///127.0.0.1:7001/ok

Egg.js定制业务Web框架扩展的示例分析

打开 http:///127.0.0.1:7001/fail

Egg.js定制业务Web框架扩展的示例分析

以上通过实现扩展Controller,扩展ctx,以及添加默认插件,演示了对Egg.js基本的扩展。

当然对于一个完整的业务框架,还缺少很多东西,但以上提供了一种对Egg.js的扩展的思路,希望可以为你扩展提供思路。

关于Egg.js定制业务Web框架扩展的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯