Egg.js 快速入门指南:从零开始构建企业级 Node.js 应用

Egg.js 快速入门指南:从零开始构建企业级 Node.js 应用

前言

Egg.js 是一款基于 Koa 的企业级 Node.js 框架,由阿里团队开源并维护。它奉行"约定优于配置"的设计理念,提供了一套完整的开发规范和插件体系,特别适合构建复杂的企业级应用。本文将带你从零开始,快速掌握 Egg.js 的核心开发流程。

环境准备

在开始之前,请确保你的开发环境满足以下要求:

  • 操作系统:macOS/Linux/Windows 均可
  • Node.js 环境:建议使用最新的 LTS 版本(如 14.x/16.x),最低要求 8.x 版本
  • npm 版本:不低于 6.1.0

两种项目创建方式

Egg.js 提供了两种项目初始化方式,适合不同场景:

1. 脚手架快速创建(推荐新手)

这是最简单的入门方式,只需执行以下命令:

mkdir my-egg-project && cd my-egg-project
npm init egg --type=simple
npm install

启动开发服务器:

npm run dev

访问 http://localhost:7001 即可看到欢迎页面。

2. 手动搭建(适合学习原理)

为了深入理解 Egg.js 的工作原理,我们也可以手动搭建项目:

mkdir egg-manual && cd egg-manual
npm init -y
npm install egg --save
npm install egg-bin --save-dev

在 package.json 中添加启动脚本:

{
  "scripts": {
    "dev": "egg-bin dev"
  }
}

核心概念实战

1. 控制器(Controller)与路由

控制器负责处理请求并返回响应。创建第一个控制器:

// app/controller/home.js
const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    this.ctx.body = 'Hello Egg.js';
  }
}

module.exports = HomeController;

配置路由映射:

// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
};

2. 配置文件

Egg.js 采用多环境配置机制,默认配置文件:

// config/config.default.js
exports.keys = 'your-secret-key'; // 用于加密的密钥

3. 静态资源处理

Egg.js 内置了静态资源插件,只需将资源放入 app/public 目录:

app/public
├── css
│   └── style.css
└── js
    └── app.js

4. 模板渲染

安装 Nunjucks 模板引擎:

npm install egg-view-nunjucks --save

配置插件:

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

配置视图:

// config/config.default.js
exports.view = {
  defaultViewEngine: 'nunjucks',
  mapping: {
    '.tpl': 'nunjucks'
  }
};

创建模板文件:

<!-- app/view/news/list.tpl -->
<!DOCTYPE html>
<html>
  <head>
    <title>新闻列表</title>
  </head>
  <body>
    <ul>
      {% for item in list %}
        <li>{{ item.title }}</li>
      {% endfor %}
    </ul>
  </body>
</html>

5. 服务层(Service)

Service 是业务逻辑的主要存放地:

// app/service/news.js
const Service = require('egg').Service;

class NewsService extends Service {
  async list(page = 1) {
    // 这里可以写业务逻辑
    return [
      { id: 1, title: '新闻1' },
      { id: 2, title: '新闻2' }
    ];
  }
}

module.exports = NewsService;

在控制器中使用:

async list() {
  const newsList = await this.ctx.service.news.list();
  await this.ctx.render('news/list.tpl', { list: newsList });
}

6. 中间件开发

中间件用于处理请求前后的通用逻辑:

// app/middleware/robot.js
module.exports = options => {
  return async (ctx, next) => {
    const ua = ctx.get('user-agent');
    if (/Baiduspider/i.test(ua)) {
      ctx.status = 403;
      ctx.body = '禁止爬虫访问';
    } else {
      await next();
    }
  };
};

配置中间件:

// config/config.default.js
exports.middleware = ['robot'];

7. 单元测试

Egg.js 内置测试支持,创建测试文件:

// test/app/controller/home.test.js
const { app, assert } = require('egg-mock');

describe('测试首页', () => {
  it('应该返回200状态码', () => {
    return app.httpRequest()
      .get('/')
      .expect(200);
  });
});

运行测试:

npm test

项目结构规范

一个标准的 Egg.js 项目结构如下:

egg-project
├── app
│   ├── controller       // 控制器
│   ├── service          // 业务逻辑
│   ├── middleware       // 中间件
│   ├── public           // 静态资源
│   └── view             // 模板文件
├── config
│   ├── config.default.js // 默认配置
│   └── plugin.js        // 插件配置
├── test                 // 测试目录
└── package.json

开发建议

  1. 遵循约定:Egg.js 的约定式结构能减少配置,提高开发效率
  2. 合理分层:控制器保持简洁,复杂逻辑放在 Service 中
  3. 善用插件:Egg.js 有丰富的插件生态,避免重复造轮子
  4. 编写测试:从项目开始就建立测试习惯
  5. 渐进式开发:可以从简单功能开始,逐步扩展

总结

通过本文,你已经掌握了 Egg.js 的核心开发流程。从项目初始化、路由配置、控制器编写,到服务层开发、中间件使用和单元测试,这些都是构建企业级应用的基础。Egg.js 的强大之处在于其完整的生态和规范化的开发模式,这使得团队协作和项目维护变得更加容易。

建议在实际项目中,结合官方文档深入理解 Egg.js 的插件机制、定时任务、国际化等高级特性,这些都能显著提升你的开发效率和应用质量。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阮然阳Ian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值