Я пытаюсь написать встраиваемое расширение для нашего сервиса, чтобы люди могли импортировать его через <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)
}
});
Вопрос :
- Я не прав, чтобы сказатьчто первый фрагмент определяет require.define (), а следующий использует это?Это способ симуляции require.js?
- Откуда берется require.define ()?Если это require.js, что он делает?
- Как поступить с размещением целого пакета в CDN, чтобы различные модули были доступны через клиентский код JS для загрузки, как описано выше?(Я не вижу в Stripecheckout.js ничего, кроме одного файла JS. Где другие файлы?)
Я читал о модулях JS и requireJS документация, но я думаю, что мне нужны пояснения.