路由動態加載(動態添加路由)
稍微大型一點的網站,路由都會有很多,因此我們一般將路由拆分到不同的文件中,但是在不同的文件中就會有一個問題,每次增加路由文件的時候,都必須在統一的路由加載模塊中添加,因此為了方便使用,我們采用動態加載路由的方式,這樣可以讓我們添加路由就像在單文件中添加一樣方便。
增加目錄掃描函數
// src/utils/utils.ts
import fs from 'fs';
import path from 'path';
/**
* @description 遍歷目錄
* @param dir
* @param callback
*/
export const walkDir = (dir: string, callback: (file: string) => void) => {
const files = fs.readdirSync(dir);
files.forEach((file) => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
walkDir(filePath, callback);
} else {
callback(filePath);
}
});
};
動態導入路由
按照規則遍歷 src/controller 目錄,在這個目錄下,我們將所有的邏輯處理都分類為子目錄,每個子目錄下創建 router.ts 文件,用來配置此目錄下的路由信息,然后統一加載指定的文件。使用 import 動態加載模塊,并采用 koa-router 的路由疊加功能就可以實現動態加載路由了。
// src/router/index.ts
import path from 'path';
import KoaRouter from 'koa-router';
import { walkDir } from '../utils/utils';
const router = new KoaRouter();
walkDir(path.join(process.cwd(), 'src/controller'), (file) => {
if (file.endsWith('router.ts')) {
import(file).then((controller) => {
if (controller) {
router.use(controller.default.routes());
router.use(controller.default.allowedMethods());
}
});
}
});
export default router;
這里展示一下我們當前的目錄結構:
