express-lazy-router
Version:
Lazy loading for express router
62 lines • 2.15 kB
JavaScript
import express from "express";
/**
* @param options
* @example
* ```js
* const lazyLoad = createLazyLoader();
* router.use(
* '/path_to_router',
* lazyLoad(() => import('./path_to_router')),
* );
* ```
*/
export function createLazyRouter(options) {
var _a;
if (options === void 0) { options = {}; }
var preload = (_a = options.preload) !== null && _a !== void 0 ? _a : false;
/**
* lazy load express router
* @param resolver
*/
return function lazyRouter(resolver) {
var lazyRouter = express.Router();
// Preserve loading order of router for default error handler
// https://github.com/azu/express-lazy-router/issues/1
var loadedRouter;
var resolveResolver = function () {
return resolver().then(function (router) {
if (!router) {
throw new Error("lazyLoad(resolver) the resolver function should return a promise object, but it returns falsy value: " + router + "\n\nYou need to return a promise object from the callback function.\n\n lazyLoad(() => import('./path_to_router')), \n");
}
if ("default" in router) {
loadedRouter = router.default;
}
else {
loadedRouter = router;
}
});
};
lazyRouter.use(function lazyRouterHandler(req, res, next) {
if (loadedRouter) {
return loadedRouter(req, res, next);
}
else {
// request handler at first time
resolveResolver()
.then(function () {
return loadedRouter(req, res, next);
})
.catch(function (error) {
next(error);
});
}
});
if (preload) {
resolveResolver().catch(function (error) {
console.error("[lazy-router] Fail to preload", error);
});
}
return lazyRouter;
};
}
//# sourceMappingURL=express-lazy-router.js.map