Как мне экспортировать глобальную переменную из 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}
});
Другие вопросы по тегам