比特派最新下载地址|egg
快速入门 - Egg
快速入门 - Egg
框架开发 - Egg
框架开发 - Egg
Egg@2 升级指南 - Egg
Egg@2 升级指南 - Egg
学习egg.js,看这一篇就够了! - 掘金
学习egg.js,看这一篇就够了! - 掘金
首页 首页
沸点
课程
直播
活动
竞赛
商城
APP
插件 搜索历史
清空
创作者中心
写文章 发沸点 写笔记 写代码 草稿箱 创作灵感
查看更多
会员
登录
注册
学习egg.js,看这一篇就够了!
乔珂力
2021-08-11
21,791
egg 介绍
egg 是什么?
egg 是阿里出品的一款 node.js 后端 web 框架,基于 koa 封装,并做了一些约定。
为什么叫 egg ?
egg 有孕育的含义,因为 egg 的定位是企业级 web 基础框架,旨在帮助开发者孕育适合自己团队的框架。
哪些产品是用 egg 开发的?
语雀 就是用 egg 开发的,架构图如下:
哪些公司在用 egg?
盒马,转转二手车、PingWest、小米、58同城等(技术栈选型参考链接)
egg 支持 Typescript 吗?
虽然 egg 本身是用 JavaScript 写的,但是 egg 应用可以采用 Typescript 来写,使用下面的命令创建项目即可(参考链接):
$ npx egg-init --type=ts showcase
用 JavaScript 写 egg 会有智能提示吗?
会的,只要在 package.json 中添加下面的声明之后,会在项目根目录下动态生成 typings 目录,里面包含各种模型的类型声明(参考链接):
"egg": {
"declarations": true
}
egg 和 koa 是什么关系?
koa 是 egg 的基础框架,egg 是对 koa 的增强。
学习 egg 需要会 koa 吗?
不会 koa 也可以直接上手 egg,但是会 koa 的话有助于更深层次的理解 egg。
创建项目
我们采用基础模板、选择国内镜像创建一个 egg 项目:
$ npm init egg --type=simple --registry=china
# 或者 yarn create egg --type=simple --registry=china
解释一下 npm init egg 这种语法:
npm@6 版本引入了 npm-init
也就是说,npm init egg 会去寻找或下载 create-egg 可执行文件,而 create-egg 包就是 egg-init 包的别名,相当于调用了 egg-init 。
创建完毕之后,目录结构如下(忽略 README文件 和 test 目录):
├── app
│ ├── controller
│ │ └── home.js
│ └── router.js
├── config
│ ├── config.default.js
│ └── plugin.js
├── package.json
这就是最小化的 egg 项目,用 npm i 或 yarn 安装依赖之后,执行启动命令:
$ npm run dev
[master] node version v14.15.1
[master] egg version 2.29.1
[master] agent_worker#1:23135 started (842ms)
[master] egg started on http://127.0.0.1:7001 (1690ms)
打开 http://127.0.0.1:7001/ 会看到网页上显示 hi, egg 。
目录约定
上面创建的项目只是最小化结构,一个典型的 egg 项目有如下目录结构:
egg-project
├── package.json
├── app.js (可选)
├── agent.js (可选)
├── app/
| ├── router.js # 用于配置 URL 路由规则
│ ├── controller/ # 用于存放控制器(解析用户的输入、加工处理、返回结果)
│ ├── model/ (可选) # 用于存放数据库模型
│ ├── service/ (可选) # 用于编写业务逻辑层
│ ├── middleware/ (可选) # 用于编写中间件
│ ├── schedule/ (可选) # 用于设置定时任务
│ ├── public/ (可选) # 用于放置静态资源
│ ├── view/ (可选) # 用于放置模板文件
│ └── extend/ (可选) # 用于框架的扩展
│ ├── helper.js (可选)
│ ├── request.js (可选)
│ ├── response.js (可选)
│ ├── context.js (可选)
│ ├── application.js (可选)
│ └── agent.js (可选)
├── config/
| ├── plugin.js # 用于配置需要加载的插件
| ├── config.{env}.js # 用于编写配置文件(env 可以是 default,prod,test,local,unittest)
这是由 egg 框架或内置插件约定好的,是阿里总结出来的最佳实践,虽然框架也提供了让用户自定义目录结构的能力,但是依然建议大家采用阿里的这套方案。在接下来的篇章当中,会逐一讲解上述约定目录和文件的作用。
路由(Router)
路由定义了 请求路径(URL) 和 控制器(Controller) 之间的映射关系,即用户访问的网址应交由哪个控制器进行处理。我们打开 app/router.js 看一下:
module.exports = app => {
const { router, controller } = app
router.get('/', controller.home.index)
};
可以看到,路由文件导出了一个函数,接收 app 对象作为参数,通过下面的语法定义映射关系:
router.verb('path-match', controllerAction)
其中 verb 一般是 HTTP 动词的小写,例如:
HEAD - router.head
OPTIONS - router.options
GET - router.get
PUT - router.put
POST - router.post
PATCH - router.patch
DELETE - router.delete 或 router.del
除此之外,还有一个特殊的动词 router.redirect 表示重定向。
而 controllerAction 则是通过点(·)语法指定 controller 目录下某个文件内的某个具体函数,例如:
controller.home.index // 映射到 controller/home.js 文件的 index 方法
controller.v1.user.create // controller/v1/user.js 文件的 create 方法
下面是一些示例及其解释:
module.exports = app => {
const { router, controller } = app
// 当用户访问 news 会交由 controller/news.js 的 index 方法进行处理
router.get('/news', controller.news.index)
// 通过冒号 `:x` 来捕获 URL 中的命名参数 x,放入 ctx.params.x
router.get('/user/:id/:name', controller.user.info)
// 通过自定义正则来捕获 URL 中的分组参数,放入 ctx.params 中
router.get(/^\/package\/([\w-.]+\/[\w-.]+)$/, controller.package.detail)
}
除了使用动词的方式创建路由之外,egg 还提供了下面的语法快速生成 CRUD 路由:
// 对 posts 按照 RESTful 风格映射到控制器 controller/posts.js 中
router.resources('posts', '/posts', controller.posts)
会自动生成下面的路由:
HTTP方法请求路径路由名称控制器函数GET/postspostsapp.controller.posts.indexGET/posts/newnew_postapp.controller.posts.newGET/posts/:idpostapp.controller.posts.showGET/posts/:id/editedit_postapp.controller.posts.editPOST/postspostsapp.controller.posts.createPATCH/posts/:idpostapp.controller.posts.updateDELETE/posts/:idpostapp.controller.posts.destroy只需要到 controller 中实现对应的方法即可。
当项目越来越大之后,路由映射会越来越多,我们可能希望能够将路由映射按照文件进行拆分,这个时候有两种办法:
手动引入,即把路由文件写到 app/router 目录下,然后再 app/router.js 中引入这些文件。示例代码:
// app/router.js
module.exports = app => {
require('./router/news')(app)
require('./router/admin')(app)
};
// app/router/news.js
module.exports = app => {
app.router.get('/news/list', app.controller.news.list)
app.router.get('/news/detail', app.controller.news.detail)
};
// app/router/admin.js
module.exports = app => {
app.router.get('/admin/user', app.controller.admin.user)
app.router.get('/admin/log', app.controller.admin.log)
};
使用 egg-router-plus 插件自动引入 app/router/**/*.js,并且提供了 namespace 功能:
// app/router.js
module.exports = app => {
const subRouter = app.router.namespace('/sub')
subRouter.get('/test', app.controller.sub.test) // 最终路径为 /sub/test
}
除了 HTTP verb 之外,Router 还提供了一个 redirect 方法,用于内部重定向,例如:
module.exports = app => {
app.router.get('index', '/home/index', app.controller.home.index)
app.router.redirect('/', '/home/index', 302)
}
中间件(Middleware)
egg 约定一个中间件是一个放置在 app/middleware 目录下的单独文件,它需要导出一个普通的函数,该函数接受两个参数:
options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
app: 当前应用 Application 的实例。
我们新建一个 middleware/slow.js 慢查询中间件,当请求时间超过我们指定的阈值,就打印日志,代码为:
module.exports = (options, app) => {
return async function (ctx, next) {
const startTime = Date.now()
await next()
const consume = Date.now() - startTime
const { threshold = 0 } = options || {}
if (consume > threshold) {
console.log(`${ctx.url}请求耗时${consume}毫秒`)
}
}
}
然后在 config.default.js 中使用:
module.exports = {
// 配置需要的中间件,数组顺序即为中间件的加载顺序
middleware: [ 'slow' ],
// slow 中间件的 options 参数
slow: {
enable: true
},
}
这里配置的中间件是全局启用的,如果只是想在指定路由中使用中间件的话,例如只针对 /api 前缀开头的 url 请求使用某个中间件的话,有两种方式:
在 config.default.js 配置中设置 match 或 ignore 属性:
module.exports = {
middleware: [ 'slow' ],
slow: {
threshold: 1,
match: '/api'
},
};
在路由文件 router.js 中引入
module.exports = app => {
const { router, controller } = app
// 在 controller 处理之前添加任意中间件
router.get('/api/home', app.middleware.slow({ threshold: 1 }), controller.home.index)
}
egg 把中间件分成应用层定义的中间件(app.config.appMiddleware)和框架默认中间件(app.config.coreMiddleware),我们打印看一下:
module.exports = app => {
const { router, controller } = app
console.log(app.config.appMiddleware)
console.log(app.config.coreMiddleware)
router.get('/api/home', app.middleware.slow({ threshold: 1 }), controller.home.index)
}
结果是:
// appMiddleware
[ 'slow' ]
// coreMiddleware
[
'meta',
'siteFile',
'notfound',
'static',
'bodyParser',
'overrideMethod',
'session',
'securities',
'i18n',
'eggLoaderTrace'
]
其中那些 coreMiddleware 是 egg 帮我们内置的中间件,默认是开启的,如果不想用,可以通过配置的方式进行关闭:
module.exports = {
i18n: {
enable: false
}
}
控制器(Controller)
Controller 负责解析用户的输入,处理后返回相应的结果,一个最简单的 helloworld 示例:
const { Controller } = require('egg');
class HomeController extends Controller {
async index() {
const { ctx } = this;
ctx.body = 'hi, egg';
}
}
module.exports = HomeController;
当然,我们实际项目中的代码不会这么简单,通常情况下,在 Controller 中会做如下几件事情:
接收、校验、处理 HTTP 请求参数
向下调用服务(Service)处理业务
通过 HTTP 将结果响应给用户
一个真实的案例如下:
const { Controller } = require('egg');
class PostController extends Controller {
async create() {
const { ctx, service } = this;
const createRule = {
title: { type: 'string' },
content: { type: 'string' },
};
// 校验和组装参数
ctx.validate(createRule);
const data = Object.assign(ctx.request.body, { author: ctx.session.userId });
// 调用 Service 进行业务处理
const res = await service.post.create(data);
// 响应客户端数据
ctx.body = { id: res.id };
ctx.status = 201;
}
}
module.exports = PostController;
由于 Controller 是类,因此可以通过自定义基类的方式封装常用方法,例如:
// app/core/base_controller.js
const { Controller } = require('egg');
class BaseController extends Controller {
get user() {
return this.ctx.session.user;
}
success(data) {
this.ctx.body = { success: true, data };
}
notFound(msg) {
this.ctx.throw(404, msg || 'not found');
}
}
module.exports = BaseController;
然后让所有 Controller 继承这个自定义的 BaseController:
// app/controller/post.js
const Controller = require('../core/base_controller');
class PostController extends Controller {
async list() {
const posts = await this.service.listByUser(this.user);
this.success(posts);
}
}
在 Controller 中通过 this.ctx 可以获取上下文对象,方便获取和设置相关参数,例如:
ctx.query:URL 中的请求参数(忽略重复 key)
ctx.quries:URL 中的请求参数(重复的 key 被放入数组中)
ctx.params:Router 上的命名参数
ctx.request.body:HTTP 请求体中的内容
ctx.request.files:前端上传的文件对象
ctx.getFileStream():获取上传的文件流
ctx.multipart():获取 multipart/form-data 数据
ctx.cookies:读取和设置 cookie
ctx.session:读取和设置 session
ctx.service.xxx:获取指定 service 对象的实例(懒加载)
ctx.status:设置状态码
ctx.body:设置响应体
ctx.set:设置响应头
ctx.redirect(url):重定向
ctx.render(template):渲染模板
this.ctx 上下文对象是 egg 框架和 koa 框架中最重要的一个对象,我们要弄清楚该对象的作用,不过需要注意的是,有些属性并非直接挂在 app.ctx 对象上,而是代理了 request 或 response 对象的属性,我们可以用 Object.keys(ctx) 看一下:
[
'request', 'response', 'app', 'req', 'res', 'onerror', 'originalUrl', 'starttime', 'matched',
'_matchedRoute', '_matchedRouteName', 'captures', 'params', 'routerName', 'routerPath'
]
服务(Service)
Service 是具体业务逻辑的实现,一个封装好的 Service 可供多个 Controller 调用,而一个 Controller 里面也可以调用多个 Service,虽然在 Controller 中也可以写业务逻辑,但是并不建议这么做,代码中应该保持 Controller 逻辑简洁,仅仅发挥「桥梁」作用。
Controller 可以调用任何一个 Service 上的任何方法,值得注意的是:Service 是懒加载的,即只有当访问到它的时候框架才会去实例化它。
通常情况下,在 Service 中会做如下几件事情:
处理复杂业务逻辑
调用数据库或第三方服务(例如 GitHub 信息获取等)
一个简单的 Service 示例,将数据库中的查询结果返回出去:
// app/service/user.js
const { Service } = require('egg').Service;
class UserService extends Service {
async find(uid) {
const user = await this.ctx.db.query('select * from user where uid = ?', uid);
return user;
}
}
module.exports = UserService;
在 Controller 中可以直接调用:
class UserController extends Controller {
async info() {
const { ctx } = this;
const userId = ctx.params.id;
const userInfo = await ctx.service.user.find(userId);
ctx.body = userInfo;
}
}
注意,Service 文件必须放在 app/service 目录,支持多级目录,访问的时候可以通过目录名级联访问:
app/service/biz/user.js => ctx.service.biz.user
app/service/sync_user.js => ctx.service.syncUser
app/service/HackerNews.js => ctx.service.hackerNews
Service 里面的函数,可以理解为某个具体业务逻辑的最小单元,Service 里面也可以调用其他 Service,值得注意的是:Service 不是单例,是 请求级别 的对象,框架在每次请求中首次访问 ctx.service.xx 时延迟实例化,所以 Service 中可以通过 this.ctx 获取到当前请求的上下文。
模板渲染
egg 框架内置了 egg-view 作为模板解决方案,并支持多种模板渲染,例如 ejs、handlebars、nunjunks 等模板引擎,每个模板引擎都以插件的方式引入,默认情况下,所有插件都会去找 app/view 目录下的文件,然后根据 config\config.default.js 中定义的后缀映射来选择不同的模板引擎:
config.view = {
defaultExtension: '.nj',
defaultViewEngine: 'nunjucks',
mapping: {
'.nj': 'nunjucks',
'.hbs': 'handlebars',
'.ejs': 'ejs',
},
}
上面的配置表示,当文件:
后缀是 .nj 时使用 nunjunks 模板引擎
后缀是 .hbs 时使用 handlebars 模板引擎
后缀是 .ejs 时使用 ejs 模板引擎
当未指定后缀时默认为 .html
当未指定模板引擎时默认为 nunjunks
接下来我们安装模板引擎插件:
$ npm i egg-view-nunjucks egg-view-ejs egg-view-handlebars --save
# 或者 yarn add egg-view-nunjucks egg-view-ejs egg-view-handlebars
然后在 config/plugin.js 中启用该插件:
exports.nunjucks = {
enable: true,
package: 'egg-view-nunjucks',
}
exports.handlebars = {
enable: true,
package: 'egg-view-handlebars',
}
exports.ejs = {
enable: true,
package: 'egg-view-ejs',
}
然后添加 app/view 目录,里面增加几个文件:
app/view
├── ejs.ejs
├── handlebars.hbs
└── nunjunks.nj
代码分别是:
ejs
- <%= item.title %>
<% items.forEach(function(item){ %>
<% }); %>
handlebars
{{#each items}}
{{~/each}}
nunjunks
- {{ item.title }}
{% for item in items %}
{% endfor %}
然后在 Router 中配置路由:
module.exports = app => {
const { router, controller } = app
router.get('/ejs', controller.home.ejs)
router.get('/handlebars', controller.home.handlebars)
router.get('/nunjunks', controller.home.nunjunks)
}
接下来实现 Controller 的逻辑:
const Controller = require('egg').Controller
class HomeController extends Controller {
async ejs() {
const { ctx } = this
const items = await ctx.service.view.getItems()
await ctx.render('ejs.ejs', {items})
}
async handlebars() {
const { ctx } = this
const items = await ctx.service.view.getItems()
await ctx.render('handlebars.hbs', {items})
}
async nunjunks() {
const { ctx } = this
const items = await ctx.service.view.getItems()
await ctx.render('nunjunks.nj', {items})
}
}
module.exports = HomeController
我们把数据放到了 Service 里面:
const { Service } = require('egg')
class ViewService extends Service {
getItems() {
return [
{ title: 'foo', id: 1 },
{ title: 'bar', id: 2 },
]
}
}
module.exports = ViewService
访问下面的地址可以查看不同模板引擎渲染出的结果:
GET http://localhost:7001/nunjunks
GET http://localhost:7001/handlebars
GET http://localhost:7001/ejs
你可能会问,ctx.render 方法是哪来的呢?没错,是由 egg-view 对 context 进行扩展而提供的,为 ctx 上下文对象增加了 render、renderView 和 renderString 三个方法,代码如下:
const ContextView = require('../../lib/context_view')
const VIEW = Symbol('Context#view')
module.exports = {
render(...args) {
return this.renderView(...args).then(body => {
this.body = body;
})
},
renderView(...args) {
return this.view.render(...args);
},
renderString(...args) {
return this.view.renderString(...args);
},
get view() {
if (this[VIEW]) return this[VIEW]
return this[VIEW] = new ContextView(this)
}
}
它内部最终会把调用转发给 ContextView 实例上的 render 方法,ContextView 是一个能够根据配置里面定义的 mapping,帮助我们找到对应渲染引擎的类。
插件
上节课讲解模板渲染的时候,我们已经知道如何使用插件了,即只需要在应用或框架的 config/plugin.js 中声明:
exports.myPlugin = {
enable: true, // 是否开启
package: 'egg-myPlugin', // 从 node_modules 中引入
path: path.join(__dirname, '../lib/plugin/egg-mysql'), // 从本地目录中引入
env: ['local', 'unittest', 'prod'], // 只有在指定运行环境才能开启
}
开启插件后,就可以使用插件提供的功能了:
app.myPlugin.xxx()
如果插件包含需要用户自定义的配置,可以在 config.default.js 进行指定,例如:
exports.myPlugin = {
hello: 'world'
}
一个插件其实就是一个『迷你的应用』,包含了 Service、中间件、配置、框架扩展等,但是没有独立的 Router 和 Controller,也不能定义自己的 plugin.js。
在开发中必不可少要连接数据库,最实用的插件就是数据库集成的插件了。
集成 MongoDB
首先确保电脑中已安装并启动 MongoDB 数据库,如果是 Mac 电脑,可以用下面的命令快速安装和启动:
$ brew install mongodb-community
$ brew services start mongodb/brew/mongodb-community # 后台启动
# 或者使用 mongod --config /usr/local/etc/mongod.conf 前台启动
然后安装 egg-mongoose 插件:
$ npm i egg-mongoose
# 或者 yarn add egg-mongoose
在 config/plugin.js 中开启插件:
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
}
在 config/config.default.js 中定义连接参数:
config.mongoose = {
client: {
url: 'mongodb://127.0.0.1/example',
options: {}
}
}
然后在 model/user.js 中定义模型:
module.exports = app => {
const mongoose = app.mongoose
const UserSchema = new mongoose.Schema(
{
username: {type: String, required: true, unique: true}, // 用户名
password: {type: String, required: true}, // 密码
},
{ timestamps: true } // 自动生成 createdAt 和 updatedAt 时间戳
)
return mongoose.model('user', UserSchema)
}
在控制器中调用 mongoose 的方法:
const {Controller} = require('egg')
class UserController extends Controller {
// 用户列表 GET /users
async index() {
const {ctx} = this
ctx.body = await ctx.model.User.find({})
}
// 用户详情 GET /users/:id
async show() {
const {ctx} = this
ctx.body = await ctx.model.User.findById(ctx.params.id)
}
// 创建用户 POST /users
async create() {
const {ctx} = this
ctx.body = await ctx.model.User.create(ctx.request.body)
}
// 更新用户 PUT /users/:id
async update() {
const {ctx} = this
ctx.body = await ctx.model.User.findByIdAndUpdate(ctx.params.id, ctx.request.body)
}
// 删除用户 DELETE /users/:id
async destroy() {
const {ctx} = this
ctx.body = await ctx.model.User.findByIdAndRemove(ctx.params.id)
}
}
module.exports = UserController
最后配置 RESTful 路由映射:
module.exports = app => {
const {router, controller} = app
router.resources('users', '/users', controller.user)
}
集成 MySQL
首先确保电脑中已安装 MySQL 数据库,如果是 Mac 电脑,可通过下面的命令快速安装和启动:
$ brew install mysql
$ brew services start mysql # 后台启动
# 或者 mysql.server start 前台启动
$ mysql_secure_installation # 设置密码
官方有个 egg-mysql 插件,可以连接 MySQL 数据库,使用方法非常简单:
$ npm i egg-mysql
# 或者 yarn add egg-mysql
在 config/plugin.js 中开启插件:
exports.mysql = {
enable: true,
package: 'egg-mysql',
}
在 config/config.default.js 中定义连接参数:
config.mysql = {
client: {
host: 'localhost',
port: '3306',
user: 'root',
password: 'root',
database: 'cms',
}
}
然后就能在 Controller 或 Service 的 app.mysql 中获取到 mysql 对象,例如:
class UserService extends Service {
async find(uid) {
const user = await this.app.mysql.get('users', { id: 11 });
return { user }
}
}
如果启动的时候报错:
ERROR 5954 nodejs.ER_NOT_SUPPORTED_AUTH_MODEError: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
是因为你使用了 MySQL 8.x 版本,而 egg-mysql 依赖了 ali-rds 这个包,这是阿里自己封装的包,里面又依赖了 mysql 这个包,而这个包已经废弃,不支持 caching_sha2_password 加密方式导致的。可以在 MySQL workbench 中运行下面的命令来解决:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
flush privileges
但是更好的集成 MySQL 的方式是借助 ORM 框架来帮助我们管理数据层的代码,sequelize 是当前最流行的 ORM 框架,它支持 MySQL、PostgreSQL、SQLite 和 MSSQL 等多个数据源,接下来我们使用 sequelize 来连接 MySQL 数据库,首先安装依赖:
npm install egg-sequelize mysql2 --save
yarn add egg-sequelize mysql2
然后在 config/plugin.js 中开启 egg-sequelize 插件:
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
}
同样要在 config/config.default.js 中编写 sequelize 配置
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'example',
}
然后在 egg_example 库中创建 books 表:
CREATE TABLE `books` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`name` varchar(30) DEFAULT NULL COMMENT 'book name',
`created_at` datetime DEFAULT NULL COMMENT 'created time',
`updated_at` datetime DEFAULT NULL COMMENT 'updated time',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='book';
创建 model/book.js 文件,代码是:
module.exports = app => {
const { STRING, INTEGER } = app.Sequelize
const Book = app.model.define('book', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
name: STRING(30),
})
return Book
}
添加 controller/book.js 控制器:
const Controller = require('egg').Controller
class BookController extends Controller {
async index() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.findAll({})
}
async show() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.findByPk(+ctx.params.id)
}
async create() {
const ctx = this.ctx
ctx.body = await ctx.model.Book.create(ctx.request.body)
}
async update() {
const ctx = this.ctx
const book = await ctx.model.Book.findByPk(+ctx.params.id)
if (!book) return (ctx.status = 404)
await book.update(ctx.request.body)
ctx.body = book
}
async destroy() {
const ctx = this.ctx
const book = await ctx.model.Book.findByPk(+ctx.params.id)
if (!book) return (ctx.status = 404)
await book.destroy()
ctx.body = book
}
}
module.exports = BookController
最后配置 RESTful 路由映射:
module.exports = app => {
const {router, controller} = app
router.resources('books', '/books', controller.book)
}
自定义插件
掌握了插件的使用,接下来就要讲讲如何自己写插件了,首先根据插件脚手架模板创建一个插件项目:
npm init egg --type=plugin
# 或者 yarn create egg --type=plugin
默认的目录结构为:
├── config
│ └── config.default.js
├── package.json
插件没有独立的 router 和 controller,并且需要在 package.json 中的 eggPlugin 节点指定插件特有的信息,例如:
{
"eggPlugin": {
"name": "myPlugin",
"dependencies": [ "registry" ],
"optionalDependencies": [ "vip" ],
"env": [ "local", "test", "unittest", "prod" ]
}
}
上述字段的含义为:
name - 插件名,配置依赖关系时会指定依赖插件的 name。
dependencies - 当前插件强依赖的插件列表(如果依赖的插件没找到,应用启动失败)。
optionalDependencies - 当前插件的可选依赖插件列表(如果依赖的插件未开启,只会 warning,不会影响应用启动)。
env - 指定在某些运行环境才开启当前插件
那插件里面能做什么呢?
扩展内置对象:跟应用一样,在 app/extend/ 目录下定义 request.js、response.js 等文件。
例如 egg-bcrypt 库只是简单的对 extend.js 进行了扩展:
在项目中直接调用 ctx.genHash(plainText) 和 ctx.compare(plainText, hash) 即可。
插入自定义中间件:在 app/middleware 中写中间件,在 app.js 中使用
例如 egg-cors 库就是定义了一个 cors.js 中间件,该中间件就是原封不动的用了 koa-cors
直接在 config/config.default.js 中进行配置,例如:
exports.cors = {
origin: '*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
}
在启动时做一些初始化工作:在 app.js 中添加同步或异步初始化代码
例如 egg-elasticsearch 代码:
只是在启动前建立了一个 ES 连接而已,beforeStart 方法中还可以定义异步启动逻辑,虽然上面的代码是同步的,即用不用 beforeStart 封装都无所谓,但是如果有异步逻辑的话,可以封装一个 async 函数。
设置定时任务:在 app/schedule/ 目录下添加定时任务,定时任务下一节会详细讲。
定时任务
一个复杂的业务场景中,不可避免会有定时任务的需求,例如:
每天检查一下是否有用户过生日,自动发送生日祝福
每天备份一下数据库,防止操作不当导致数据丢失
每周删除一次临时文件,释放磁盘空间
定时从远程接口获取数据,更新本地缓存
egg 框架提供了定时任务功能,在 app/schedule 目录下,每一个文件都是一个独立的定时任务,可以配置定时任务的属性和要执行的方法,例如创建一个 update_cache.js 的更新缓存任务,每分钟执行一次:
const Subscription = require('egg').Subscription
class UpdateCache extends Subscription {
// 通过 schedule 属性来设置定时任务的执行间隔等配置
static get schedule() {
return {
interval: '1m', // 1 分钟间隔
type: 'all', // 指定所有的 worker 都需要执行
}
}
// subscribe 是真正定时任务执行时被运行的函数
async subscribe() {
const res = await this.ctx.curl('http://www.api.com/cache', {
dataType: 'json',
})
this.ctx.app.cache = res.data
}
}
module.exports = UpdateCache
也就是说,egg 会从静态访问器属性 schedule 中获取定时任务的配置,然后按照配置来执行 subscribe 方法。执行任务的时机可以用 interval 或者 cron 两种方式来指定:
interval 可以使数字或字符串,如果是数字则表示毫秒数,例如 5000 就是 5 秒,如果是字符类型,会通过 ms 这个包转换成毫秒数,例如 5 秒可以直接写成 5s。
cron 表达式则通过 cron-parser 进行解析,语法为:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, optional)
执行任务的类型有两种:
worker 类型:只有一个 worker 会执行这个定时任务(随机选择)
all 类型:每个 worker 都会执行这个定时任务
使用哪种类型要看具体的业务了,例如更新缓存的任务肯定是选择 all,而备份数据库的任务选择 worker 就够了,否则会重复备份。
有一些场景我们可能需要手动的执行定时任务,例如应用启动时的初始化任务,可以通过 app.runSchedule(schedulePath) 来运行。app.runSchedule 接受一个定时任务文件路径(app/schedule 目录下的相对路径或者完整的绝对路径),在 app.js 中代码为:
module.exports = app => {
app.beforeStart(async () => {
// 程序启动前确保缓存已更新
await app.runSchedule('update_cache')
})
}
错误处理
在开发环境下会提供非常友好的可视化界面帮助开发者定位问题,例如当我们把 model.User 换成小写之后调用该方法:
直接定位到错误所在的行,方便开发者快速调试。不过放心,在生产环境下,egg 不会把错误栈暴露给用户,而是返回下面的错误提示:
Internal Server Error, real status: 500
如果我们的项目是前后端分离的,所有返回都是 JSON 格式的话,可以在 config/plugin.js 中进行如下配置:
module.exports = {
onerror: {
accepts: () => 'json',
},
};
那么就会把错误调用栈直接以 JSON 的格式返回:
{
"message": "Cannot read property 'find' of undefined",
"stack": "TypeError: Cannot read property 'find' of undefined\n at UserController.index (/Users/keliq/code/egg-project/app/controller/user.js:7:37)",
"name": "TypeError",
"status": 500
}
accepts 函数是 content negotiation 的思想的具体实现,即让用户自己决定以何种格式返回,这也体现了 egg 极大的灵活性,例如我们希望当 content-type 为 `` 的时候返回 JSON 格式,而其他情况下则返回 HTML,可以这么写:
module.exports = {
onerror: {
accepts: (ctx) => {
if (ctx.get('content-type') === 'application/json') return 'json';
return 'html';
}
},
};
不过我们也可以在 config/config.default.js 中自定义错误:
module.exports = {
onerror: {
errorPageUrl: '/public/error.html',
},
};
此时生产环境的报错会被重定向到该路径,并在后面带上了参数 ?real_status=500。实际上,egg 的错误是由内置插件 egg-onerror 来处理的,一个请求的所有处理方法(Middleware、Controller、Service)中抛出的任何异常都会被它捕获,并自动根据请求想要获取的类型返回不同类型的错误:
module.exports = {
onerror: {
all(err, ctx) {
// 在此处定义针对所有响应类型的错误处理方法
// 注意,定义了 config.all 之后,其他错误处理方法不会再生效
ctx.body = 'error'
ctx.status = 500
},
html(err, ctx) { // 处理 html hander
ctx.body = '
error
'ctx.status = 500
},
json(err, ctx) { // json hander
ctx.body = {message: 'error'}
ctx.status = 500
},
},
}
不过有一点需要注意的是:框架并不会将服务端返回的 404 状态当做异常来处理,egg 如果发现状态码是 404 且没有 body 时,会做出如下的默认响应:
当请求为 JSON 时,会返回 JSON:{ "message": "Not Found" }
当请求为 HTML 时,会返回 HTML:
404 Not Found
很多厂都是自己写 404 页面的,如果你也有这个需求,也可以自己写一个 HTML,然后在 config/config.default.js 中指定:
module.exports = {
notfound: {
pageUrl: '/404.html',
}
}
但是上面只是将默认的 HTML 请求的 404 响应重定向到指定的页面,如果你想和自定义异常处理一样,完全自定义服务器 404 时的响应,包括定制 JSON 返回的话,只需要加入一个 middleware/notfound_handler.js 中间件:
module.exports = () => {
return async function (ctx, next) {
await next()
if (ctx.status === 404 && !ctx.body) {
ctx.body = ctx.acceptJSON ? { error: 'Not Found' } : '
Page Not Found
'}
}
}
当然,别忘了在 config/config.default.js 中引入该中间件:
config.middleware = ['notfoundHandler']
生命周期
在 egg 启动的过程中,提供了下面几个生命周期钩子方便大家调用:
配置文件即将加载,这是最后动态修改配置的时机(configWillLoad)
配置文件加载完成(configDidLoad)
文件加载完成(didLoad)
插件启动完毕(willReady)
worker 准备就绪(didReady)
应用启动完成(serverDidReady)
应用即将关闭(beforeClose)
只要在项目根目录中创建 app.js,添加并导出一个类即可:
class AppBootHook {
constructor(app) {
this.app = app
}
configWillLoad() {
// config 文件已经被读取并合并,但是还并未生效,这是应用层修改配置的最后时机
// 注意:此函数只支持同步调用
}
configDidLoad() {
// 所有的配置已经加载完毕,可以用来加载应用自定义的文件,启动自定义的服务
}
async didLoad() {
// 所有的配置已经加载完毕,可以用来加载应用自定义的文件,启动自定义的服务
}
async willReady() {
// 所有的插件都已启动完毕,但是应用整体还未 ready
// 可以做一些数据初始化等操作,这些操作成功才会启动应用
}
async didReady() {
// 应用已经启动完毕
}
async serverDidReady() {
// http / https server 已启动,开始接受外部请求
// 此时可以从 app.server 拿到 server 的实例
}
async beforeClose() {
// 应用即将关闭
}
}
module.exports = AppBootHook
图解
框架扩展
egg 框架提供了下面几个扩展点:
Application: Koa 的全局应用对象(应用级别),全局只有一个,在应用启动时被创建
Context:Koa 的请求上下文对象(请求级别),每次请求生成一个 Context 实例
Request:Koa 的 Request 对象(请求级别),提供请求相关的属性和方法
Response:Koa 的 Response 对象(请求级别),提供响应相关的属性和方法
Helper:用来提供一些实用的 utility 函数
也就是说,开发者可以对上述框架内置对象进行任意扩展。扩展的写法为:
const BAR = Symbol('bar')
module.exports = {
foo(param) {}, // 扩展方法
get bar() { // 扩展属性
if (!this[BAR]) {
this[BAR] = this.get('x-bar')
}
return this[BAR]
},
}
扩展点方法里面的 this 就指代扩展点对象自身,扩展的本质就是将用户自定义的对象合并到 Koa 扩展点对象的原型上面,即:
扩展 Application 就是把 app/extend/application.js 中定义的对象与 Koa Application 的 prototype 对象进行合并,在应用启动时会基于扩展后的 prototype 生成 app 对象,可通过 ctx.app.xxx 来进行访问:
扩展 Context 就是把 app/extend/context.js 中定义的对象与 Koa Context 的 prototype 对象进行合并,在处理请求时会基于扩展后的 prototype 生成 ctx 对象。
扩展 Request/Response 就是把 app/extend/
扩展 Helper 就是把 app/extend/helper.js 中定义的对象与内置 helper 的 prototype 对象进行合并,在处理请求时会基于扩展后的 prototype 生成 helper 对象。
定制框架
egg 最为强大的功能就是允许团队自定义框架,也就是说可以基于 egg 来封装上层框架,只需要扩展两个类:
Application:App Worker 启动时会实例化 Application,单例
Agent:Agent Worker 启动的时候会实例化 Agent,单例
定制框架步骤:
npm init egg --type=framework --registry=china
# 或者 yarn create egg --type=framework --registry=china
生成如下目录结构:
├── app
│ ├── extend
│ │ ├── application.js
│ │ └── context.js
│ └── service
│ └── test.js
├── config
│ ├── config.default.js
│ └── plugin.js
├── index.js
├── lib
│ └── framework.js
├── package.json
可以看到,除了多了一个 lib 目录之外,其他的结构跟普通的 egg 项目并没有任何区别,我们看一下 lib/framework.js 中的代码:
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,
})
可以看到,只是自定义了 Application 和 Agent 两个类,然后挂载到 egg 对象上面而已。而这两个自定义的类里面将访问器属性 Symbol.for('egg#eggPath') 赋值为 path.dirname(__dirname),也就是框架的根目录。为了能够在本地测试自定义框架,我们首先去框架项目(假设叫 my-framework)下运行:
npm link # 或者 yarn link
然后到 egg 项目下运行:
npm link my-framework
最后在 egg 项目的 package.json 中添加下面的代码即可:
"egg": {
"framework": "my-framework"
},
自定义框架的实现原理是基于类的继承,每一层框架都必须继承上一层框架并且指定 eggPath,然后遍历原型链就能获取每一层的框架路径,原型链下面的框架优先级更高,例如:部门框架(department)> 企业框架(enterprise)> Egg
const Application = require('egg').Application
// 继承 egg 的 Application
class Enterprise extends Application {
get [EGG_PATH]() {
return '/path/to/enterprise'
}
}
const Application = require('enterprise').Application
// 继承 enterprise 的 Application
class Department extends Application {
get [EGG_PATH]() {
return '/path/to/department'
}
}
定时框架的好处就是层层递进的业务逻辑复用,不同部门框架直接用公司框架里面的写好的业务逻辑,然后补充自己的业务逻辑。虽然插件也能达到代码复用的效果,但是业务逻辑不好封装成插件,封装成框架会更好一些,下面就是应用、框架和插件的区别:
文件应用框架插件package.json✅✅✅config/plugin.{env}.js✅✅❌config/config.{env}.js✅✅✅app/extend/application.js✅✅✅app/extend/request.js✅✅✅app/extend/response.js✅✅✅app/extend/context.js✅✅✅app/extend/helper.js✅✅✅agent.js✅✅✅app.js✅✅✅app/service✅✅✅app/middleware✅✅✅app/controller✅❌❌app/router.js✅❌❌
除了使用 Symbol.for('egg#eggPath') 来指定当前框架的路径实现继承之外,还可以自定义加载器,只需要提供 Symbol.for('egg#loader') 访问器属性并自定义 AppWorkerLoader 即可:
const path = require('path')
const egg = require('egg')
const EGG_PATH = Symbol.for('egg#eggPath')
const EGG_LOADER = Symbol.for('egg#loader')
class MyAppWorkerLoader extends egg.AppWorkerLoader {
// 自定义的 AppWorkerLoader
}
class Application extends egg.Application {
get [EGG_PATH]() {
return path.dirname(__dirname)
}
get [EGG_LOADER]() {
return MyAppWorkerLoader
}
}
AppWorkerLoader 继承自 egg-core 的 EggLoader,它是一个基类,根据文件加载的规则提供了一些内置的方法,它本身并不会去调用这些方法,而是由继承类调用。
loadPlugin()
loadConfig()
loadAgentExtend()
loadApplicationExtend()
loadRequestExtend()
loadResponseExtend()
loadContextExtend()
loadHelperExtend()
loadCustomAgent()
loadCustomApp()
loadService()
loadMiddleware()
loadController()
loadRouter()
也就是说我们自定义的 AppWorkerLoader 中可以重写这些方法:
const {AppWorkerLoader} = require('egg')
const {EggLoader} = require('egg-core')
// 如果需要改变加载顺序,则需要继承 EggLoader,否则可以继承 AppWorkerLoader
class MyAppWorkerLoader extends AppWorkerLoader {
constructor(options) {
super(options)
}
load() {
super.load()
console.log('自定义load逻辑')
}
loadPlugin() {
super.loadPlugin()
console.log('自定义plugin加载逻辑')
}
loadConfig() {
super.loadConfig()
console.log('自定义config加载逻辑')
}
loadAgentExtend() {
super.loadAgentExtend()
console.log('自定义agent extend加载逻辑')
}
loadApplicationExtend() {
super.loadApplicationExtend()
console.log('自定义application extend加载逻辑')
}
loadRequestExtend() {
super.loadRequestExtend()
console.log('自定义request extend加载逻辑')
}
loadResponseExtend() {
super.loadResponseExtend()
console.log('自定义response extend加载逻辑')
}
loadContextExtend() {
super.loadContextExtend()
console.log('自定义context extend加载逻辑')
}
loadHelperExtend() {
super.loadHelperExtend()
console.log('自定义helper extend加载逻辑')
}
loadCustomAgent() {
super.loadCustomAgent()
console.log('自定义custom agent加载逻辑')
}
loadCustomApp() {
super.loadCustomApp()
console.log('自定义custom app加载逻辑')
}
loadService() {
super.loadService()
console.log('自定义service加载逻辑')
}
loadMiddleware() {
super.loadMiddleware()
console.log('自定义middleware加载逻辑')
}
loadController() {
super.loadController()
console.log('自定义controller加载逻辑')
}
loadRouter() {
super.loadRouter()
console.log('自定义router加载逻辑')
}
}
最后的输出结果为:
自定义plugin加载逻辑
自定义config加载逻辑
自定义application extend加载逻辑
自定义request extend加载逻辑
自定义response extend加载逻辑
自定义context extend加载逻辑
自定义helper extend加载逻辑
自定义custom app加载逻辑
自定义service加载逻辑
自定义middleware加载逻辑
自定义controller加载逻辑
自定义router加载逻辑
自定义load逻辑
从输出结果能够看出默认情况下的加载顺序。如此以来,框架的加载逻辑可以完全交给开发者,如何加载 Controller、Service、Router 等。
乔珂力
141
文章
389k
阅读
370
粉丝 目录 收起
egg 介绍
egg 是什么?
为什么叫 egg ?
哪些产品是用 egg 开发的?
哪些公司在用 egg?
egg 支持 Typescript 吗?
用 JavaScript 写 egg 会有智能提示吗?
egg 和 koa 是什么关系?
学习 egg 需要会 koa 吗?
创建项目
目录约定
路由(Router)
中间件(Middleware)
控制器(Controller)
服务(Service)
模板渲染
插件
集成 MongoDB
集成 MySQL
自定义插件
定时任务
错误处理
生命周期
框架扩展
定制框架
友情链接:
天劫医生 txt
无毒小说网
星 小说
故人何以是情侣网名吗
皇上皇后娘娘薨了第50章
java 扫雷算法
EGG中文(简体)翻译:剑桥词典
EGG中文(简体)翻译:剑桥词典
词典
翻译
语法
同义词词典
+Plus
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录
/
注册
中文 (简体)
查找
查找
英语-中文(简体)
egg 在英语-中文(简体)词典中的翻译
eggnoun uk
Your browser doesn't support HTML5 audio
/eɡ/ us
Your browser doesn't support HTML5 audio
/eɡ/
egg noun
(FOOD)
Add to word list
Add to word list
A1 [ C or U ] the oval object with a hard shell that is produced by female birds, especially chickens, eaten as food
(食用的)蛋(尤指鸡蛋)
a hard-boiled/soft-boiled egg
煮得老的/嫩的鸡蛋
How do you like your eggs - fried or boiled?
鸡蛋你想怎样吃?是吃煎的还是煮的?
[ C ] an object that is made in the shape of a bird's egg
蛋状物
a chocolate/marble egg
巧克力蛋/大理石球
更多范例减少例句Mix the butter with the sugar and then add the egg.Crack three eggs into a bowl and mix them together.Could you get me half a dozen eggs when you go to the shop?We had bacon and eggs for breakfast.I like eggs lightly cooked so that the yolk is still runny.
egg noun
(REPRODUCTION)
B2 [ C ] an oval object, often with a hard shell, that is produced by female birds and particular reptiles and insects, and contains a baby animal that comes out when it is developed
(鸟类的)卵,蛋
The cuckoo lays her egg in another bird's nest.
杜鹃将卵产在别的鸟的巢里。
After fourteen days the eggs hatch.
14天后,卵孵化了。
[ C ] a cell produced by a woman or female animal from which a baby can develop if it combines with a male sex cell
卵,卵子;卵细胞
Identical twins develop from a single fertilized egg that then splits into two.
同卵双胞胎是由一个受精卵分裂发育而来的。
更多范例减少例句Once an egg is fertilized by the sperm, it becomes an embryo.An attempt to implant an embryo using an egg from an anonymous woman donor was unsuccessful.Genes determine how we develop from the moment the sperm fuses with the egg.A blackbird's egg is blue with brown speckles on it.In human reproduction, one female egg is usually fertilized by one sperm.
习语
have egg on your face
put all your eggs in one basket
(egg在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)
A1,B2
egg的翻译
中文(繁体)
食物, (食用的)蛋(尤指雞蛋), 蛋狀物…
查看更多内容
西班牙语
huevo, óvulo, huevo [masculine]…
查看更多内容
葡萄牙语
ovo, ovo [masculine], óvulo [masculine]…
查看更多内容
更多语言
in Marathi
日语
土耳其语
法语
加泰罗尼亚语
in Dutch
in Tamil
in Hindi
in Gujarati
丹麦语
in Swedish
马来语
德语
挪威语
in Urdu
in Ukrainian
俄语
in Telugu
阿拉伯语
in Bengali
捷克语
印尼语
泰语
越南语
波兰语
韩语
意大利语
अंडी, अंडाकृती, अंडे…
查看更多内容
(ニワトリの)卵, 卵, 卵(たまご)…
查看更多内容
yumurta, (kuş, böcek vb.yavrusu taşıyan) yumurta…
查看更多内容
œuf [masculine], ovule [masculine], oeuf…
查看更多内容
ou…
查看更多内容
ei, eicel…
查看更多内容
பெண் பறவைகள், குறிப்பாக கோழிகள், மற்றும் உணவாக உண்ணப்படும் ஒரு கடினமான ஓட்டைக் கொண்ட ஓவல் (நீள்வட்ட) விடிவாலான பொருள்…
查看更多内容
अंडा, पक्षी के अंडे के आकार में बनी वस्तु, (किसी महिला या मादा पशु द्वारा निर्मित कोशिका) अंडा…
查看更多内容
ઈંડું, ઈંડાકારમાં, ઈંડા…
查看更多内容
æg, ægcelle…
查看更多内容
ägg…
查看更多内容
telur…
查看更多内容
das Ei, die Eizelle…
查看更多内容
egg [neuter], eggcelle [masculine], egg…
查看更多内容
انڈہ, بیضہ, بیضہ نما…
查看更多内容
яйце, яйцеклітина…
查看更多内容
яйцо, яйцеклетка…
查看更多内容
గుడ్డు, పక్షి గుడ్డు ఆకారంలో చేసిన వస్తువు, అండం…
查看更多内容
بَيْضة…
查看更多内容
ডিম, মুর্গীর ডিম, পাখির ডিমের আকারে তৈরি কোনো বস্তু…
查看更多内容
vejce, vajíčko…
查看更多内容
telur, sel telur…
查看更多内容
ไข่, ไข่ไก่, ไข่ของสัตว์เลี้ยงลูกด้วยนมตัวเมีย…
查看更多内容
quả trứng, trứng…
查看更多内容
jajko, jajo, jajeczko…
查看更多内容
달걀, 알…
查看更多内容
uovo, cellula uovo*…
查看更多内容
需要一个翻译器吗?
获得快速、免费的翻译!
翻译器工具
egg的发音是什么?
在英语词典中查看 egg 的释义
浏览
EFL
egalitarian
egalitarianism
egestion
egg
egg cream
egg cup
egg flip
egg roll
egg更多的中文(简体)翻译
全部
egg cup
egg flip
egg roll
egg yolk
nest egg
over-egg
egg cream
查看全部意思»
词组动词
egg someone on
查看全部动词词组意思»
惯用语
curate's egg idiom
can't boil an egg idiom
over-egg the pudding idiom
have egg on your face idiom
a chicken and egg situation idiom
kill the goose that lays the golden egg idiom
查看全部惯用语意思»
“每日一词”
veggie burger
UK
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɜː.ɡər/
US
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɝː.ɡɚ/
a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape
关于这个
博客
Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)
March 06, 2024
查看更多
新词
stochastic parrot
March 04, 2024
查看更多
已添加至 list
回到页面顶端
内容
英语-中文(简体)翻译
©剑桥大学出版社与评估2024
学习
学习
学习
新词
帮助
纸质书出版
Word of the Year 2021
Word of the Year 2022
Word of the Year 2023
开发
开发
开发
词典API
双击查看
搜索Widgets
执照数据
关于
关于
关于
无障碍阅读
剑桥英语教学
剑桥大学出版社与评估
授权管理
Cookies与隐私保护
语料库
使用条款
京ICP备14002226号-2
©剑桥大学出版社与评估2024
剑桥词典+Plus
我的主页
+Plus 帮助
退出
词典
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
翻译
语法
同义词词典
Pronunciation
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录 /
注册
中文 (简体)
Change
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
中文 (简体)
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
关注我们
选择一本词典
最近的词和建议
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
语法与同义词词典
对自然书面和口头英语用法的解释
英语语法
同义词词典
Pronunciation
British and American pronunciations with audio
English Pronunciation
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
词典+Plus
词汇表
选择语言
中文 (简体)
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
内容
英语-中文(简体)
Noun
egg (FOOD)
egg (REPRODUCTION)
Translations
语法
所有翻译
我的词汇表
把egg添加到下面的一个词汇表中,或者创建一个新词汇表。
更多词汇表
前往词汇表
对该例句有想法吗?
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
egg的设计理念和底层实现架构模式_eggjs底层是node吗-CSDN博客
>egg的设计理念和底层实现架构模式_eggjs底层是node吗-CSDN博客
egg的设计理念和底层实现架构模式
最新推荐文章于 2022-12-07 22:17:33 发布
qdmoment
最新推荐文章于 2022-12-07 22:17:33 发布
阅读量1.6k
收藏
2
点赞数
分类专栏:
架构
egg
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qdmoment/article/details/88713897
版权
架构
同时被 2 个专栏收录
16 篇文章
0 订阅
订阅专栏
egg
5 篇文章
1 订阅
订阅专栏
在egg的官方文档上可以看到:
Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。
那么到底什么是egg呢?
egg设计理念
首先egg也是一款基于node的server web框架,但这个框架不同于koa2, express。
1,egg不定制技术选型,专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制
2,一个插件只做一件事
比如 Nunjucks 模板封装成了 egg-view-nunjucks、MySQL 数据库封装成了 egg-mysql
3,约定优于配置
按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本
和express,koa, sails 框架的区别
Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。
但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法
egg基于koa
sails和egg一样,奉行约定优于配置,可扩展性也很高,但是egg封装集成度没有sails高,sails集成了一些egg没有封装在框架内的插件。
总的来说:
egg有以下特性:
提供基于 Egg 定制上层框架的能力
高度可扩展的插件机制
内置多进程管理
基于 Koa 开发,性能优异
框架稳定,测试覆盖率高
渐进式开发
egg底层架构实现模式:
egg继承了koa框架;
关于kao的设计模式,这里简单提及:
支持async function(){}
中间件选择洋葱圈模型
context上继承response和request,贯穿整个请求
egg基于koa的扩展:
1,通过定义 app/extend/{application,context,request,response}.js 来扩展 Koa 中对应的四个对象的原型
2,koa中是引入插件来做一些功能,比如koa-session koa-bodyparse
egg针对这个功能提供插件机制:
一个插件可以包含
extend:扩展基础对象的上下文,提供各种工具类、属性。middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。config:配置各个环境下插件自身的默认配置项。
参考: https://eggjs.org/zh-cn/intro/egg-and-koa.html
优惠劵
qdmoment
关注
关注
0
点赞
踩
2
收藏
觉得还不错?
一键收藏
知道了
0
评论
egg的设计理念和底层实现架构模式
在egg的官方文档上可以看到:Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。那么到底什么是egg呢?egg设计理念首先egg也是一款基于node的server web框架,但这个框架不同于koa2, express。1,egg不定制技术选型,专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机...
复制链接
扫一扫
专栏目录
Eggjs笔记:中间件配置、Post数据处理、安全机制CSRF防范、中间件模板全局变量配置
Wang的专栏
03-31
819
关于中间件
中间件:匹配路由前、匹配路由完成做的一系列的操作
Egg 是基于 Koa 实现的
Egg 的中间件形式和 Koa 的中间件形式是一样的,都是基于洋葱圈模型
Koa中的中间件:http://eggjs.org/zh-cn/intro/egg-and-koa.html#midlleware
Egg中的中间件:http://eggjs.org/zh-cn/basics/middleware...
egg运行原理
Fuohua的博客
08-01
1417
关于egg
egg是阿里开源的一个框架,为企业级框架和应用而生,相较于express和koa,有更加严格的目录结构和规范,使得团队可以在基于egg定制化自己的需求或者根据egg封装出适合自己团队业务的更上层框架
egg所处的定位
天猪曾经在这篇优秀的博文中给出关于egg的定位,如下图:
可以看到egg处于的是一个中间层的角色,基于koa,不同于koa以middle...
参与评论
您还未登录,请先
登录
后发表或查看评论
框架设计:如何基于 Egg 设计 Node 的服务框架
小分享
10-27
1077
Node 的工具化价值自不多言,而服务化价值需要长期探索,小菜前端在服务化路上依然是小学生,目前的尝试是是 Cross 框架,尝到了一些甜头。
我想,几乎没有前端工程师会对 Node 不感兴趣,但用它适合干哪些事情,每个人的答案都不同了,比如小菜前端,我们对于 Node 的深度尝试,可以在这里找到答案:《技术栈:为什么 Node 是前端团队的核心技术栈》[1],但关于让 Node 做服务端的...
Egg入门学习(一)
weixin_30520015的博客
01-03
411
一:什么是Egg? 它能做什么?Egg.js是nodejs的一个框架,它是基于koa框架的基础之上的上层框架,它继承了koa的,它可以帮助开发人员提高开发效率和维护成本。Egg约定了一些规则,在开发中,我们可以按照一套统一的约定进行应用开发,团队内部使用这种方式开发可以减少开发人员的学习成本。
Express也是Node.js的一个框架,express简单且扩展性强,但是express框架缺少了...
【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》
aSuncat
02-25
2715
第一章 课程导学
一、Egg.js框架介绍
1、Egg.js是基于Node.js和Koa的一个企业级应用开发框架,可以帮助团队降低开发成本和维护成本。
二、express,koa.js
上手比较简单,但是没有严格的开发规范
三、Egg.js特性
1、提供基于Egg的定制上层框架的能力
2、高度可扩展的插件机制
3、内置多进程管理
4、基于Koa开发性能优异
5、框架稳定,测试覆盖率高
6、渐进式开发
四、涉及技术点
vant ui框架
vue-cli3
moment.js
Egg.js基础
mysql基础
egg.js-基于koa2的node.js入门
weixin_34240657的博客
12-12
187
一.Egg.JS 简介
Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点:
Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
Egg 奉行『约定优于配置』,目录名称规范,团队内部采用这种方式可以减少开发人员的学习成本,
Node.遵循MVC框架
Mo...
JS 流行框架(四):EggJS
0lonely0
12-07
1680
JS 流行框架(四):EggJS
Egg 视图 (view)、控制器(controller) 和 数据模型 Model(Service) 和配置文件 (config)和拓展(extend)
ADLF
07-08
1187
MVC 框架:
模型层(服务层)
控制器层: 可以直接调用,egg已经帮我们绑定
配置文件:
调用:
拓展方法: context.js
调用:
拓展方法: helper.js
调用:
模板引擎调用
控制器调用
...
eggjs中,自动从数据库直接生成model
久而久之
02-11
2942
eggjs中,自动从数据库直接生成model.
使用sequelize-auto可以自动生成models
https://www.npmjs.com/package/sequelize-auto
直接上命令就可以搞定了
# 安装必要的库
npm install -g sequelize-auto
# MySQL/MariaDB 数据库安装对应的库,其他数据库请看文档
npm install -g ...
Egg中根据model自动生成migration文件
qq_39649991的博客
09-15
646
背景
在使用egg-sequelize试,model的声明以及migrations的编写会有一定的repeat (egg的issue中也有这个议题)
说明
适用于开发中的数据库初始化,数据库版本迭代请遵循数据库迁移的设计初衷
兼顾了字段、索引
代码就在下面,可以自行修改
原理
在migrations中通过egg-mock获取到model的属性
在测试文件中获取到model的表名、属性,用fs写入文件到migrations文件夹
方法一
可以将migrations按下面demo修改,但是这么写不方
egg-one:基于egg和one的API实现
04-28
egg-one基于eggjs和one的API实现,仅用于学习交流,主要是为了学习应用eggjs提供api以及eggjs的目录结构实践,对比直接请求one来说,会更加简练一些;音乐列表 请求音乐列表首页,每页返回10条数据 ...
23种设计模式之Java实现
12-10
用Java实现的23种设计模式,完整的代码,非常感谢作者,经过近一个星期的持续写作,Java的23种设计模式终于整理完了,这是他自己首次完整的整理一遍设计模式,感受颇多,同时 写下了完整的代码,决定和大家一起分享...
egg的mvc模式demo
06-23
github 上egg mvc的模式确实少,博主用eggjs写了个mvc模式demo,供新手朋友学习交流,可以到博主博文查看演示视频https://blog.csdn.net/xuelang532777032/article/details/125428673
egg服务器架构文档.docx
04-09
入门学习eg框架的笔记,webpack打包,包含egg框架的基本搭建,使用步骤和需要安装的插件,使用node.js,淘宝npm需要自己百度安装,个人觉得egg是最简单的后端框架,内容包含跨域处理和数据库端口处理,还有cookie和...
tiny-egg:Egg.js的最低实现版本
05-08
最低实现版本。 跑步 # clone project git clone git@github.com:caiyongmin/tiny-egg.git # install dependencies npm run bootstrap # run demo npm run demo 浏览页面地址: 。 有关更多页面,请参阅example / ...
lerna开发流程(入坑和出坑)
热门推荐
前端361
06-14
1万+
1, lerna publish发布失败后怎样操作,如下:采用 from-package
Positionals
bumpfrom-git
In addition to the semver keywords supported bylerna version,lerna publishalso supports thefrom-gitkeyword. This will ide...
BRD,PRD,MRD分别代表什么及它们在互联网领域的地位
前端361
08-01
6423
互联网领域有很多的专业名词,开发中用到的有PD,TL等,网页监控用到的有pv,uv等。而在用互联网解决商业领域的一些问题时,就会涉及到BRD,PRD,MRD.
BRD和MRD,PRD一起被认为是从市场到产品需要建立的文档规范。
BRD
BRD是产品生命周期中最早的文档,再早就应该是脑中的构思了,其内容涉及市场分析,销售策略,盈利预测等,通常是供决策层们讨论的演示文档,一般比较短小精炼,没有产...
commander库的作用和简单总结
前端361
01-17
4947
随着网站工程的复杂化,我们不希望把有限的时间浪费到一些诸如文件复制,打包配置等重复的工作上,我们希望在创建新的项目工程时可以使用模板直接初始化项目,这对于效率和团队使用是比较方便的。对于前端工程化而言,模板的封装许多是基于cli,这时候就要用到commander库,进而简化cli。
commander简单总结:
//添加命令:
myCommand
.command('init')
//命令添...
react最新fiber架构原理和流程
前端361
06-19
3140
react16以后做了很大的改变,对diff算法进行了重写,从总体看,主要是把一次计算,改变为多次计算,在浏览器有高级任务时,暂停计算。
原理:从Stack Reconciler到Fiber Reconciler,源码层面其实就是干了一件递归改循环的事情
fiber设计目的:解决由于大量计算导致浏览器掉帧现象。
由于js是单线程的,解决主线程被长时间计算占用的问题,就是将计算分为多个步骤,分...
egg-mp 实现微信支付
最新发布
07-25
要使用 Egg.js 框架实现微信支付,你需要进行以下步骤:
1. 首先,确保你已经在微信开放平台上注册了一个应用,并获得了相应的 AppID 和 AppSecret。
2. 在你的 Egg.js 项目中,安装 `egg-wechat-api` 和 `wechat-pay` 这两个依赖包。你可以通过以下命令安装它们:
```shell
npm install egg-wechat-api wechat-pay --save
```
3. 在 Egg.js 的配置文件 `config/config.default.js` 中,添加以下配置项:
```javascript
// 配置 egg-wechat-api 插件
config.wechatApi = {
appid: 'your_appid',
appsecret: 'your_appsecret',
token: 'your_token',
encodingAESKey: 'your_encoding_AES_key',
};
// 配置 wechat-pay 插件
config.wechatPay = {
appid: 'your_appid',
mch_id: 'your_mch_id',
partner_key: 'your_partner_key',
notify_url: 'your_notify_url',
pfx: require('fs').readFileSync('/path/to/your_cert.p12'),
};
```
替换上述配置项中的 `your_appid`、`your_appsecret`、`your_token`、`your_encoding_AES_key`、`your_mch_id`、`your_partner_key`、`your_notify_url` 和 `/path/to/your_cert.p12` 分别为你在微信开放平台和商户平台上的实际配置。
4. 在你的 Egg.js 控制器中,可以使用 `app.wechatApi` 和 `app.wechatPay` 来调用微信 API 和支付 API。你可以根据微信支付的具体接口文档,编写相应的支付逻辑。
以上是使用 Egg.js 实现微信支付的基本步骤,你还可以根据自己的需求进行更多的定制和扩展。注意,这里只提供了一个简单的示例,实际使用中还需要考虑安全性和错误处理等方面的问题。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
qdmoment
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
196
原创
3万+
周排名
21万+
总排名
47万+
访问
等级
6221
积分
77
粉丝
127
获赞
21
评论
665
收藏
私信
关注
热门文章
http协议和Tcp协议的区别,http协议详解
26805
lerna开发流程(入坑和出坑)
17813
es6中class类静态方法,静态属性理解,实例属性,实例方法理解
16282
关于css全局作用域(:global)和局部作用域(:local)
14953
node安装node-pre-gyp和node-sass报错的原因以及解决办法
13258
分类专栏
数据结构和算法
11篇
express
4篇
react
23篇
node
26篇
es6
24篇
vue
9篇
redux
8篇
js
62篇
css
7篇
webpack
12篇
HTML5
7篇
DOM对象
1篇
系统
8篇
gulp
2篇
typescript
2篇
正则
2篇
架构
16篇
git
1篇
格局
2篇
http/https
2篇
koa
2篇
linux
3篇
数据结构
5篇
egg
5篇
杂谈
服务器
4篇
es10
1篇
知识库
1篇
http协议
3篇
数据库
2篇
js设计模式
5篇
环境
1篇
单元测试
2篇
性能优化
3篇
后端java
1篇
最新评论
在vue文件中使用render函数封装实现动态组件
前端-卡布达:
你好请问一下render方法返回的是jsx呀 vue能直接识别嘛?
智慧PG(pgting),一款拖拽式智能页面搭建系统
CSDN-Ada助手:
一定要坚持创作更多高质量博客哦, 小小红包, 以资鼓励,
更多创作活动请看:
程序员有哪些绝对不能踩的坑?: https://activity.csdn.net/creatActivity?id=10433?utm_source=csdn_ai_ada_redpacket
新人首创任务挑战赛: https://marketing.csdn.net/p/90a06697f3eae83aabea1e150f5be8a5?utm_source=csdn_ai_ada_redpacket
无效数据,你会怎么处理?: https://activity.csdn.net/creatActivity?id=10423?utm_source=csdn_ai_ada_redpacket
全部创作活动: https://mp.csdn.net/mp_blog/manage/creative?utm_source=csdn_ai_ada_redpacket
promise实现原理解析(设计思想)
清醒不困:
这两个函数现在mypromise函数内部写好,然后cb 调用时,直接调用函数内部的resolve或reject
http协议和Tcp协议的区别,http协议详解
柚子柚子l:
作者您好,我想请问一下,问别人要资料的时候他要收网络传输费用符合TCP协议的相关条款吗
promise实现原理解析(设计思想)
KK-Greyson:
resolve和reject 两个参数是从哪传进去的?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
智慧PG集成开发平台pgting-cli发布了
antd扩展动态表单formake,支持事件配置和复杂嵌套
智慧PG(pgting),一款拖拽式智能页面搭建系统
2023年3篇
2022年1篇
2020年23篇
2019年130篇
2018年39篇
目录
目录
分类专栏
数据结构和算法
11篇
express
4篇
react
23篇
node
26篇
es6
24篇
vue
9篇
redux
8篇
js
62篇
css
7篇
webpack
12篇
HTML5
7篇
DOM对象
1篇
系统
8篇
gulp
2篇
typescript
2篇
正则
2篇
架构
16篇
git
1篇
格局
2篇
http/https
2篇
koa
2篇
linux
3篇
数据结构
5篇
egg
5篇
杂谈
服务器
4篇
es10
1篇
知识库
1篇
http协议
3篇
数据库
2篇
js设计模式
5篇
环境
1篇
单元测试
2篇
性能优化
3篇
后端java
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
EGG中文(繁體)翻譯:劍橋詞典
EGG中文(繁體)翻譯:劍橋詞典
詞典
翻譯
文法
同義詞詞典
+Plus
劍橋詞典+Plus
Shop
劍橋詞典+Plus
我的主頁
+Plus 幫助
退出
劍橋詞典+Plus
我的主頁
+Plus 幫助
退出
登錄
/
註冊
正體中文 (繁體)
查找
查找
英語-中文(繁體)
egg 在英語-中文(繁體)詞典中的翻譯
eggnoun uk
Your browser doesn't support HTML5 audio
/eɡ/ us
Your browser doesn't support HTML5 audio
/eɡ/
egg noun
(FOOD)
Add to word list
Add to word list
A1 [ C or U ] the oval object with a hard shell that is produced by female birds, especially chickens, eaten as food
(食用的)蛋(尤指雞蛋)
a hard-boiled/soft-boiled egg
煮得老的/嫩的雞蛋
How do you like your eggs - fried or boiled?
雞蛋你想怎樣吃?是吃煎的還是煮的?
[ C ] an object that is made in the shape of a bird's egg
蛋狀物
a chocolate/marble egg
巧克力蛋/大理石球
更多範例减少例句Mix the butter with the sugar and then add the egg.Crack three eggs into a bowl and mix them together.Could you get me half a dozen eggs when you go to the shop?We had bacon and eggs for breakfast.I like eggs lightly cooked so that the yolk is still runny.
egg noun
(REPRODUCTION)
B2 [ C ] an oval object, often with a hard shell, that is produced by female birds and particular reptiles and insects, and contains a baby animal that comes out when it is developed
(鳥類的)卵,蛋
The cuckoo lays her egg in another bird's nest.
杜鵑將卵産在其他鳥的巢裡。
After fourteen days the eggs hatch.
14天後,卵孵化了。
[ C ] a cell produced by a woman or female animal from which a baby can develop if it combines with a male sex cell
卵,卵子;卵細胞
Identical twins develop from a single fertilized egg that then splits into two.
同卵雙胞胎是由一個受精卵分裂發育而來的。
更多範例减少例句Once an egg is fertilized by the sperm, it becomes an embryo.An attempt to implant an embryo using an egg from an anonymous woman donor was unsuccessful.Genes determine how we develop from the moment the sperm fuses with the egg.A blackbird's egg is blue with brown speckles on it.In human reproduction, one female egg is usually fertilized by one sperm.
習語
have egg on your face
put all your eggs in one basket
(egg在劍橋英語-中文(繁體)詞典的翻譯 © Cambridge University Press)
A1,B2
egg的翻譯
中文(簡體)
食物, (食用的)蛋(尤指鸡蛋), 蛋状物…
查看更多內容
西班牙語
huevo, óvulo, huevo [masculine]…
查看更多內容
葡萄牙語
ovo, ovo [masculine], óvulo [masculine]…
查看更多內容
更多語言
in Marathi
日語
土耳其語
法語
加泰羅尼亞語
in Dutch
in Tamil
in Hindi
in Gujarati
丹麥語
in Swedish
馬來西亞語
德語
挪威語
in Urdu
in Ukrainian
俄語
in Telugu
阿拉伯語
in Bengali
捷克語
印尼語
泰語
越南語
波蘭語
韓語
意大利語
अंडी, अंडाकृती, अंडे…
查看更多內容
(ニワトリの)卵, 卵, 卵(たまご)…
查看更多內容
yumurta, (kuş, böcek vb.yavrusu taşıyan) yumurta…
查看更多內容
œuf [masculine], ovule [masculine], oeuf…
查看更多內容
ou…
查看更多內容
ei, eicel…
查看更多內容
பெண் பறவைகள், குறிப்பாக கோழிகள், மற்றும் உணவாக உண்ணப்படும் ஒரு கடினமான ஓட்டைக் கொண்ட ஓவல் (நீள்வட்ட) விடிவாலான பொருள்…
查看更多內容
अंडा, पक्षी के अंडे के आकार में बनी वस्तु, (किसी महिला या मादा पशु द्वारा निर्मित कोशिका) अंडा…
查看更多內容
ઈંડું, ઈંડાકારમાં, ઈંડા…
查看更多內容
æg, ægcelle…
查看更多內容
ägg…
查看更多內容
telur…
查看更多內容
das Ei, die Eizelle…
查看更多內容
egg [neuter], eggcelle [masculine], egg…
查看更多內容
انڈہ, بیضہ, بیضہ نما…
查看更多內容
яйце, яйцеклітина…
查看更多內容
яйцо, яйцеклетка…
查看更多內容
గుడ్డు, పక్షి గుడ్డు ఆకారంలో చేసిన వస్తువు, అండం…
查看更多內容
بَيْضة…
查看更多內容
ডিম, মুর্গীর ডিম, পাখির ডিমের আকারে তৈরি কোনো বস্তু…
查看更多內容
vejce, vajíčko…
查看更多內容
telur, sel telur…
查看更多內容
ไข่, ไข่ไก่, ไข่ของสัตว์เลี้ยงลูกด้วยนมตัวเมีย…
查看更多內容
quả trứng, trứng…
查看更多內容
jajko, jajo, jajeczko…
查看更多內容
달걀, 알…
查看更多內容
uovo, cellula uovo*…
查看更多內容
需要一個翻譯器嗎?
獲得快速、免費的翻譯!
翻譯器工具
egg的發音是什麼?
在英語詞典中查看 egg 的釋義
瀏覽
EFL
egalitarian
egalitarianism
egestion
egg
egg cream
egg cup
egg flip
egg roll
egg更多的中文(繁體)翻譯
全部
egg cup
egg flip
egg roll
egg yolk
nest egg
over-egg
egg cream
查看全部意思»
片語動詞
egg someone on
查看全部動詞片語意思»
慣用語
curate's egg idiom
can't boil an egg idiom
over-egg the pudding idiom
have egg on your face idiom
a chicken and egg situation idiom
kill the goose that lays the golden egg idiom
查看全部慣用語意思»
「每日一詞」
veggie burger
UK
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɜː.ɡər/
US
Your browser doesn't support HTML5 audio
/ˈvedʒ.i ˌbɝː.ɡɚ/
a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape
關於這個
部落格
Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)
March 06, 2024
查看更多
新詞
stochastic parrot
March 04, 2024
查看更多
已添加至 list
回到頁面頂端
內容
英語-中文(繁體)翻譯
©劍橋大學出版社與評估2024
學習
學習
學習
新詞
幫助
紙本出版
Word of the Year 2021
Word of the Year 2022
Word of the Year 2023
開發
開發
開發
詞典API
連按兩下查看
搜尋Widgets
執照資料
關於
關於
關於
無障礙閱讀
劍橋英語教學
劍橋大學出版社與評估
授權管理
Cookies與隱私保護
語料庫
使用條款
京ICP备14002226号-2
©劍橋大學出版社與評估2024
劍橋詞典+Plus
我的主頁
+Plus 幫助
退出
詞典
定義
清晰解釋自然的書面和口頭英語
英語
學習詞典
基礎英式英語
基礎美式英語
翻譯
點選箭頭改變翻譯方向。
雙語詞典
英語-中文(簡體)
Chinese (Simplified)–English
英語-中文(繁體)
Chinese (Traditional)–English
英語-荷蘭文
荷蘭語-英語
英語-法語
法語-英語
英語-德語
德語-英語
英語-印尼語
印尼語-英語
英語-義大利語
義大利語-英語
英語-日語
日語-英語
英語-挪威語
挪威語-英語
英語-波蘭語
波蘭語-英語
英語-葡萄牙語
葡萄牙語-英語
英語-西班牙語
西班牙語-英語
English–Swedish
Swedish–English
半雙語詞典
英語-阿拉伯語
英語-孟加拉文
英語-加泰羅尼亞語
英語-捷克語
英語-丹麥語
English–Gujarati
英語-印地語
英語-韓語
英語-馬來語
英語-馬拉地語
英語-俄語
English–Tamil
English–Telugu
英語-泰語
英語-土耳其語
英語-烏克蘭文
English–Urdu
英語-越南語
翻譯
文法
同義詞詞典
Pronunciation
劍橋詞典+Plus
Shop
劍橋詞典+Plus
我的主頁
+Plus 幫助
退出
登錄 /
註冊
正體中文 (繁體)
Change
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
中文 (简体)
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
關注我們!
選擇一本詞典
最近的詞和建議
定義
清晰解釋自然的書面和口頭英語
英語
學習詞典
基礎英式英語
基礎美式英語
文法與同義詞詞典
對自然書面和口頭英語用法的解釋
英語文法
同義詞詞典
Pronunciation
British and American pronunciations with audio
English Pronunciation
翻譯
點選箭頭改變翻譯方向。
雙語詞典
英語-中文(簡體)
Chinese (Simplified)–English
英語-中文(繁體)
Chinese (Traditional)–English
英語-荷蘭文
荷蘭語-英語
英語-法語
法語-英語
英語-德語
德語-英語
英語-印尼語
印尼語-英語
英語-義大利語
義大利語-英語
英語-日語
日語-英語
英語-挪威語
挪威語-英語
英語-波蘭語
波蘭語-英語
英語-葡萄牙語
葡萄牙語-英語
英語-西班牙語
西班牙語-英語
English–Swedish
Swedish–English
半雙語詞典
英語-阿拉伯語
英語-孟加拉文
英語-加泰羅尼亞語
英語-捷克語
英語-丹麥語
English–Gujarati
英語-印地語
英語-韓語
英語-馬來語
英語-馬拉地語
英語-俄語
English–Tamil
English–Telugu
英語-泰語
英語-土耳其語
英語-烏克蘭文
English–Urdu
英語-越南語
詞典+Plus
詞彙表
選擇語言
正體中文 (繁體)
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
中文 (简体)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
內容
英語-中文(繁體)
Noun
egg (FOOD)
egg (REPRODUCTION)
Translations
文法
所有翻譯
我的詞彙表
把egg添加到下面的一個詞彙表中,或者創建一個新詞彙表。
更多詞彙表
前往詞彙表
對該例句有想法嗎?
例句中的單詞與輸入詞條不匹配。
該例句含有令人反感的內容。
取消
提交
例句中的單詞與輸入詞條不匹配。
該例句含有令人反感的內容。
取消
提交
Egg | Definition, Characteristics, & Nutritional Content | Britannica
Egg | Definition, Characteristics, & Nutritional Content | Britannica
Search Britannica
Click here to search
Search Britannica
Click here to search
Login
Subscribe
Subscribe
Home
Games & Quizzes
History & Society
Science & Tech
Biographies
Animals & Nature
Geography & Travel
Arts & Culture
Money
Videos
On This Day
One Good Fact
Dictionary
New Articles
History & Society
Lifestyles & Social Issues
Philosophy & Religion
Politics, Law & Government
World History
Science & Tech
Health & Medicine
Science
Technology
Biographies
Browse Biographies
Animals & Nature
Birds, Reptiles & Other Vertebrates
Bugs, Mollusks & Other Invertebrates
Environment
Fossils & Geologic Time
Mammals
Plants
Geography & Travel
Geography & Travel
Arts & Culture
Entertainment & Pop Culture
Literature
Sports & Recreation
Visual Arts
Companions
Demystified
Image Galleries
Infographics
Lists
Podcasts
Spotlights
Summaries
The Forum
Top Questions
#WTFact
100 Women
Britannica Kids
Saving Earth
Space Next 50
Student Center
Home
Games & Quizzes
History & Society
Science & Tech
Biographies
Animals & Nature
Geography & Travel
Arts & Culture
Money
Videos
egg
Table of Contents
egg
Table of Contents
IntroductionCharacteristics of the eggStructure and compositionMicrobiologyFresh eggsEgg productsLiquid egg productsDried egg productsFrozen egg productsSpecialty egg products
References & Edit History
Related Topics
Images & Videos
Quizzes
Ultimate Foodie Quiz
A World of Food Quiz
Baking and Baked Goods Quiz
What’s on the Menu? Vocabulary Quiz
Read Next
What Do Eggs Have to Do with Easter?
10 Incredible Uses for Eggs
Discover
9 of the World’s Deadliest Snakes
What Did Cleopatra Look Like?
Was Napoleon Short?
America’s 5 Most Notorious Cold Cases (Including One You May Have Thought Was Already Solved)
12 Greek Gods and Goddesses
Did Marie-Antoinette Really Say “Let Them Eat Cake”?
How Did Helen Keller Fly a Plane?
Home
Entertainment & Pop Culture
Food
Arts & Culture
egg
food
Actions
Cite
verifiedCite
While every effort has been made to follow citation style rules, there may be some discrepancies.
Please refer to the appropriate style manual or other sources if you have any questions.
Select Citation Style
MLA
APA
Chicago Manual of Style
Copy Citation
Share
Share
Share to social media
URL
https://www.britannica.com/topic/egg-food
Give Feedback
External Websites
Feedback
Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).
Feedback Type
Select a type (Required)
Factual Correction
Spelling/Grammar Correction
Link Correction
Additional Information
Other
Your Feedback
Submit Feedback
Thank you for your feedback
Our editors will review what you’ve submitted and determine whether to revise the article.
External Websites
Harvard - T.H. Chan School of Public Health - Eggs
Food Timeline - Eggs
Verywell Fit - Egg Nutrition Facts and Health Benefits
Healthline - 6 Reasons Why Eggs Are the Healthiest Food on the Planet
National Center for Biotechnology Information - PubMed Central - Egg and Egg-Derived Foods: Effects on Human Health and Use as Functional Foods
Chemistry LibreTexts - Eggs
Please select which sections you would like to print:
Table Of Contents
Cite
verifiedCite
While every effort has been made to follow citation style rules, there may be some discrepancies.
Please refer to the appropriate style manual or other sources if you have any questions.
Select Citation Style
MLA
APA
Chicago Manual of Style
Copy Citation
Share
Share
Share to social media
URL
https://www.britannica.com/topic/egg-food
Feedback
External Websites
Feedback
Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).
Feedback Type
Select a type (Required)
Factual Correction
Spelling/Grammar Correction
Link Correction
Additional Information
Other
Your Feedback
Submit Feedback
Thank you for your feedback
Our editors will review what you’ve submitted and determine whether to revise the article.
External Websites
Harvard - T.H. Chan School of Public Health - Eggs
Food Timeline - Eggs
Verywell Fit - Egg Nutrition Facts and Health Benefits
Healthline - 6 Reasons Why Eggs Are the Healthiest Food on the Planet
National Center for Biotechnology Information - PubMed Central - Egg and Egg-Derived Foods: Effects on Human Health and Use as Functional Foods
Chemistry LibreTexts - Eggs
Written by
Glenn W. Froning
Professor of Food Science and Technology, University of Nebraska, Lincoln. Author of Effect of Season and Age of Layer on Egg Quality.
Glenn W. Froning,
R. Paul Singh
Professor of Food Engineering, University of California, Davis. Coauthor of Introduction to Food Engineering.
R. Paul SinghSee All
Fact-checked by
The Editors of Encyclopaedia Britannica
Encyclopaedia Britannica's editors oversee subject areas in which they have extensive knowledge, whether from years of experience gained by working on that content or via study for an advanced degree. They write new content and verify and edit content received from contributors.
The Editors of Encyclopaedia Britannica
Last Updated:
Feb 16, 2024
•
Article History
Table of Contents
brown eggs
See all media
Category:
Arts & Culture
Related Topics:
shakshouka
century egg
dried egg
egg white
liquid egg
(Show more)
On the Web:
Healthline - 6 Reasons Why Eggs Are the Healthiest Food on the Planet (Feb. 16, 2024)
(Show more)
See all related content →
Recent News
Feb. 13, 2024, 3:45 AM ET (Yahoo News)
Scientists discover ancient egg dating back 1,700 years still has liquid inside
egg, the content of the hard-shelled reproductive body produced by a bird, considered as food.While the primary role of the egg obviously is to reproduce the species, most eggs laid by domestic fowl, except those specifically set aside for hatching, are not fertilized but are sold mainly for human consumption. Eggs produced in quantity come from chickens, ducks, geese, turkeys, guinea fowl, pigeons, pheasants, and quail. This article describes the processing of chicken eggs, which represent the bulk of egg production in the United States and Europe. Duck eggs are consumed as food in parts of Europe and Asia, and goose eggs are also a food in many European countries. Commercial production of turkey and pigeon eggs is almost entirely confined to those used for producing turkey poults and young pigeons (squabs). Pheasant and quail eggs provide birds for hobby or sport use. Characteristics of the egg Structure and composition structural components of an eggThe structural components of an egg.(more)Why do chicken eggs come in different colors?An explanation of why eggs are different colours.(more)See all videos for this articleThe structural components of the egg include the shell and shell membranes (10 percent); the albumen or white (60 percent), including the thick albumen, the outer thin albumen, the inner thin albumen, and the chalazae; and the yolk (30 percent). In a fertilized egg, the yolk supplies the nutrients and the albumen supplies the water necessary for the development of the embryo. In addition, the layers of albumen act as a cushion to protect the embryo from jarring movements, while the chalazae help to maintain the orientation of the embryo within the egg. The nutrient composition of chicken eggs is presented in the table.
Britannica Quiz
Ultimate Foodie Quiz
Nutrient composition of fresh chicken egg (per 100 g)*
energy (kcal)
water (g)
protein (g)
fat (g)
cholesterol (mg)
carbohydrate (g)
vitamin A (IU)
riboflavin (mg)
calcium (mg)
phosphorus (mg)
*100 g is approximately equal to two large whole eggs.
Source: U.S. Department of Agriculture, Composition of Foods, Agriculture Handbook no. 8-1.
whole egg
149
75.33
12.49
10.02
425
1.22
635
0.508
49
178
yolk
358
48.81
16.76
30.87
1,281
1.78
1,945
0.639
137
488
white
50
87.81
10.52
0
—
1.03
—
0.452
6
13
The whole egg is a source of high-quality protein (i.e., proteins that contain all the amino acids needed in the human diet). In addition, it is an excellent source of all vitamins (except vitamin C) and contains many essential minerals, including phosphorus and zinc. All the fats, or lipids, as well as the cholesterol are found in the yolk. Yolk lipids are high in unsaturated fatty acids, with the ratio of unsaturated to saturated fatty acids commonly being 2 to 1. By influencing the diet of the hen, some processors are able to market shell eggs with a higher ratio of unsaturated to saturated fatty acids. Particular emphasis is being given to increasing the highly unsaturated long-chain omega-3 fatty acids by adding fish oil to the hen feed. Omega-3 fatty acids have been shown to play a role both in normal growth and development and in the prevention of many diseases.
Get a Britannica Premium subscription and gain access to exclusive content.
Subscribe Now
The cholesterol content of a whole large egg is approximately 216 milligrams—a substantially lower figure than that reported before the late 1980s, when improved analytical techniques were instituted. Moreover, the egg industry has probably made some progress in lowering cholesterol content through genetic selection and improved diets. Microbiology More than 90 percent of all eggs are free of contamination at the time they are laid; contamination with Salmonella bacteria and with certain spoilage organisms occurs essentially afterward. Proper washing and sanitizing of eggs eliminates most Salmonella and spoilage organisms deposited on the shell. The organism Salmonella enteritidis, a common cause of gastroenteritis (a form of food poisoning), has been found to be transferred through the hen ovary in fewer than 1 percent of all eggs produced. Ovarian-transferred S. enteritidis can be controlled by thorough cooking of eggs (i.e., until there are no runny whites or yolk). Certain spoilage organisms (e.g., Alcaligenes, Proteus, Pseudomonas, and some molds) may produce green, pink, black, colourless, and other rots in eggs after long periods of storage. However, since eggs move through market channels rapidly, the modern consumer seldom encounters spoiled eggs. Fresh eggs eggs prepared for candlingEggs rolling down a conveyor belt in preparation for flash candling.(more)egg candlingEggs being flash candled to detect cracks, blood spots, and other defects.(more)Fresh eggs are gathered on automatic collection belts at the farm and stored in a cooler at about 7 °C (45 °F). The eggs are then delivered to a central processing plant, where they are washed, sanitized, and graded. Grading involves the sorting of eggs into size and quality categories using automated machines. Flash candling (passing the eggs over a strong light source) detects any abnormalities such as cracked eggs and eggs containing blood spots or other defects. Higher-grade eggs have a thick, upstanding white, an oval yolk, and a clean, smooth, unbroken shell. egg sortingEggs being sorted by size and quality.(more)In the United States eggs are sized on the basis of a minimum weight per dozen in ounces. One dozen extra large eggs weigh 27 ounces (765 grams); large eggs, 24 ounces; medium eggs, 21 ounces. Weight standards in other countries vary, but most are measured in metric units. For example, eggs might be sold in cartons of 10 eggs each.
Most eggs sold in modern supermarkets are approximately four to five days old. If kept refrigerated by the consumer, they will maintain good quality and flavour for about four weeks.
egg是什么意思_egg的翻译_音标_读音_用法_例句_爱词霸在线词典
什么意思_egg的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录egg是什么意思_egg用英语怎么说_egg的翻译_egg翻译成_egg的中文意思_egg怎么读,egg的读音,egg的用法,egg的例句翻译人工翻译试试人工翻译翻译全文简明柯林斯牛津egg高中/CET4/CET6英 [eɡ]美 [eɡ]释义n.蛋,卵; 禽蛋; 蛋形物; 卵细胞大小写变形:EggEGG点击 人工翻译,了解更多 人工释义词态变化复数: eggs;实用场景例句全部鸡蛋家伙煽动怂恿an egg donor卵子提供者牛津词典They were left with egg on their faces when only ten people showed up.只有十人到场,他们感到很丢面子。牛津词典He hit the other boy again and again as his friends egged him on.他在朋友的煽动下一次又一次地打了另一个男孩。牛津词典You've got some egg on your shirt.你的衬衣上沾了些蛋。牛津词典egg yolks/whites蛋黄 / 白牛津词典egg noodles鸡蛋面牛津词典ducks'/quails' eggs鸭 / 鹌鹑蛋牛津词典a chocolate egg (= made from chocolate in the shape of an egg)巧克力蛋牛津词典The male sperm fertilizes the female egg.雄性的精子使雌性的卵子受精。牛津词典a boiled egg煮蛋牛津词典bacon and eggs熏肉加煎蛋牛津词典fried/poached/scrambled eggs煎 / 荷包 / 炒蛋牛津词典Bind the mixture together with a little beaten egg.用少许打过的蛋将混合料搅拌在一起。牛津词典The female sits on the eggs until they hatch.雌鸟伏在蛋上直到其孵化。牛津词典The fish lay thousands of eggs at one time.这种鱼一次产卵数千个。牛津词典crocodile eggs鳄鱼蛋牛津词典It only takes one sperm to fertilize an egg.只需要一个精子就能让卵子受精。柯林斯高阶英语词典The key word here is diversify; don't put all your eggs in one basket.这里的关键词是多样性;不要在一棵树上吊死。柯林斯高阶英语词典If they take this game lightly they could end up with egg on their faces.如果他们对这场比赛掉以轻心,结果很可能会出丑。柯林斯高阶英语词典...a baby bird hatching from its egg.从蛋中孵出的小鸟柯林斯高阶英语词典...ant eggs.蚁卵柯林斯高阶英语词典Break the eggs into a shallow bowl and beat them lightly.把鸡蛋打到一个浅碗中,轻轻搅打。柯林斯高阶英语词典...bacon and eggs.咸肉煎蛋柯林斯高阶英语词典...a chocolate egg.巧克力蛋柯林斯高阶英语词典The judge sentenced the bad egg to death.法官判这个混蛋死刑.《简明英汉词典》You've got some egg on your chin.你的下巴上沾着一点鸡蛋.《简明英汉词典》收起实用场景例句真题例句全部四级六级高考Traditional Ukrainian decorated eggs also spoke to those fears.出自-2017年6月阅读原文There's an ancient legend that as long as these eggs are made, evil will not prevail in the world, says Joan Brander, a Canadian egg-painter who has been painting eggs for over 60 years, having learned the art from her Ukrainian relatives.出自-2017年6月阅读原文Some traditions are simple, like the red eggs that get baked into Greek Easter breads.出自-2017年6月阅读原文So it's no surprise that cultures around the world celebrate spring by honoring the egg.出自-2017年6月阅读原文She never knows if the egg will break before the design is completed.出自-2017年6月阅读原文Several years ago, she became interested in eggs and learned the traditional Ukrainian technique to draw her very modern characters.出自-2017年6月阅读原文Others elevate the egg into a fancy art, like the heavily jewel-covered eggs that were favored by the Russians starting in the 19th century.出自-2017年6月阅读原文One ancient form of egg art comes to us from Ukraine.出自-2017年6月阅读原文I've broken eggs at every stage of the process—from the very beginning to the very, very end.出自-2017年6月阅读原文For centuries, Ukrainians have been drawing complicated patterns on eggs.出自-2017年6月阅读原文Eggs serve as an enduring symbol of new life.出自-2017年6月阅读原文Eggs reflect the anxieties of people today.出自-2017年6月阅读原文Eggs provide a unique surface to paint on.出自-2017年6月阅读原文Eggs have an oval shape appealing to artists.出自-2017年6月阅读原文Eggs are, too.出自-2017年6月阅读原文Contemporary artists have followed this tradition to create eggs that speak to the anxieties of our age: Life is precious, and delicate.出自-2017年6月阅读原文A decorated egg with a bird on it, given to a young married couple, is a wish for children.出自-2017年6月阅读原文A decorated egg thrown into the field would be a wish for a good harvest.出自-2017年6月阅读原文He also perfected the souffle—a baked egg dish, and introduced the standard chef's uniform—the same double-breasted white coat and tall white hat still worn by many chefs today.2018年12月四级真题(第二套)阅读 Section BOthers elevate the egg into a fancy art, like the heavily jewel-covered "eggs" that were favored by the Russians starting in the 19th century.2017年6月四级真题(第一套)阅读 Section CSo when fly the north, they might lay eggs in Louisiana and die.出自-2014年6月听力原文The eggs of that following generation may be found in Kentucky, the eggs of next generation may be in the Kang Michigan.出自-2014年6月听力原文Each flock of butterflies lays eggs in the same states出自-2014年6月听力原文They start to lay eggs when they are nine months old.出自-2014年6月听力原文Each generation in a cycle lays eggs at a different place出自-2014年6月听力原文Only the strongest can reach their destination to lay eggs.出自-2014年6月听力原文And then they put some bacon in the fat, broke an egg over the top, and put the whole lot in the oven for about ten minutes.2016年12月六级真题(第一套)听力 Section AEach egg gives you 7 grams, the cheese gives you about 6 grams and the orange—about 2 grams.2019年12月六级真题(第二套)阅读 Section BThere was just this egg floating about in gallons of fat and raw bacon.2016年12月六级真题(第一套)听力 Section AYou can also add different things if you like such as half-boiled egg or cured ham.2018年6月六级真题(第二套)听力 Section AAfter several weeks' successful work, I began to notice that egg production was going down.2016年高考英语浙江卷(10月) 完形填空 原文And I don't like eggs, either.2015年高考英语全国卷1 听力 原文And the more frequently mothers had called to their eggs, the more similar were the babies' begging calls.2017年高考英语江苏卷 阅读理解 阅读B 原文Female Australian superb fairy wrens were found to repeat one sound over and over again while hatching their eggs.2017年高考英语江苏卷 阅读理解 阅读B 原文He said the chickens had never missed a meal and he could not figure out why some of them had stopped laying eggs.2016年高考英语浙江卷(10月) 完形填空 原文However,he would have to buy chicken feed with the money he made from the eggs.2016年高考英语浙江卷(10月) 完形填空 原文I told him that they would be his own chickens and we would buy the eggs from him.2016年高考英语浙江卷(10月) 完形填空 原文In China, when a baby is one month old, families name and welcome their child in a celebration that includes giving red-colored eggs to guests.2015年高考英语安徽卷 阅读理解 阅读E 原文The visitor will enter the world of dali through an egg and is met with the beginning, the world of birth.2015年高考英语全国卷1 阅读理解 阅读C 原文When the eggs were hatched, the baby birds made the similar chirp to their mothers—a sound that served as their regular "Feed me!" call.2017年高考英语江苏卷 阅读理解 阅读B 原文收起真题例句英英释义Noun1. animal reproductive body consisting of an ovum or embryo together with nutritive and protective envelopes; especially the thin-shelled reproductive body laid by e.g. female birds2. oval reproductive body of a fowl (especially a hen) used as food3. one of the two male reproductive glands that produce spermatozoa and secrete androgens;"she kicked him in the balls and got away"Verb1. throw eggs at2. coat with beaten egg;"egg a schnitzel"收起英英释义词组搭配don't put all your eggs in one basket(proverb)don't risk everything on the success of one venture(谚)不要孤注一掷,不要把一切希望寄托在一件事上go suck an egg[as imperative](N. Amer. informal)used as an expression of anger or scorn(北美,非正式)见鬼去吧(表示愤怒或鄙视)kill the goose that lays the golden eggsdestroy a reliable and valuable source of income杀鸡取卵自绝财源lay an egg(N. Amer. informal)be completely unsuccessful; fail badly(北美,非正式)完全失败with egg on one's face(informal)appearing foolish or ridiculous(非正式)丢脸,出丑don't underestimate this team, or you'll be left with egg on your face.不要小瞧这支队,不然你会出丑的。put all (one's) eggs in one basket 或 have all (one's) eggs in one basket 【非正式用语】To risk everything on a single venture.孤注一掷:将所有的一切放在一次冒险上egg on (one's) face【非正式用语】Embarrassment; humiliation尴尬;羞辱If you do that, you'll end up with egg on your face.你要是做那件事,必将以耻辱告终收起词组搭配同义词incitestirurgeagitateprovokearouseovumembryo行业词典动物学卵[细胞] "又称 :卵[细胞](ovum,ootid) " 医学卵:雌配子,同ovum 卵母细胞:同oocyte 雌生殖细胞:指受精前任何时期的和受精后甚至经一定程度发育的雌生殖细胞 昆虫学卵 植物学卵 水产带卵雌体 bearing female 性腺已发育成熟但尚未产卵的雌虾。 卵水 water 水生动物产过卵并使之含有诱导精子反应活性成分的水体。 常用俚语egg小心地,轻轻地搬动或移动He has egged many pieces of antique china to a different room.他已经把许多件古瓷器小心地搬到另一个房间去了。人,家伙,东西,事物Evelyn's a tough egg.伊夫林是条硬汉子。I think it's a very good egg.我觉得这事情挺好。脑袋,炸弹,水雷(等球状物)bop him on the egg 击中他头部怕老婆者,惧内、"妻管严"的男人It's true, he's an egg at home. 千真万确,他在家是个"妻管严"。tough egg to crack难打交道的或难以理解的人或事,难以办到的事I wish Jill wasn't such a tough nut to crack.我希望吉尔不是个那么难打交道的人。This problem is a tough egg to crack. 这一问题可真令人难以理解。Getting them all here on time will be a tough nul to crack.要他们全都准时到将是件很难办到的事。释义词态变化实用场景例句真题例句英英释义词组搭配同义词行业词典常Egg | Biology, Anatomy & Function | Britannica
Egg | Biology, Anatomy & Function | Britannica
Search Britannica
Click here to search
Search Britannica
Click here to search
Login
Subscribe
Subscribe
Home
Games & Quizzes
History & Society
Science & Tech
Biographies
Animals & Nature
Geography & Travel
Arts & Culture
Money
Videos
On This Day
One Good Fact
Dictionary
New Articles
History & Society
Lifestyles & Social Issues
Philosophy & Religion
Politics, Law & Government
World History
Science & Tech
Health & Medicine
Science
Technology
Biographies
Browse Biographies
Animals & Nature
Birds, Reptiles & Other Vertebrates
Bugs, Mollusks & Other Invertebrates
Environment
Fossils & Geologic Time
Mammals
Plants
Geography & Travel
Geography & Travel
Arts & Culture
Entertainment & Pop Culture
Literature
Sports & Recreation
Visual Arts
Companions
Demystified
Image Galleries
Infographics
Lists
Podcasts
Spotlights
Summaries
The Forum
Top Questions
#WTFact
100 Women
Britannica Kids
Saving Earth
Space Next 50
Student Center
Home
Games & Quizzes
History & Society
Science & Tech
Biographies
Animals & Nature
Geography & Travel
Arts & Culture
Money
Videos
egg
Table of Contents
egg
Table of Contents
Introduction
References & Edit History
Related Topics
Images & Videos
Quizzes
Characteristics of the Human Body
Facts You Should Know: The Human Body Quiz
Discover
Was Napoleon Short?
8 Animals That Suck (Blood)
7 Surprising Uses for Mummies
America’s 5 Most Notorious Cold Cases (Including One You May Have Thought Was Already Solved)
9 of the World’s Deadliest Snakes
The 10 Greatest Basketball Players of All Time
How Did Alexander the Great Really Die?
Home
Health & Medicine
Anatomy & Physiology
Science & Tech
egg
biology
Actions
Cite
verifiedCite
While every effort has been made to follow citation style rules, there may be some discrepancies.
Please refer to the appropriate style manual or other sources if you have any questions.
Select Citation Style
MLA
APA
Chicago Manual of Style
Copy Citation
Share
Share
Share to social media
URL
https://www.britannica.com/science/egg-biology
Give Feedback
External Websites
Feedback
Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).
Feedback Type
Select a type (Required)
Factual Correction
Spelling/Grammar Correction
Link Correction
Additional Information
Other
Your Feedback
Submit Feedback
Thank you for your feedback
Our editors will review what you’ve submitted and determine whether to revise the article.
External Websites
USDA Food Safety and Inspection Service - Biology of Eggs
National Center for Biotechnology Information - Eggs
Stanford University - Eggs and Their Evolution
University of Lucknow - Egg: Structure
The Home of the Royal Family - The Duke of Sussex
Britannica Websites
Articles from Britannica Encyclopedias for elementary and high school students.
egg - Children's Encyclopedia (Ages 8-11)
egg - Student Encyclopedia (Ages 11 and up)
Cite
verifiedCite
While every effort has been made to follow citation style rules, there may be some discrepancies.
Please refer to the appropriate style manual or other sources if you have any questions.
Select Citation Style
MLA
APA
Chicago Manual of Style
Copy Citation
Share
Share
Share to social media
URL
https://www.britannica.com/science/egg-biology
Feedback
External Websites
Feedback
Corrections? Updates? Omissions? Let us know if you have suggestions to improve this article (requires login).
Feedback Type
Select a type (Required)
Factual Correction
Spelling/Grammar Correction
Link Correction
Additional Information
Other
Your Feedback
Submit Feedback
Thank you for your feedback
Our editors will review what you’ve submitted and determine whether to revise the article.
External Websites
USDA Food Safety and Inspection Service - Biology of Eggs
National Center for Biotechnology Information - Eggs
Stanford University - Eggs and Their Evolution
University of Lucknow - Egg: Structure
The Home of the Royal Family - The Duke of Sussex
Britannica Websites
Articles from Britannica Encyclopedias for elementary and high school students.
egg - Children's Encyclopedia (Ages 8-11)
egg - Student Encyclopedia (Ages 11 and up)
Written and fact-checked by
The Editors of Encyclopaedia Britannica
Encyclopaedia Britannica's editors oversee subject areas in which they have extensive knowledge, whether from years of experience gained by working on that content or via study for an advanced degree. They write new content and verify and edit content received from contributors.
The Editors of Encyclopaedia Britannica
Article History
Table of Contents
structural components of an egg
See all media
Category:
Science & Tech
Related Topics:
yolk
fertilizin
albumen
eggshell
vitelline membrane
(Show more)
See all related content →
egg, in biology, the female sex cell, or gamete. In botany, the egg is sometimes called a macrogamete. In zoology, the Latin term for egg, ovum, is frequently used to refer to the single cell, while the word egg may be applied to the entire specialized structure or capsule that consists of the ovum, its various protective membranes, and any accompanying nutritive materials. The human female reproductive cell is also usually called an ovum.The egg, like the male gamete, bears only a single (haploid) set of chromosomes. The egg, however, is usually larger than its male counterpart because it contains material to nourish the embryo during its early stages of development. In many animal species a large quantity of nutritive material, or yolk, is deposited in the egg, the amount depending on the length of time before the young animal can feed itself or, in the case of mammals, begins to receive nourishment from the maternal circulation. The plant egg is never so disproportionately large, because the developing sporophyte embryo is nourished until self-supporting by the plant on which it is formed (in liverworts, mosses, and ferns by the gametophyte; in seed plants by the sporophyte on which the gametophyte is parasitic).
Britannica Quiz
Characteristics of the Human Body
A variety of bird eggs.With the exception of those of some cnidarians (coelenterates), all animal eggs are enclosed by membranes, the innermost of which is called the vitelline membrane. The vitelline membrane is the only membrane in the eggs of various invertebrates—ctenophores, many worms, and echinoderms—and of certain lower chordates. All higher vertebrates and many invertebrates have one or more additional membranes. Insect eggs, for example, are covered by a thick, hard chorion, and the amphibian egg is surrounded by a jelly layer. The bird egg includes the vitelline membrane, the white of the egg, two egg shell membranes, and the outermost membrane, the shell. As pointed out above, this entire structure is commonly referred to as an egg.
Mature eggs remain functional for a relatively short period of time, after which fertilization cannot occur. The eggs of most invertebrates, fish, and amphibians must be fertilized a few minutes after they are shed into the water; an exception is sea urchin eggs, which are viable for about 40 hours after their release. Most other animal eggs have life spans similar to that of the human egg—i.e., 12 to 24 hours. See also ovum.
This article was most recently revised and updated by Kathleen Kuiper.