返回顶部
首页 > 资讯 > 前端开发 > VUE >Egg.js定制业务Web框架扩展的示例分析
  • 280
分享到

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

2024-04-02 19:04:59 280人浏览 安东尼
摘要

这篇文章给大家介绍Egg.js定制业务WEB框架扩展的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。谈到node.js web开发,你会想到的是什么?首先是框架选型:Expre

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

谈到node.js web开发,你会想到的是什么?

  • 首先是框架选型:Express、Koa、NestJS、EggJS等,需要从繁多的框架中选择一个适合团队的。

  • 框架选好之后,需要初始化项目,安装依赖、插件中间件、配置常见库;

  • 假如再一次做新项目,还得从头初始化再来一次。好一点的可以封装一个骨架,从骨架中生成新项目,周而复始。

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

  • 如果没有骨架,团队成员技术选型不一致,变成遍地开花;每个新项目维护都有学习成本。

  • 即便有骨架,发生一些升级也需要每个项目都统一升级一遍,后续也会导致不统一。

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

业务框架封装

框架选型

主流的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为框架名和项目文件夹名

$ 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框架扩展的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Egg.js定制业务Web框架扩展的示例分析

本文链接: https://lsjlt.com/news/81573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Egg.js定制业务Web框架扩展的示例分析
    这篇文章给大家介绍Egg.js定制业务Web框架扩展的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。谈到Node.js Web开发,你会想到的是什么首先是框架选型:Expres...
    99+
    2024-04-02
  • .NET 4.0可扩展缓存框架的示例分析
    小编给大家分享一下.NET 4.0可扩展缓存框架的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!.NET Framework中,叫做System.Runtime.Caching,这不仅是个缓存库,还是个框架,可以在...
    99+
    2023-06-17
  • PHP Hash信息摘要扩展框架的示例分析
    这篇文章主要介绍PHP Hash信息摘要扩展框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP的Hash信息摘要扩展框架今天我们主要学习的是 PHP 中一些 Hash 散列加密相关的扩展函数的使用,而...
    99+
    2023-06-15
  • 单例模式在PHP框架中的扩展与定制
    【引言】单例模式是一种常见的设计模式,它保证类在整个应用程序中只能实例化一次。在PHP开发中,单例模式的应用非常广泛,特别是在框架的开发和扩展中。本文将介绍如何在PHP框架中扩展和定制单例模式,并提供具体的代码示例。【什么是单例模式】单例模...
    99+
    2023-10-21
    单例模式 PHP框架 扩展与定制
  • Spring自定义XML schema 扩展的示例分析
    小编给大家分享一下Spring自定义XML schema 扩展的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring整合dubbo的事例<be...
    99+
    2023-06-15
  • PHP 单元测试框架的扩展与定制
    通过扩展和定制 phpunit 框架,可解决原有框架无法满足需求的问题。扩展方面,包括自定义断言、matcher 和 dataprovider;定制方面,涉及创建自定义运行器、覆盖 bo...
    99+
    2024-05-06
    php 单元测试 bootstrap
  • CSS3的Regions扩展的示例分析
    本篇文章给大家分享的是有关CSS3的Regions扩展的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。这是一个adobe的提议:css...
    99+
    2024-04-02
  • Java插件扩展机制之SPI的示例分析
    这篇文章给大家分享的是有关Java插件扩展机制之SPI的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制...
    99+
    2023-06-20
  • PHP中DBA扩展的示例分析
    这篇文章主要介绍PHP中DBA扩展的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP的DBA扩展学习今天我们讲的 DBA 并不是传统的数据库管理员那个 DBA ,而是一个 PHP 中的巴克利风格数据库的扩...
    99+
    2023-06-15
  • php安装扩展的示例分析
    这篇文章主要介绍php安装扩展的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php安装扩展的步骤:1、解压文件“redis-3.1.1.tgz”;2、进入解压好的文件里面;3、phpize生成配置文件;4、...
    99+
    2023-06-15
  • Express框架定制路由实例分析
    1、序言   上一节快速搭建Express开发系统步骤,对如何使用express-generator创建一个WEB项目进行了说明,本节我们会对这个项目的代码进行分...
    99+
    2023-05-20
    Express 定制路由 路由 模块 node.js ejs
  • Flask框架的示例分析
    这篇文章主要介绍Flask框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于python中的框架来说,虽然有一些大型的框架可以供我们挑选,但有时候我们处理数据用不到那么难的框架,这样反而会增加处理数据的...
    99+
    2023-06-14
  • SSM框架的示例分析
    这篇文章主要为大家展示了“SSM框架的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SSM框架的示例分析”这篇文章吧。SSM图示流程:Spring核心:Java反射Mybatis:动态代...
    99+
    2023-06-15
  • SpringMVC框架的示例分析
    小编给大家分享一下SpringMVC框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介SpringMVC采用模型(Model)-视图(View)-控...
    99+
    2023-06-02
  • redhat linux swap分区扩展的示例分析
    这篇文章主要为大家展示了“redhat linux swap分区扩展的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“redhat linux swap分区扩展的示例分析”这篇文章吧。re...
    99+
    2023-06-12
  • AngularJS框架中双向数据绑定机制的示例分析
    这篇文章将为大家详细讲解有关AngularJS框架中双向数据绑定机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:假如我们有一个学生信息列表,包含学生...
    99+
    2024-04-02
  • ES6中正则扩展的示例分析
    这篇文章将为大家详细讲解有关ES6中正则扩展的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:1. RegExp构造函数ES5中,RegExp构造函数的参...
    99+
    2024-04-02
  • php安装grpc扩展的示例分析
    这篇文章给大家分享的是有关php安装grpc扩展的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、在php.ini文件中添加grpc扩展配置:extension=grpc.sogit clon...
    99+
    2023-06-20
  • PHP自定义扩展之生命周期的示例分析
    这篇文章将为大家详细讲解有关PHP自定义扩展之生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php_request_startup这个阶段和php_module_startup差不多,都...
    99+
    2023-06-22
  • CSS框架sass的示例分析
    这期内容当中小编将会给大家带来有关CSS框架sass的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。sass结尾的文件有着更严格的格式要求,scss文件更贴近原生...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作