第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. 配置系统深度解析
配置加载优先级(由低到高):
- 框架默认配置
- 应用默认配置(config.default.js)
- 环境配置(如config.prod.js)
- 本地配置(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:生产环境部署工具
五、总结与预告
通过本文我们完成了:
- 理解Egg.js的核心设计哲学
- 搭建完整的开发环境
- 实现RESTful API和模板渲染
- 掌握高效调试技巧
下篇预告:《Egg.js核心机制与插件开发》将深入讲解:
- 中间件开发原理
- 自定义插件开发
- 进程间通信机制
- 性能优化实践
建议将本文代码示例在本地实际运行体验,遇到问题欢迎在评论区交流。关注专栏获取最新技术动态!