Как сохранить requireJS-функции вне глобального пространства имен? - PullRequest
4 голосов
/ 22 декабря 2011

Я пишу стороннее приложение JS с использованием requireJS и хочу, чтобы глобальное пространство имен было чистым от всего, кроме единого объекта глобального интерфейса, который будет создан моим приложением. У меня не было никаких проблем с этим, за исключением requireJS.

В качестве опции для оптимизатора можно включить в сборку require.js и определить пространство имен , чтобы оптимизатор охватил все ссылки, чтобы требовать функции для этого пространства имен.

например. require (...) становится my_scope.require (...)

Проблема в том, что этот объект глобального пространства имен не будет существовать, пока он не будет создан в приложении. Оптимизатор гарантирует, что requireJS загружает и выполняет перед любым загружаемым кодом, поэтому, когда приходит время для выполнения функции require (например, require или define), выдается исключение (объект пространства имен не определен).

Кто-нибудь успешно сделал это без ручного изменения встроенного скрипта или запуска другого скрипта отдельно от встроенного скрипта и до него? Другими словами, есть ли правильный способ достичь этого?

Ответы [ 2 ]

5 голосов
/ 23 декабря 2011

Для всех, кто искал ответ на этот вопрос, вот он, найденный в груде использованной смазки для локтя.

В настройках конфигурации сборки забудьте об использовании namespace. Существует свойство «wrap», которое позволяет вам обернуть весь скрипт сборки в код по вашему выбору.

Просто определите его следующим образом, чтобы создать локальную область видимости для всего (включая функции requireJS):

require.config({
    wrap: {
        start: "(function() {",
        end: "}());"
    }
})
0 голосов
/ 24 декабря 2011

Мое предположение состоит в том, что requirejs и загрузчики модулей в целом используют иной подход к уменьшению общего беспорядка, чем пространство имен. С помощью require вам не нужно прикреплять объекты к глобальному пространству имен, просто используйте вызов метода require внутри замыкания для получения ссылок локальной области действия.

Итак, вы обменяете один бит глобального беспорядка (то есть window.require) на все остальные вещи, которые вам нужно присоединить.

В реализации пространства имен вы бы использовали что-то вроде

var foo = window.my_scope.foo.bar

С загрузчиками модулей, вы бы использовали вызов по требованию. В случае загрузчика модулей CommonJS вы должны сделать что-то вроде этого

var foo = require("my_scope/foo/bar")

RequireJs добавляет немного больше сложности к этому, потому что это загрузчик модулей AMD, но это еще один целый разговор сам по себе!

...