基本概念
Application
application 模块负责在不同的环境中启动 app。
当我们从 server.ts文件中启动 HTTP 服务器或者执行node ace server命令,就会为web环境开启应用。
而执行node ace repl命令时会在repl环境开启应用。
其他的所有命令都会在console环境中启动应用。
应用程序的环境在决定执行哪些操作方面起着至关重要的作用。举个例子:web 环境不会注册或者启动 Ace providers。
你可以用environment属性访问当前的应用环境。以下是已知的应用环境:
web环境是为 HTTP 服务器开启的进程console环境是指除 REPL 命令之外的 Ace 命令repl环境是用node ace repl命令开启的进程test环境是用node ace test命令开启的进程
js1import Application from '@ioc:Adonis/Core/Application' 2console.log(Application.environment)
生命周期
下面是应用的启动生命周期

一旦应用程序的状态设置成booted或者ready,你就可以访问IoC Container bindings 。
尝试在启动状态之前访问IoC Container bindings 会导致异常。
举个例子,如果你有一个service provider想要解析容器的绑定,你应该在boot或者ready方法内引入声明。
❌ 顶级的 import 不会工作
js1import { ApplicationContract } from '@ioc:Adonis/Core/Application' 2import Route from '@ioc:Adonis/Core/Route' 3 4export default class AppProvider { 5 constructor(protected app: ApplicationContract) {} 6 7 public async boot() { 8 Route.get('/', async () => {}) 9 } 10}
✅ 将 import 放到 boot 方法中
js1import { ApplicationContract } from '@ioc:Adonis/Core/Application' 2 3export default class AppProvider { 4 constructor(protected app: ApplicationContract) {} 5 6 public async boot() { 7 const { default: Route } = await import('@ioc:Adonis/Core/Route') 8 Route.get('/', async () => {}) 9 } 10}
版本
你可以使用version和adonisVersion属性访问应用和框架的版本。
version指向的是package.json里面 version属性。
adonisVersion属性是指@adonisjs/core包的安装版本。
js1import Application from '@ioc:Adonis/Core/Application' 2 3console.log(Application.version!.toString()) 4console.log(Application.adonisVersion!.toString())
两个版本属性都表示为一个具有 major、minor 和 patch 子属性的对象。
js1console.log(Application.version!.major) 2console.log(Application.version!.minor) 3console.log(Application.version!.patch)
Node 环境
你能够使用nodeEnvironment属性访问 node 环境。这个值是NODE_ENV环境变量的引用。
js1import Application from '@ioc:Adonis/Core/Application' 2 3console.log(Application.nodeEnvironment)
| NODE_ENV | Normalized to |
|---|---|
| dev | development |
| develop | development |
| stage | staging |
| prod | production |
| testing | test |
此外,您可以使用以下属性作为了解当前环境的速记。
-
inProduction
js1Application.inProduction 2 3// Same as 4Application.nodeEnvironment === 'production' -
inDev
js1Application.inDev 2 3// Same as 4Application.nodeEnvironment === 'development' -
inTest
js1Application.inTest 2 3// Same as 4Application.nodeEnvironment === 'test'