Показать сообщение отдельно
  #48 (permalink)  
Старый 22.08.2012, 11:45
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от 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;
        })();

__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием