Как мне экспортировать глобальную переменную из Require.js?
Я пытаюсь сделать внешнюю библиотеку, используя Require.js. Благодаря Require.js, который неправильно компилирует один js-файл, и Require.js (almond.js). Отключение. Я выяснил, как заставить все "скомпилировать" в один оптимизированный / собранный файл, и этот единственный файл работает. Есть только одна проблема: я не могу понять, как установить переменную для моей библиотеки.
Допустим, я хочу, чтобы моя библиотека создала window.Foo
, Я пытался с помощью main.js
файл с:
window.Foo = require([], function() {
window.Foo = {someValue: 1};
return {someValue: 2};
});
и фрагмент конца обертки:
return require('main');
}));
Как вы можете видеть, я пытался выставить Foo в глобальном пространстве, явно указав window.Foo
изнутри вызова require и установки его явно извне через возвращаемое значение конечного фрагмента. Но ни один не работает; если я добавлю console.log(window.foo)
сразу после загрузки встроенного файла, он говорит мне, что window.Foo
не определено
Если я сделаю window.setTimeout window.Foo
в конечном итоге получить (для {someValue: 1}
), но я не могу ожидать, что моим пользователям придется обернуть весь свой код тайм-аутом. Может кто-нибудь объяснить, пожалуйста, как я могу получить window.Foo
быть определенным, как только мой оптимизированный / встроенный файл загружен?
2 ответа
Если вы будете следовать инструкциям Джеймса здесь, вы можете легко создать библиотеку, спроектированную как пакет модулей RequireJS, которые кто-то может загружать синхронно.
У меня есть репозиторий GitHub, иллюстрирующий все это. Существенные моменты:
main
модуль экспортаFoo
в мировое пространство:define('main', ["./modC"], function () { console.log("inside"); window.Foo = {someValue: 1}; return {someValue: 2}; });
Он также возвращает значение, которое экспортируется начальным фрагментом как
Bar
(это строка, которая говоритroot.Bar = factory();
). Таким образом, он иллюстрирует два способа экспорта в мировое пространство.Код обертки, используемый
r.js
начинается с синхронной формыrequire
:require(`main`);
Если вы загрузите его, вы увидите следующий вывод:
outside
loaded modC
inside
out in the HTML!
value of window.Foo: Object {someValue: 1}
value of window.Bar: Object {someValue: 2}
Звонки в require()
являются асинхронными, то есть возвращаемое значение функции, которую вы передаете в качестве аргумента, не возвращается require()
сам. Ваша проблема может быть решена различными способами. Способ RequireJS определяет ваш код в модуле и требует его как зависимости:
// mymodule.js
define([], function() {
window.Foo = {someValue: 1};
return {someValue: 2};
});
// main.js
require(['mymodule'], function (mymodule) {
console.log(window.Foo); // {someValue: 1}
console.log(mymodule); // {someValue: 2}
});