2011-12-22 2 views
4

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

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

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

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

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

ответ

5

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

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

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

require.config({ 
    wrap: { 
     start: "(function() {", 
     end: "}());" 
    } 
}) 
0

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

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

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

var foo = window.my_scope.foo.bar 

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

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

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

+0

К сожалению, даже загрузка require.js добавляет функции requireJS к GNS. Загрузка не-AMD-скриптов через require также не обеспечивает хороший способ поддерживать рост GNS. –

 Смежные вопросы

  • Нет связанных вопросов^_^