Сообщение от x-yuri
|
а вот постоянно - спорный вопрос
|
Ну да, в этом случае уже знаешь все нюансы. Но всегда есть риск внезапно переключится на другую задачу, а потом всё забыть о прошлой.
Сообщение от x-yuri
|
Да, можешь показать диаграмму. Да и функцию.
|
/*
@startuml
title Require.
note top: require(namespace);
(*) -right-> if "" then
note top: The module\nis in the cache??
--> [true] "Return module" as Return
--> (*)
else
-right-> [false] if "" then
note top: Start with\n'docroot://'?
--> [true] "Load file from\n<b>namespace</b>"
--> [Success] "Initialization module.\nSave module in cache." as Compile
--> Return
else
-right-> [false] if "" then
note top: There is a file\nwith the name\n<b>namespace</b> + '.js'?
--> [true] "Load file from\n<b>namespace</b> + '.js'"
--> [Success] "Create namespace" as CreateNS
--> Compile
else
-right-> [false] if "" then
note top: There is a file\nwith the name\n<b>namespace</b> + '/package.json'?
--> [true] "Parse file from\n<b>namespace</b> + '/package.json'"
--> [Success] "Load the file,\nspecified in the package.json"
note right: Default file name is\n<b>namespace</b> + '.js'
--> [Success] CreateNS
else
--> (*)
endif
endif
endif
endif
@enduml
*/
var require = (function () {
var CACHE = {};
var OPTIONS = {
root: 'docroot://',
extension: 'js',
packageName: 'package.json'
};
function extendOptions () {
if (!require.hasOwnProperty('options')) {
require.options = {};
}
for (var name in OPTIONS) {
if (OPTIONS.hasOwnProperty(name) && !require.options.hasOwnProperty(name)) {
require.options[name] = OPTIONS[name];
}
}
}
function createNamespace (namespace, module) {
namespace = namespace.split('.');
var
name,
index = 0,
length = namespace.length,
currentNamespace = $XM;
while (index < length) {
name = namespace[index++];
if (index === length) {
currentNamespace[name] = module;
} else if (!currentNamespace.hasOwnProperty(name)) {
currentNamespace[name] = {};
}
currentNamespace = currentNamespace[name];
}
}
function require (namespace) {
var
file,
path,
main,
createNS = true,
module = {
namespace: namespace,
exports: {}
};
if (CACHE.hasOwnProperty(namespace)) {
return CACHE[namespace];
}
extendOptions();
if (namespace.indexOf('docroot://') === 0) {
if ($X.file.test(namespace)) {
file = $X.file.load(namespace);
createNS = false;
path = namespace;
delete module.namespace;
} else {
throw new Error('Can`t find module on the way: "' + namespace + '"');
}
} else if ($X.file.test(path = require.options.root + namespace + '.' + require.options.extension)) {
file = $X.file.load(path);
} else if ($X.file.test(path = require.options.root + namespace + '/' + require.options.packageName)) {package.json
file = $X.file.load(path);
file = JSON.parse(file);
main = file.hasOwnProperty('main') ? file.main : namespace + '.' + require.options.extension;
if ($X.file.test(path = require.options.root + namespace + '/' + main)) {
file = $X.file.load(path);
} else {
throw new Error('Can`t find module: "' + path + '"');
}
} else {
throw new Error('Can`t find module: "' + namespace + '"');
}
module.path = path;
module.dirName = path.substring(0, path.lastIndexOf('/'));
new Function('module', file).call(module.exports, module);
createNS === true && createNamespace(namespace, module.exports);
CACHE[namespace] = module.exports;
return module.exports;
}
extendOptions();
return require;
})();