Custom module loader — intercept and transform module loading.
1// Using Module._extensions (internal API)2const Module = require("module");3const originalResolveFilename = Module._resolveFilename;45Module._resolveFilename = function(request, parent) {6 // Custom alias resolution7 const aliases = {8 "@services": "./src/services",9 "@utils": "./src/utils",10 };1112 for (const [alias, path] of Object.entries(aliases)) {13 if (request.startsWith(alias)) {14 request = request.replace(alias, path);15 }16 }1718 return originalResolveFilename.call(this, request, parent);19};2021// Custom file extension22Module._extensions[".yaml"] = function(module, filename) {23 const fs = require("fs");24 const yaml = require("js-yaml");25 const content = fs.readFileSync(filename, "utf8");26 module.exports = yaml.load(content);27};2829// Now you can require YAML files30const config = require("./config.yaml");
ESM loader (Node 16+):
1// loader.mjs2export function resolve(specifier, context, nextResolve) {3 if (specifier.startsWith("@/")) {4 return nextResolve(specifier.replace("@/", "./src/"), context);5 }6 return nextResolve(specifier, context);7}8// node --loader ./loader.mjs app.js