Что означает require.define в приведенном ниже фрагменте кода? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь написать встраиваемое расширение для нашего сервиса, чтобы люди могли импортировать его через <script src"/my/cds/path.js"></script>.В качестве примера я рассмотрел реализацию Stripe checkout .js.Приведенный ниже фрагмент кода является частью кода, который загружается из Stripe CDN, когда я добавляю StripeCheckout в тег сценария в моем index.html.

    (function() {
    var namespace = "StripeCheckout.require".split("."),
        name = namespace[namespace.length - 1],
        base = this,
        i;
    for (i = 0; i < namespace.length - 1; i++) { base = base[namespace[i]] = base[namespace[i]] || {} }
    if (base[name] === undefined) {
        base[name] = function() {
            var modules = {},
                cache = {};
            var requireRelative = function(name, root) {
                var path = expand(root, name),
                    indexPath = expand(path, "./index"),
                    module, fn;
                module = cache[path] || cache[indexPath];
                if (module) { return module } else if (fn = modules[path] || modules[path = indexPath]) {
                    module = { id: path, exports: {} };
                    cache[path] = module.exports;
                    fn(module.exports, function(name) { return require(name, dirname(path)) }, module);
                    return cache[path] = module.exports
                } else { throw "module " + name + " not found" }
            };
            var expand = function(root, name) {
                var results = [],
                    parts, part;
                if (/^\.\.?(\/|$)/.test(name)) { parts = [root, name].join("/").split("/") } else { parts = name.split("/") }
                for (var i = 0, length = parts.length; i < length; i++) { part = parts[i]; if (part == "..") { results.pop() } else if (part != "." && part != "") { results.push(part) } }
                return results.join("/")
            };
            var dirname = function(path) { return path.split("/").slice(0, -1).join("/") };
            var require = function(name) { return requireRelative(name, "") };
            require.define = function(bundle) { for (var key in bundle) { modules[key] = bundle[key] } };
            require.modules = modules;
            require.cache = cache;
            return require
        }.call()
    }
})();

, а затем следует несколько фрагментов, подобных этому:

StripeCheckout.require.define({
 "lib/spellChecker": function(exports, require, module) {
    (function() {
        var levenshtein;
        module.exports = {
                levenshtein: levenshtein = function(str1, str2) {
                },
                suggest: function(dictionary, badword, threshold) {
                }
        }
    }).call(this)
   }
});

Вопрос :

  1. Я не прав, чтобы сказатьчто первый фрагмент определяет require.define (), а следующий использует это?Это способ симуляции require.js?
  2. Откуда берется require.define ()?Если это require.js, что он делает?
  3. Как поступить с размещением целого пакета в CDN, чтобы различные модули были доступны через клиентский код JS для загрузки, как описано выше?(Я не вижу в Stripecheckout.js ничего, кроме одного файла JS. Где другие файлы?)

Я читал о модулях JS и requireJS документация, но я думаю, что мне нужны пояснения.

...