2016-02-09 5 views
1

Возможно, мне просто не хватает «более крупной картины», но мне трудно понять, зачем нужно экспортировать модули, чтобы просто разделить файлы. Я пытался сделать что-то вроде этого:Узел js, разделение файлов без необходимости передавать зависимости вокруг?

//server.js 
var app = require('koa')(); 
var othermodule1 = require('othermodule1')(); 
var othermodule2 = require('othermodule2')(); 

var router = require('./config/routes')(); 
app.use(router.routes()); 




//routes.js 
module.exports = require('koa-router')() 
.get('*', function*(next){ 
    othermodule1.something; 
}) 

понимая, что routes.js не имеет доступа к «othermodule1» после вызова из serverjs. Я знаю, что есть способ передать необходимые переменные во время вызова require, но у меня есть намного больше, чем только 2 модуля, которые мне нужно будет передать. Поэтому из-за моей, вероятно, наивной перспективы, это кажется излишне громоздким. Кто-то хочет просветить меня или есть ли способ сделать это, что я пропустил?

ответ

2

Каждый модуль node.js предназначен для автономного совместного использования. Он включает в себя все, что ему нужно для выполнения своей работы. Это принцип модулей.

Этот принцип обеспечивает немного больше накладных расходов в начале каждого модуля до require() во всем, что вам нужно в этом модуле, но он выполняется только один раз при запуске сервера, и все модули кэшируются в любом случае, поэтому он обычно не является значимая проблема с производительностью.

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


В вашем конкретном коде, если routes необходим доступ к othermodule1, то он должен просто require() его по мере необходимости. Вот как работают модули. routes должен включать только то, что ему нужно. Модули кэшируются, поэтому их много раз просто дает каждому require() тот же самый дескриптор модуля из кеша.


Это корректировка мышления от других систем, но как только вы получите использовать его, вы просто делаете это, и это не большая проблема. Либо require() в том, что вам нужно (простой способ использования совместно используемого модуля), либо передать что-то в модуль на его конструкторе (метод push) или создать методы init(), чтобы кто-то мог правильно инициализировать вас или вызвать какой-либо другой модуль, чтобы получить нужные вам вещи pull способ).

+0

Спасибо за объяснение! Итак, для моего конкретного случая использования с маршрутами, справедливо ли говорить, что это полезно, если мне вдруг захочется переключиться, чтобы выразить по какой-то причине на моем сервере.js, все еще желая koa-маршрутизации? – House3272

+0

@ House3272 - Я не понимаю, что «переключение на экспресс» имеет отношение к вашему вопросу вообще. Все мои комментарии о модулях применяются независимо от того, какой framework.js вы используете или не используете. – jfriend00

+0

О, извините. То, что вы сказали, дает полный смысл для модулей узлов, которые можно установить через npm. Но для моего собственного кода (например, route.js, который очень специфичен для моего одного сервера), я не вижу большой ценности при модуляции, поскольку он не будет использоваться совместно или что-то еще. Мой первый комментарий заключался в том, что я пытался увидеть, как это будет полезно haha. Я подумал, возможно, если бы захотел переключиться, чтобы выразить какую-то другую часть моего приложения, продолжая использовать koa для маршрутизации. – House3272

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

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