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

在辽阳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站设计、外贸营销网站建设 网站设计制作定制开发,公司网站建设,企业网站建设,成都品牌网站建设,成都营销网站建设,外贸营销网站建设,辽阳网站建设费用合理。
我们先想想这样做的缺陷是什么?
基于以上的原因,我们考虑的解法是:基于通用框架封装一个统一的业务框架,将团队用到的公共功能下沉到业务框架中。
为了选择合适的底层框架,小编整理了awesome-nodejs的仓库(每个分类按github star数排序),从Web框架部分可以看到非常丰富,那么我们如何选择。
awesome-nodejs地址: https://github.com/huaize2020/awesome-nodejs/blob/main/README-zh-CN.md
主流的Web框架选型主要分为两大流派,基于Express 和 基于Koa,他们都是由同一团队打造。Express和Koa在设计思路上的区别在于:
基于以上的设计思路上的差别,基于对灵活配置型的考虑,笔者选择了 基于Koa 的 流派。但他们都太底层,对于搭建企业级业务框架还需要做较多定制。
基于上述的诉求,最后小编选择了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,
 - });
 
- // 以下是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。
安装依赖
- $ 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模板引擎能力。不同的业务可以根据自己的需求,默认加载并配置一些默认插件。
安装依赖
- $ 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
 
package.json中egg字段中添加 "framework": "villa-framework"
- "egg": {
 - "framework": "villa-framework",
 - },
 
- '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
 - /**
 - * @param {Egg.Application} app - egg application
 - */
 - 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
打开 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
                网页名称:基于Egg.js定制业务Web框架(一)-框架扩展
                
                浏览地址:http://www.csdahua.cn/qtweb/news3/530553.html
            
成都网站优化推广公司_创新互联,为您提供定制开发、企业网站制作、品牌网站建设、App设计、面包屑导航、企业建站
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网