Node js и new при использовании требуют

Я пытался разобраться с включением других файлов js в node.js.

Я прочитал все о функции require и других альтернативах и решил использовать функцию require (поскольку код будет использоваться только на node.js, а не в браузере).

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

Чтобы заставить его работать, я пишу код, подобный следующему (давайте назовем его Vehicle.js):

var util = require('util');
var EventEmitter = require('events').EventEmitter;

module.exports = Vehicle;

util.inherits(Vehicle, EventEmitter);

function Vehicle(options) {
    EventEmitter.call(this);
    options = options || {};
    ...
}

Vehicle.prototype._doStartEvent = function(data) {
    this.emit('start', data);
};

Vehicle.prototype.testRun = function() {
    this._doStartEvent();
};

Затем в моем основном js (назовем его server.js) у меня есть следующее:

var test = exports;
exports.Vehicle = require('./vehicle.js');

var remoteVehicle = new test.Vehicle({address: "192.168.1.3"});

remoteVehicle.on('start', function(d) {console.log('started');});

remoteVehicle.testRun();

Теперь все это работает нормально, но я плохо понимаю, что происходит.

Меня больше всего беспокоит использование var test = exports;, а затем exports.Vehicle = require(...).

Я пытался просто сделать что-то вроде var vehicle = require(...).Vehicle и var vehicle = require(...) с целью просто использовать new Vehicle или что-то подобное, но не смог заставить это работать.

Вынужден ли я использовать экспорт, и если да, то почему?

Обратите внимание, что я использовал проект AR Drone в качестве примера, приведенный выше код основан на том, как они сделали свои модули внутри. См. Client.js и index.js.


person Metalskin    schedule 03.01.2013    source источник
comment
Эта электронная книга Mastering Node хороша: visionmedia.github.com/masteringnode/book.html   -  person Alex    schedule 03.01.2013
comment
@LeonidBeschastny Как это дубликат? Этот вопрос был задан первым (он был задан 3 января 2013 г., тот, который, как вы утверждаете, является дубликатом, был задан 11 июля 2013 г.). Если вы думаете, что они дубликаты, тогда другой вопрос - это дубликат, а не этот.   -  person Metalskin    schedule 15.05.2015
comment
@Metalskin извините, меня смутило название. Я перекрасил ваш вопрос более тщательно и думаю, что ошибся, считая его дубликатом.   -  person Leonid Beschastny    schedule 15.05.2015
comment
@LeonidBeschastny не беспокойся, не навреди, не нарушай :-)   -  person Metalskin    schedule 15.05.2015


Ответы (1)


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

var Vehicle = require('./vehicle.js');

var remoteVehicle = new Vehicle({address: "192.168.1.3"});

remoteVehicle.on('start', function(d) {console.log('started');});

remoteVehicle.testRun();
person Andrey Sidorov    schedule 03.01.2013
comment
Спасибо Андрей, получилось. Теперь не уверен, что я делал, что не работало, так как я думал, что попробовал то, что вы предлагаете. Я подозреваю, что запутался и сделал var Vehicle = require('./vehicle.js').Vehicle; из-за того, что гуглил. - person Metalskin; 03.01.2013