Node.js框架之Egg.js

Home / Article MrLee 2021-6-2 1656

Node.js是我前段时间接触的一个JavaScript的服务端语言,感觉还是挺有意思的。

Egg.js官方文档为:https://eggjs.org/zh-cn/intro/

建议Node.js连基本语法都不懂的,可以学习学习Node.js的菜鸟教程:http://www.runoob.com/nodejs/nodejs-tutorial.html

我个人当初接触的时候,除了看了相关的基础理论方面,然后就开始不断练习了。感觉对于编程最好的学习方式还是动手实践。

一、Egg.js是什么?

Egg.js 为企业级框架和应用而生,帮助开发团队和开发人员降低开发和维护成本。

 

二、设计原则

我们深知企业级应用在追求规范和共建的同时,还需要考虑如何平衡不同团队之间的差异,求同存异。所以我们没有选择社区常见框架的大集市模式(集成如数据库、模板引擎、前端框架等功能),而是专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制。我们不会做出技术选型,因为固定的技术选型会使框架的扩展性变差,无法满足各种定制需求。通过 Egg,团队的架构师和技术负责人可以非常容易地基于自身的技术架构在 Egg 基础上扩展出适合自身业务场景的框架。

Egg 的插件机制有很高的可扩展性,一个插件只做一件事(比如 Nunjucks 模板封装成了 egg-view-nunjucks、MySQL 数据库封装成了 egg-mysql)。Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。

Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,开发人员不再是『钉子』,可以流动起来。没有约定的团队,沟通成本是非常高的,比如有人会按目录分栈而其他人按目录分功能,开发者认知不一致很容易犯错。但约定不等于扩展性差,相反 Egg 有很高的扩展性,可以按照团队的约定定制框架。使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。

 

三、与社区框架差异

Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。

Sails 是和 Egg 一样奉行『约定优于配置』的框架,扩展性也非常好。但是相比 Egg,Sails 支持 Blueprint REST API、WaterLine 这样可扩展的 ORM、前端集成、WebSocket 等,但这些功能都是由 Sails 提供的。而 Egg 不直接提供功能,只是集成各种功能插件,比如实现 egg-blueprint,egg-waterline 等这样的插件,再使用 sails-egg 框架整合这些插件就可以替代 Sails 了。

 

四、特性

提供基于 Egg 定制上层框架的能力

高度可扩展的插件机制

内置多进程管理

基于 Koa 开发,性能优异

框架稳定,测试覆盖率高

渐进式开发

五、简单实用

npm install egg-init -g
$egg-init --type simple showcase && cd showcase
$npm install
$npm run dev


初探 Node.js 框架:eggjs (环境搭配篇)

eggjs 拥有大量的插件,开发者需要怎样的功能,在官方插件上几乎都可以找到。

如果没有找到所需插件,eggjs 也支持定制。

在这里可以找到官方 API 以及使用文档:https://eggjs.org/zh-cn/

1.1 使用 脚手架 进行初步的工程目录建立

这一步也是所有基于 Node.js 工程所必备的环节之一:当然,你也可以手动创建。

打开 DOS / 终端 ,使用以下命令转到你需要存放的项目位置(这里是我的项目存放位置):

cd C:\Users\chong\Documents\NodeJS

 

我是在 Windows 系统下的 “文档” 中创建了一个 NodeJS 目录,它将是我用于所有 Node 项目的根目录。

创建一个项目文件夹并进入( project 是项目名称,可更改):

mkdir project && cd project

 

在这里,开始进行 脚手架 的初始化和安装依赖并进行启动:

# 初始化目录(会创建必备的文件夹和JS,package.json 文件)

npm init egg --type=simple

# 安装依赖

npm i

 

执行初始化目录的时候,需要你填写一些信息,这些信息最终都会导入 package.json 配置文件中。


红框是 eggjs 初始化时创建的文件以及文件夹,后续我们再来了解它们的作用【重要】

而箭头所指的则是需要填写的信息,例如项目名称,描述信息,作者以及 Cookie 密钥

 

现在,你已经得到了一个较为完整的目录结构(我已经运行过几次,比刚创建的还多了一些文件,不必在意):

好了,再启动项目,这里有几种启动方式:

# 启动项目

npm run dev

npm start

 

npm start 属于生产环境中使用,使用这种方式的话,需要打印信息输出到控制台就看不到了。

npm run dev 是开发中所推荐的启动方式,当你修改代码时,则不必手动重启服务器,eggjs 会自己重启,你只需要等待一会就可以在浏览器看到相对应的修改。

重要的是:你随时可以在代码中写上 console.log ,控制台也会有相应的显示。

 

下方是多种启动或测试的命令( package.json ),均在前方加入 npm 即可使用。

也可以修改它们,如果你需要换个端口,例如 dev,修改为 egg-bin dev --port 8081 (注意:两个 - 符号)

黄色部分是被修改的文件,在这里不必理会。

到这里,你的初始化工作已经做完,不妨休息会,再继续往下阅读。

 

 

1.2 了解各个目录、文件的作用以及 eggjs 如何处理它们

相信你已经成功初始化了吧,现在让我们来了解 eggjs 的目录结构,各个文件的作用:

重新回到之前的一张图,我们可以清晰地看见 eggjs 到底创建了什么。

前一些以 . 开头的文件我们不必理会,从 package.json 文件开始(我们已经知道这是配置文件),往下看:

它创建了两个文件夹,分别是: app、config (test 属于测试,如单元测试等,我们也不必理会)

 

app 是网站处理用户请求,以及浏览器请求服务器资源的应用文件夹

它包含:router(路由文件)、controller(处理器)

是的,初始化就这么两个,所以我建议在 app 目录下再手动创建以下几个文件夹:

 

public(存放静态资源,如 css、js、img)

view (存放视图文件)

service(处理数据等业务操作)

 

先来详细说说路由文件,所有的网站都会有一个访问地址,路由则是客户端首先进入位置:


客户端(浏览器)会发送一个请求,这个请求将会首先进入路由分发文件,匹配成功到某一个 处理器(Controller)后

这个处理器将会去进行相关业务操作(Service)拿到数据,之后 view 渲染一个页面成功后一层层返还回去。

 

controller 文件夹下则放置着我们所有核心的网站代码(后续解释)

 

任何一个网站都需要进行配置,而所有的 Web服务器 都应该自身有创建环境的能力,而不是人为去为这个服务器配置好环境。

那么 config 文件夹就是为此而生。

 

由前面得知:eggjs 有着丰富的插件,所以必然有一个插件的管理、配置文件,它就是 plugin.js 

后续我们将知道一个插件应该怎样启用,关闭,安装,这里先不说明;

 

eggjs 最重要的配置文件则是 :config.default.js,它管理着整个 Node服务器 的所有配置,包括插件、Cookie安全密钥、视图渲染等等配置。

 

好了,看到这里你已经对生成的 eggjs 项目工程有了一个大致的了解(我昨天才接触 node.js ,若有不对,望在评论中指出,我会进行修改,多谢)

 

1.3  了解一个请求是如何被处理的【重要】

读完前面,你已经明白:eggjs 工程中的目录,文件的作用(只介绍了部分),现在让我们来深入了解代码层次上,eggjs 如何处理用户请求(不解析源码,从生成的文件来看):

 

先来了解路由文件怎样工作(建议所有的路由设计都放在一个文件中):

'use strict';
/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
    
    const { router, controller } = app;
    router.get('/', controller.main.index);
};

router.get() 方法指的是 GET 请求。

第一个参数表示 URL,例如 www.cnblogs.com 是域名,那么 www.cnblogs.com/index 中的  / 开始,则都是该网站下的‘路由’

第二个参数表示 controller 文件夹下的 main.js 中的 index 方法【重要】,如下:

'use strict';
const Controller = require('egg').Controller;
class MainController extends Controller {
    async index() {
        this.ctx.body = '<h1>Hello world</h1>';
    }
}
module.exports = MainController;

所以,你会在浏览器的窗口中看见:

详情可见:https://www.cnblogs.com/chongsaid/p/nodejs_eggframe_getStart.html,该作者写的比较基础,详细!值得收藏的好帖!!!

本文链接:https://www.it72.com/12687.htm

推荐阅读
最新回复 (0)
返回