2015-05-02 5 views
4

У меня есть два модуля, оба из которых нуждаются в доступе к общему массиву. Я решить эту проблему, имея модуль, который просто состоит из следующих:Is module.export = [] Плохая практика?

sharedArray.js

module.exports = []; 

В модулях, которые я использую это так:

module1.js

var arr = require('./sharedArray'); 

function addSomething() { 
    // Add something to arr 
} 

module2.js

var arr = require('./sharedArray'); 

function doSomething() { 
    // Use arr for something 
} 

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

Есть ли лучший способ сделать это или это на самом деле, как вы его решаете?

+0

Это только стандартный механизм Node.js использует. Что с этим не так? – beautifulcoder

+0

Я обновил свой вопрос. В принципе, странно, что файл и модуль более или менее пусты для этого. Я никогда не видел, чтобы кто-то еще это делал. – user1767586

+0

Я сделал это раньше, чтобы избежать круговых зависимостей. Просто не забудьте четко называть ваш модуль и/или оставлять комментарий, объясняющий, какие данные он использует, а может быть, некоторые примеры модулей для потребления/производства данных. – ekuusela

ответ

5

Это не плохая практика. Это всего лишь один из нескольких вариантов совместного использования данных между модулями. Нет ничего «неправильного» в том, чтобы делать это так, как вы это делаете.


При обмене данными между модулями в Node.js, вы в принципе есть три варианта:

  1. Вы можете иметь один модуль, который присваивает данные в глобальное пространство имен при загрузке.

  2. У вас может быть метод некоторого модуля, который возвращает ссылку на данные. Этот метод может быть конструктором модуля или каким-либо другим методом.

  3. Вы можете сделать данные частью статистической структуры данных, находящейся в экспорте модуля. Это то, что вы делаете сейчас, когда вы просто делаете весь экспорт своим массивом.

Все три являются совершенно законными способами совместного использования данных.

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

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

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


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

sharedData.js

module.exports = { 
    myData: [...], 
    myOtherData: [...] 
}; 

module1.JS

var arr = require('./sharedData').myData; 

function addSomething() { 
    // Add something to arr 
} 

module2.js

var arr = require('./sharedData').myData; 

function addSomething() { 
    // Add something to arr 
} 
Смежные вопросы