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