Так как вы не используете babel, я, вероятно, go с чем-то вроде этого:
const $path = require('path');
const rxTilde = /^~\/?/;
const rxDollar = /^\$(\w+)\/(.*)/;
global.requirex = path => {
let finalPath = path; // default to entered path
const rpath = $path.dirname(require.main.filename); // get path of main/root module
if (rxTilde.test(path)) finalPath = $path.join(rpath, path.replace(rxTilde, '')); // use ~ tilde as "rooted" path
else if (rxDollar.test(path)) { // use $name for special aliases
const [, dpath, endPath] = rxDollar.exec(path);
if (dpath === 'asdf') finalPath = $path.join(rpath, 'my/special/path', endPath);
}
// console.log(finalPath);
return require(finalPath);
};
// run from directory: /home/user/www/test/
const a1 = requirex('~/my/path/to/module');
//>> /home/user/www/test/my/path/to/module
const a2 = requirex('$asdf/other-module');
//>> /home/user/www/test/my/special/path/other-module
Обычные пути, которые не имеют специально обработанных псевдонимов, должны просто "провалиться" в обычный require
без изменений.
Также я бы не хотел переопределять встроенный require
, поэтому вместо этого я создал глобальный requirex
. Теоретически вы могли бы переопределить, но ... yikes.