Это краткая запись в блоге о способе структурирования проекта Node.JS в модульной и объектно-ориентированной манере, в частности такой, которая легко читается.

Сначала мы создаем точку входа (помещенную в index.js в корне проекта):

// Entry Point
;!function(undefined) {
  require(‘./lib/app.js’)();
}();

Затем мы создаем новый модуль Node.JS, представляющий основное создаваемое приложение («./lib/app.js»):

// Application Object
;!function(undefined) {
  var app = function(){};
  var init = function(){ 
    app.moduleOne = require('./lib/modules/module-one.js')(app);
    app.moduleTwo = require('./lib/modules/module-two.js')(app);
    app.moduleThree = require('./lib/modules/module-three.js')(app);
    app.moduleTwo.startHello();
    return app;
  }
  module.exports = init;
}

Наконец, мы продолжаем и создаем один из модулей для нашего приложения («./lib/modules/module-one.js»):

// Module One
;!function(undefined) {
  var mod = function(){};
  var init = function(app){ 
    mod.app = app;
    return mod;
  }
  mod.helloWorld = function(){
    console.log("This is module one. Hello world!");
    return mod;
  }
  module.exports = init;
}

И следуйте той же схеме для всех остальных модулей в нашем приложении. Или в приведенном ниже примере «./lib/modules/module-two.js»…

// Module Two
;!function(undefined) {
  var mod = function(){};
  var init = function(app){ 
    mod.app = app;
    return mod;
  }
  mod.startHello = function(){
    mod.app.moduleOne.helloWorld();
    return;
  }
  module.exports = init;
}

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

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

Теперь эти модули могут быть даже новыми модулями Node.JS, которые вы загружаете в NPM — ничто вас не останавливает!

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