Padrão de módulo - Como dividir o código de um módulo em diferentes arquivos js?

Para o padrão de módulo, estou fazendo algo como:

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

Como faço para dividir o código? Posso pensar em algumas maneiras, como usar uma hierarquia de namespaces ou expandir o objeto fora porwindow.myGlobalNamespace.additionalFunc = function () {//blabla}. Quais são as outras maneiras? Quais são os prós e contras? Qual deles é considerado melhor prática?

Ambas as duas respostas sugerem RequireJS. Você pode, por favor, explicar como o RequireJS pode resolver estes problemas:

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

E as pessoas podem fazer

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

para mudar o comportamento do meu código!

Aqui, existem dois problemas:

Não podemos ter um campo acessível a crianças, mas não a públicos externos (por exemplo, protegidos). Existe alguma maneira de conseguir isso?

Se não, ou seja, se quisermos que o PrivatePrivate esteja acessível, precisamos torná-lo público. Então o usuário poderá modificá-lo!

Além disso, todas as funções públicas podem ser alteradas e substituídas. Eu não quero que isso aconteça.

Eu não vejo como RequireJS resolve esses problemas. Alguém pode lançar alguma luz?

questionAnswers(4)

yourAnswerToTheQuestion