Шаблон модуля - Как разделить код одного модуля на разные файлы js?

Для шаблона модуля я делаю что-то вроде:

(function(namespace) {
    // tons of code
    // blabla
})(window.myGlobalNamespace);

Как мне разделить код? Я могу придумать несколько способов, таких как использование иерархии пространств имен или расширение объекта снаружиwindow.myGlobalNamespace.additionalFunc = function () {//blabla}, Каковы другие способы? Каковы плюсы и минусы? Какой из них считается лучшей практикой?

Оба ответа предлагают RequireJS. Можете ли вы объяснить, как RequireJS может решить эти проблемы:

first.js:

(function(context) {
    var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);

second.js:

(function(context) {
    this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);

main.js:

window.myGlobalNamespace.subNamspace.childFunction(); // doesn't work

И люди могут сделать

window.myGlobalNamespace.subNamspace.childFunction = function() {alert("a new function");}

изменить поведение моего кода!

Здесь есть две проблемы:

У нас не может быть поля, доступного ребенку, но не доступного извне (т.е. защищенного). Есть ли способ добиться этого?

Если нет, то есть если мы хотим, чтобы родительский уровень был доступен, нам нужно сделать его общедоступным. Тогда пользователь сможет его изменить!

Более того, все публичные функции могут быть изменены и заменены. Я не хочу, чтобы это случилось.

Я не понимаю, как RequireJS решает эти проблемы. Может кто-нибудь пролить свет?

Ответы на вопрос(4)

Ваш ответ на вопрос