Restful Controllers 
For those familiar with backend development, especially those who know Spring/Nest.js, the concept of controllers should not be unfamiliar.
In unioc, controllers are used to create routes and can contain multiple routes.
Creating Controllers 
import { Get, RestController } from 'unioc/web'
@RestController()
export class AppController {
  @Get('/')
  async index() {
    return 'Hello World'
  }
}Then, import this controller in your application's main entry point:
import { ExpressApp } from 'unioc/web-express'
// Import the controller
import './app.controller'
async function bootstrap(): Promise<void> {
  // Below is your App startup logic, for example, if you want to create an Express application
  const app = new ExpressApp()
  // Start the application
  await app.run(3000)
}
bootstrap()Above is an example of creating an Express application. You can also create a Koa application, and with just a simple import statement in the main entry point, it can be automatically discovered by unioc and routes will be created automatically based on your controllers.
Using with Vite 
When using unioc with Vite, import.meta.glob is very convenient, effectively implementing features similar to Spring's automatic package scanning @ComponentScan.
This is a feature only available in Vite. You can pass a glob path, and you won't need to manually import controllers anymore.
/// <reference types="vite/client" />
import { ExpressApp } from 'unioc/web-express'
// This means automatically importing all ts files in the ./controllers directory,
// so you don't need to import them one by one, very very convenient ✨
import.meta.glob('./controllers/*.ts', { eager: true }) 
async function bootstrap(): Promise<void> {
  // Below is your App startup logic, for example, if you want to create an Express application
  const app = new ExpressApp()
  // Start the application
  await app.run(3000)
}
bootstrap()NOTE
For import.meta.glob documentation, please refer to the Vite Official Documentation.
 Zero