当前位置: 首页 > news >正文

第1篇:Egg.js框架入门与项目初始化

一、Egg.js框架优势与设计理念

在这里插入图片描述

1. 为什么选择Egg.js?

作为基于Koa 2.x的渐进式企业级框架,Egg.js在阿里系大规模生产环境中验证成熟,具备以下核心优势:

  • 约定优于配置
    通过app/config目录结构自动加载机制,减少冗余配置代码。例如:

    • app/controller存放控制器
    • app/service存放业务逻辑
    • 开发人员只需关注业务,无需纠结文件位置
  • 插件化生态
    官方提供超过100+高质量插件(如mysql/redis/session),通过egg-*命名规范一键集成:

    npm install egg-mysql --save
    # 配置config/plugin.js
    module.exports = {mysql: {enable: true,package: 'egg-mysql'}
    };
    
  • 多进程管理
    基于Cluster实现进程守护,内置定时任务、日志切割等企业级特性。通过egg-scripts可实现:

    egg-scripts start --daemon --title=egg-server-app
    
  • 渐进式开发
    支持TypeScript、GraphQL等新特性渐进接入,保留Koa中间件兼容性

2. 核心设计原则

  • 扩展机制:通过Application/Context/Request/Response四大对象扩展保持核心精简
  • 分层架构:Controller层处理输入校验,Service层处理业务逻辑,Model层处理数据访问
  • 环境隔离:通过config.{env}.js实现开发/测试/生产环境配置隔离

二、快速初始化项目结构与配置解析

1. 环境准备

确保Node.js >=14.x,推荐使用nvm管理版本:

nvm install 16
nvm use 16

2. 项目初始化

使用官方脚手架快速生成项目骨架:

npm init egg --type=simple
# 选择模板类型(simple/empty/...)
npm install

生成的核心目录结构说明:

├── app
│   ├── controller
│   ├── public (静态资源)
│   └── router.js (路由配置)
├── config
│   ├── config.default.js
│   ├── plugin.js (插件配置)
│   └── config.local.js (本地覆盖配置)
├── test
│   └── controller
└── logs (运行时日志)

3. 配置系统深度解析

配置加载优先级(由低到高):

  1. 框架默认配置
  2. 应用默认配置(config.default.js)
  3. 环境配置(如config.prod.js)
  4. 本地配置(config.local.js)

示例数据库配置:

// config/config.default.js
module.exports = appInfo => {const config = exports = {};config.keys = appInfo.name + '__7742';config.middleware = [];config.mysql = {client: {host: 'localhost',port: '3306',user: 'test',password: '******************',database: 'db_name'},app: true,agent: false}return {...config};
};

三、编写第一个Controller与View渲染

1. 创建控制器

// app/controller/home.js
const { Controller } = require('egg');class HomeController extends Controller {async index() {const { ctx } = this;await ctx.render('home.tpl', {title: 'Egg.js Demo',desc: 'This is my first egg view'});}async user() {const { ctx } = this;const userList = await ctx.service.home.fetchAll();ctx.body = { success: true,data: userList };}
}module.exports = HomeController;

2. 创建业务服务

// app/service/home.js
const Service = require('egg').Serviceclass HomeService extends Service {async fetchAll() {// select获取user_info数据表中的所有数据,等于 select * from user_info;const user = await this.app.mysql.select('user_info');return { user };}
}module.exports = HomeService;

3. 配置路由

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

3. 视图渲染配置

安装模板引擎(以Nunjucks为例):

npm install egg-view-nunjucks --save

启用插件:

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

指定渲染引擎和静态文件地址:

// config/config.default.js
module.exports = appInfo => {...config.view = {defaultViewEngine: 'nunjucks',root: [path.join(appInfo.baseDir, 'app/public')].join(','),};...
};

创建视图文件(这里路径要和config中的root地址一致):

<!-- app/public/home.tpl -->
<html>
<head><title>{{ title }}</title>
</head>
<body><h1>{{ title }}</h1><p>{{ desc }}</p>
</body>
</html>

四、开发环境与调试技巧

1. 开发模式运行

npm run dev
# 自动监视文件变化重启
# 访问 http://localhost:7001

2. 调试技巧

VSCode调试配置

// .vscode/launch.json
{"version": "0.2.0","configurations": [{"name": "Launch Egg","type": "node","request": "launch","args": ["dev"],"runtimeArgs": ["--inspect=9229"],"program": "${workspaceRoot}/node_modules/egg-bin/bin/egg-bin.js"}]
}

日志分级查看

ctx.logger.debug('Debug Message');
ctx.logger.info('Access Log');
ctx.logger.warn('Warning!');
ctx.logger.error(new Error('Something wrong!'));

网络请求调试

curl http://localhost:7001/user --verbose

3. 常用开发工具

  • egg-ts-helper:TypeScript类型自动生成
  • egg-mock:单元测试模拟工具
  • egg-scripts:生产环境部署工具

五、总结与预告

通过本文我们完成了:

  1. 理解Egg.js的核心设计哲学
  2. 搭建完整的开发环境
  3. 实现RESTful API和模板渲染
  4. 掌握高效调试技巧

下篇预告:《Egg.js核心机制与插件开发》将深入讲解:

  • 中间件开发原理
  • 自定义插件开发
  • 进程间通信机制
  • 性能优化实践

建议将本文代码示例在本地实际运行体验,遇到问题欢迎在评论区交流。关注专栏获取最新技术动态!

相关文章:

  • go语言八股文(五)
  • el-Input输入数字自动转千分位进行展示
  • LeetCode 1482. 制作 m 束花所需的最少天数
  • 机器学习-入门-线性模型(2)
  • 【时间之外】软件管理如何避免人浮于事
  • Fiddler+Yakit实现手机流量抓包和小程序抓包
  • Nacos 3.0 上线 MCP Registry,支持 MCP 服务注册到发现全流程管理
  • Android平台Unity引擎的Mono JIT机制分析
  • Android WebRTC回声消除
  • 向量数据库Milvus的部署与使用
  • quickbi finebi 测评(案例讲解)
  • OpenCV 图形API(70)图像与通道拼接函数-----创建一个图像或矩阵(GMat)的副本的操作函数copy()
  • 应用在通信网络设备的爱普生晶振SG2016CBN
  • DeepSeek创始人梁文峰是个什么样的人?
  • Linux调试器 - gdb使用指南
  • C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)
  • GRPO vs SFT:强化学习提升大模型多模态推理泛化能力的原因研究
  • 关于windows API 的键鼠可控可测
  • Ocelot的应用案例
  • JDBC之Blob类型使用的实现
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”
  • “85后”潘欢欢已任河南中豫融资担保有限公司总经理
  • 走访中广核风电基地:701台风机如何乘风化电,点亮3000万人绿色生活
  • 物业也能成为居家养老“服务员”,上海多区将开展“物业+养老”试点
  • 大学2025丨专访南开人工智能学院院长赵新:人工智能未来会变成通识类课程
  • 加拿大驾车撞人事件遇难人数升到11人