Я пытаюсь лучше понять область действия модуля node.js и требования в контексте создания экземпляра переменной. Точнее, чтение файлов в память.
У меня есть http-сервер с модулем, который читает статические файлы sql, хранящиеся в кодовой базе, и выполняет содержащиеся в них запросы. Например:
'use strict';
const fs = require('fs')
const executeSql = require('./utils/execute-sql');
module.exports.getDataById = (id) => {
const sql = fs.readFileSync(
`./data-access/sql/getDataById.sql`, 'utf8'
);
return executeSql(sql, id);
}
module.exports.getDataByName = (name) => {
const sql = fs.readFileSync(
`./data-access/sql/getDataByName.sql`, 'utf8'
);
return executeSql(sql, name);
}
Насколько я понимаю, каждый раз, когда вызываются эти функции (getDataById
и getDataByName
), файл читается синхронно блокирующим образом и блокирует поток выполнения. Я знаю, что могу читать файлы асинхронно, чтобы избежать этого, но мне действительно любопытно, означает ли вытягивание переменных sql из функции и в область модуля операции readFile только один раз (когда создается экземпляр процесса узла) и в конечном итоге будет более эффективным. Например:
'use strict';
const fs = require('fs')
const executeSql = require('./utils/execute-sql');
const sql1 = fs.readFileSync(
`./data-access/sql/getDataById.sql`, 'utf8'
);
const sql2 = fs.readFileSync(
`./data-access/sql/getDataByName.sql`, 'utf8'
);
module.exports.getDataById = (id) => {
return executeSql(sql1, id);
}
module.exports.getDataByName = (name) => {
return executeSql(sql2, name);
}
Я знаю, что require
загружает модули синхронно при инициализации процесса node и дополнительно кэширует эти модули, если они потребуются где-то еще, но я пытаюсь понять, если стандартные объявления переменных, НЕ использующие require
, приводят к аналогичному экземпляру ссылки на память, которая сохраняется в течение всего времени существования процесса узла, и его не нужно повторно создавать каждый раз, когда требуется модуль.
Я ценю любую информацию, которую вы можете предоставить.