Node.js - Требование мангуста тут и там вызывает избыточность?

У меня есть следующая структура каталогов Node.js.

|--app/
   |--app.js
   |--routers/
      |--index.js/
   |--models/
      |--schemas.js
      |--post.js

В app.js есть такая строка mongoose.connect('mongodb://localhost/' + config.DB_NAME);, В schema.js:

var mongoose = require('mongoose')
    , Schema = mongoose.Schema
    , ObjectId = Schema.ObjectId;

var PostSchema = new Schema({
    title: String
    , author: String
    , body: String
    , creataAt: { 
        type: Date
        , default: Date.now
    }
});

// other schemas goes here

module.exports.PostSchema = PostSchema;

В post.js:

var mongoose = require('mongoose')
    , PostSchema = require('./schemas').PostSchema
    , PostModel = mongoose.model('Post', PostSchema);

module.exports = PostModel;

И в index.js может быть такая строка: var PostModel = require('../models/post');, Все файлы, упомянутые выше, требуют mongoose. Цель schemas.js - помочь программистам понять схему базы данных в одном файле. Тем не менее, мне интересно, вызывает ли это устройство избыточность и приводит к дополнительным накладным расходам, потому что здесь и там мне нужен мангуст. Должен ли я передать это в качестве аргумента?

2 ответа

Решение

Если вы беспокоитесь только о производительности, вам не нужно. Согласно http://nodejs.org/docs/latest/api/modules.html:

Кэширование

Модули кэшируются после первой загрузки. Это означает (среди прочего), что каждый вызов require('foo') получит точно такой же возвращаемый объект, если он будет преобразован в тот же файл.

Несколько звонков на require('foo') может не вызывать многократное выполнение кода модуля. Это важная особенность. С его помощью могут быть возвращены "частично выполненные" объекты, что позволяет загружать транзитивные зависимости, даже если они вызывают циклы.

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

Итак, вы на самом деле не requiring Мангуст каждый раз; скорее каждый раз после первого возвращается кешированный модуль Mongoose.

Вы также должны обратить внимание, когда требуется мангуст из связанных модулей. В случае с mongoose вы чаще всего полагаетесь на одноэлементный шаблон для доступа к соединению mongodb, а механизм кэширования может помешать модульности. Возможно, я сделал что-то не так, но я подробно описал проблему там: https://stackru.com/questions/16687619/node-js-require-do-not-behave-as-expected-when-using-linked-packages

Другие вопросы по тегам