requireJS: Как структурировать Javascript для всего сайта? - PullRequest
9 голосов
/ 28 февраля 2011

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

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

Если кто-нибудьявляется опытным пользователем requireJS. Буду рад услышать ваши советы!

Ответы [ 4 ]

5 голосов
/ 10 марта 2011

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

Разве вы не можете обернуть эти глобальные переменные в модуль, а затем зависеть от него в других ваших модулях?

Например, модульное Dojo RequireJS может выглядеть примерно так:

dojo/cache module
dojo/string module (requires dojo/cache)
dojo/date module (requires dojo/string)
dojo/cookie module (requires dojo/string)
           :
           :
dojo module (requires everything above, make them all into sub-objects, say, e.g. dojo.cache, dojo.string, dojo.date etc.)

user module #1 (requires dojo)
user module #2 (maybe only requiring dojo/string)
3 голосов
/ 20 марта 2011

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

Следующим шагом будет назначение этих методов объекту, отличному от окна, и затем использование этого объекта через переменную, полученную изЗависимость модуля RequireJS.

Надеюсь, к тому времени, как вы это сделаете, у вас может появиться понимание более чистого решения.Я реорганизовал (и все еще являюсь) однофайловый проект в несколько файлов, включая необязательные плагины, хотя большую часть этого я делал до добавления RequireJS в смесь.

2 голосов
/ 28 февраля 2011

См. Документацию RequireJS:

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

define(["./cart", "./inventory"], function(cart, inventory) {
        // ...
        return { ... };
    }
);

Так что я думаю, что вы можете определить () ваш основной модуль, как и все другие модули, и сделать подмодули зависимыми от этого основного модуля. Затем объект модуля передается в качестве аргумента функции определения подмодуля. Вам не нужно использовать глобальные переменные.

0 голосов
/ 26 июня 2011

Если вы хотите обмениваться информацией между модулями, прикрепите информацию к объекту модуля, и пусть другие модули полагаются на этот модуль, и проверьте его свойство.

Если у вас есть код, вы можете присвоить window.x глобальный x во время его очистки.

...