require-directory 的用法以及 Koa 路由自动加载的简单实现

发布于 2020-02-13  306 次阅读


require-directory

使用 require-directory 库可以加载指定文件夹下的所有模块,而不需要每次都使用 require() 来加载

假设 routes 目录下有 home.js 模块和 auth 文件夹,auth 文件夹下还有其它模块

// app.js 与 routes 文件夹同级
const requireDirectory = require("require-directory");
const modules = requireDirectory(module, `${process.cwd()}/routes`);

modules 变量的结果等同于:

const modules = {
    home: require("./routes/home.js"),
    auth: {
        login: require("./routes/auth/login.js"),
        logout: require("./routes/auth/logout.js")
    }
};

基本用法

可以指定文件夹也可以不指定,文件夹嵌套也没事,不指定,默认是 __dirname ,即当前模块的目录名(绝对路径)

const requireDirectory = require("require-directory");

requireDirectory(module)
// requireDirectory(module, __dirname)

选项

requireDirectory 可以传入一个选项(对象)作为第 2 个(不指定文件夹)或者第 3 个参数(指定了文件夹),

const modules = requireDirectory(module, `${process.cwd()}/xxx`, {
    include: /b.*\.js$/,
    exclude(path) {
        return /b.*\.js$/.test(path);
    },
    visit(obj) {
        // 若被加载的模块导出 module.exports = "test"; 则 obj 为 "test"
        console.log(obj);
    },
    rename(key) {
        return key.toUpperCase();
    },
    recurse: true
})
  1. include:白名单,只加载符合指定条件的模块,可以使用正则或者函数(接收参数 path,模块的绝对路径)
  2. exclude:黑名单,不加载符合指定条件的模块,用法同 include ,如果 includeexclude 指定的条件相同,则仅后者有效
  3. visit:每个模块被加载时所执行的访问函数,接收一个 obj 参数,为模块中 module.exports 导出的数据
  4. rename:重命名键名,比如上面 modules 变量中的 home 可以变成大写 HOME
  5. recurse:是否遍历文件夹,默认 true 开启,也就是嵌套文件夹下的模块,也能被加载

实现 Koa 路由自动加载

实现思路

使用 require-directory 批量加载模块,利用访问函数 visit 判断导出的对象是不是 Router 的实例

const Koa = require("koa");
const Router = require("koa-router");
const requireDirectory = require("require-directory");

const app = new Koa();
const whenModuleLoaded = obj => {
    if (obj instanceof Router) {
        app.use(obj.routes());
    } else if (typeof obj === "object") {
        // 兼容 module.exports 导出对象的写法
        for (let k in obj) {
            if (obj[k] instanceof Router) {
                app.use(obj[k].routes());
            }
        }
    }
};

const modules = requireDirectory(module, `${process.cwd()}/app/api`, {
    visit: whenModuleLoaded
});

兼容 module.exports 导出对象的写法:


Stay hungry, Stay foolish. 求知似饥,虚心若愚。