Closed lomadurov closed 9 years ago
Разобрался:
/*global sandbox*/
(function (sb) {
'use strict';
var _defaults = function (obj) {
for (var i = 1, length = arguments.length; i < length; i++) {
var source = arguments[i];
for (var prop in source) {
if (obj[prop] === void 0) {
obj[prop] = source[prop];
}
}
}
return obj;
};
sb.on('lmd-register:decorate-require', function (moduleName, require) {
var currentDirectory = moduleName.split('/');
// Remove filename
currentDirectory.pop();
var localRequire = function (moduleName) {
var relative,
path;
// Check is relative path (start at ./ || ../)
if (moduleName.charAt(0) === '.') {
relative = moduleName.split('/');
path = currentDirectory.slice();
while (true) {
if (relative[0] === '..') {
relative = relative.slice(1);
path.pop();
continue;
} else if (relative[0] === '.') {
relative = relative.slice(1);
continue;
}
break;
}
path = path.concat(relative).join('/');
return require(sb.modules[path.concat('/index')] ? path.concat('/index') : path);
}
return require(moduleName);
};
return [moduleName, _defaults(localRequire, require)];
})
}(sandbox));
{
// ...
"modules": {
"${subdir.reverse().slice(1).join('/')}/${file}": "modules/**/*.js"
}
// ...
}
Насколько реально использовать relative path в require()
Пример:
Насколько я понимаю на текущий момент require не передаёт sandbox из которого он вызывается, тем самым точно определить разницу между
require('./block')
изutil
иrequire('./block')
изblocks
не представляется возможным?Если бы в
*:rewrite-shortcut
передавался ещё и sandbox moduleName, тогда плагин для этого добра занял бы пару строк.