基本概念

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命令开启的进程
js
1import Application from '@ioc:Adonis/Core/Application'
2console.log(Application.environment)

生命周期

下面是应用的启动生命周期

![image-20230329195642715](data:image/svg+xml,)

一旦应用程序的状态设置成booted或者ready,你就可以访问IoC Container bindings

尝试在启动状态之前访问IoC Container bindings 会导致异常。

举个例子,如果你有一个service provider想要解析容器的绑定,你应该在boot或者ready方法内引入声明。

❌ 顶级的 import 不会工作

js
1import { 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 方法中

js
1import { 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}

版本

你可以使用versionadonisVersion属性访问应用和框架的版本。

version指向的是package.json里面 version属性。

adonisVersion属性是指@adonisjs/core包的安装版本。

js
1import Application from '@ioc:Adonis/Core/Application'
2
3console.log(Application.version!.toString())
4console.log(Application.adonisVersion!.toString())

两个版本属性都表示为一个具有 major、minor 和 patch 子属性的对象。

js
1console.log(Application.version!.major)
2console.log(Application.version!.minor)
3console.log(Application.version!.patch)

Node 环境

你能够使用nodeEnvironment属性访问 node 环境。这个值是NODE_ENV环境变量的引用。

js
1import Application from '@ioc:Adonis/Core/Application'
2
3console.log(Application.nodeEnvironment)
NODE_ENVNormalized to
devdevelopment
developdevelopment
stagestaging
prodproduction
testingtest

此外,您可以使用以下属性作为了解当前环境的速记。

  • inProduction

    js
    1Application.inProduction
    2
    3// Same as
    4Application.nodeEnvironment === 'production'
  • inDev

    js
    1Application.inDev
    2
    3// Same as
    4Application.nodeEnvironment === 'development'
  • inTest

    js
    1Application.inTest
    2
    3// Same as
    4Application.nodeEnvironment === 'test'