Как включить функции из других файлов в JavaScript/Node.js?
У меня есть файл app.js со следующим кодом:
var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
res.render('index', {locals: {
title: 'NowJS + Express Example'
}});
});
app.listen(8080);
Как импортировать функции из файла tools.js для использования в app.js? Можно ли сделать базовый импорт файла tools.js, или мне нужно превратить “tools” в модуль и затем подключить его (require)?
Как включать функции из других файлов в Node.js
Для включения функций из других файлов в Node.js необходимо использовать функцию require() вместе с module.exports или exports в исходном файле. Для вашего файла tools.js вы будете экспортировать функции с помощью module.exports, а затем импортировать их в app.js с помощью require('./tools').
Содержание
- Базовый шаблон импорта модулей
- Создание и экспорт функций
- Использование нескольких функций из tools.js
- Различные подходы к экспорту
- Лучшие практики модульности
- Альтернативные методы импорта
Базовый шаблон импорта модулей
В Node.js каждый файл по умолчанию рассматривается как отдельный модуль. Для обмена функциональностью между файлами необходимо явно экспортировать функции из одного файла и импортировать их в другой. Базовый шаблон включает:
- Экспорт из исходного файла с помощью
module.exports - Импорт в целевом файле с помощью
require()
В вашем конкретном случае вам потребуется изменить оба файла, чтобы установить эту связь между app.js и tools.js.
Создание и экспорт функций
Создадим файл tools.js с некоторыми функциями, которые вы хотите использовать:
// tools.js
function greetUser(name) {
return `Привет, ${name}! Добро пожаловать в наше приложение.`;
}
function formatTitle(title) {
return title.toUpperCase();
}
function validateInput(input) {
return input && input.trim().length > 0;
}
// Экспортируем функции
module.exports = {
greetUser: greetUser,
formatTitle: formatTitle,
validateInput: validateInput
};
Также можно использовать сокращенный синтаксис свойств, если имена переменных совпадают:
// tools.js (сокращенная версия)
function greetUser(name) {
return `Привет, ${name}! Добро пожаловать в наше приложение.`;
}
function formatTitle(title) {
return title.toUpperCase();
}
function validateInput(input) {
return input && input.trim().length > 0;
}
module.exports = {
greetUser,
formatTitle,
validateInput
};
Использование нескольких функций из tools.js
Теперь измените ваш файл app.js, чтобы импортировать и использовать эти функции:
var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
// Импортируем функции из tools.js
var tools = require('./tools');
app.get('/', function(req, res){
var title = 'Пример NowJS + Express';
var formattedTitle = tools.formatTitle(title);
var greeting = tools.greetUser('Посетитель');
res.render('index', {
locals: {
title: formattedTitle,
greeting: greeting
}
});
});
// Использование функции валидации в другом маршруте
app.get('/submit', function(req, res) {
var userInput = req.query.input;
if (tools.validateInput(userInput)) {
res.send('Получены корректные данные: ' + userInput);
} else {
res.send('Некорректные данные. Пожалуйста, попробуйте снова.');
}
});
app.listen(8080);
Различные подходы к экспорту
Существует несколько способов экспортировать функции из модуля в Node.js:
1. Отдельный экспорт
// tools.js
exports.greetUser = function(name) {
return `Привет, ${name}!`;
};
exports.formatTitle = function(title) {
return title.toUpperCase();
};
2. Экспорт одной функции
Если вы хотите экспортировать только одну функцию:
// tools.js
function greetUser(name) {
return `Привет, ${name}!`;
}
module.exports = greetUser;
Затем используйте в app.js:
var greetUser = require('./tools');
app.get('/', function(req, res) {
var greeting = greetUser('Посетитель');
// ...
});
3. Экспорт конструктора/класса
Для более сложного функционала:
// tools.js
function Tools() {}
Tools.prototype.greetUser = function(name) {
return `Привет, ${name}!`;
};
Tools.prototype.formatTitle = function(title) {
return title.toUpperCase();
};
module.exports = new Tools();
Лучшие практики модульности
Организация файлов
- Держите связанные функции вместе в логических модулях
- Используйте описательные имена файлов (например,
userTools.jsвместоtools.js) - Разделяйте задачи - не смешивайте доступ к данным, бизнес-логику и представление
Шаблоны экспорта
- Будьте последовательны в стиле экспорта в рамках проекта
- Используйте именованный экспорт для нескольких связанных функций
- Рассмотрите возможность использования ES6 модулей (
export/import), если ваша версия Node.js это поддерживает
Обработка ошибок
// tools.js с обработкой ошибок
function processSafely(callback, ...args) {
try {
return callback(...args);
} catch (error) {
console.error('Ошибка в модуле tools:', error);
return null;
}
}
module.exports = {
processSafely,
greetUser: (name) => processSafely((n) => `Привет, ${n}!`, name)
};
Альтернативные методы импорта
Относительные и абсолютные пути
- Используйте относительные пути (
./tools,../lib/utils) для локальных модулей - Используйте абсолютные пути (
require('path')) для встроенных или установленных модулей
Асинхронная загрузка
Для сценариев, где требуется динамическая загрузка модуля:
// Динамическая загрузка модуля
function loadTools() {
return new Promise((resolve, reject) => {
try {
const tools = require('./tools');
resolve(tools);
} catch (error) {
reject(error);
}
});
}
// Использование
loadTools()
.then(tools => {
console.log(tools.greetUser('Динамический'));
})
.catch(error => {
console.error('Не удалось загрузить tools:', error);
});
Кэширование модулей
Node.js автоматически кэширует модули после первого require. Если вам нужны свежие экземпляры:
// Очистка кэша require для модуля
delete require.cache[require.resolve('./tools')];
const freshTools = require('./tools');
Заключение
- Используйте
require()иmodule.exportsдля обмена функциями между файлами Node.js - это базовый шаблон для повторного использования кода - Экспортируйте функции из tools.js с помощью синтаксиса
module.exports = { functionName } - Импортируйте в app.js с помощью
var tools = require('./tools')и вызывайте функции черезtools.functionName() - Выбирайте подходящие шаблоны экспорта в зависимости от ваших потребностей - одна функция, несколько функций или экспорт на основе класса
- Следуйте модульным практикам, держа связанные функции вместе и поддерживая последовательный стиль экспорта
- Учитывайте обработку ошибок в ваших модулях, чтобы сделать их более надежными и предотвратить сбой приложения
Базовый подход, о котором вы спрашивали, действительно является стандартным способом в Node.js - вам нужно превратить “tools” в модуль с помощью module.exports и затем подключить его в вашем основном файле. Этот шаблон хорошо масштабируется по мере роста вашего приложения и становится необходимым для поддержания чистого, организованного кода.
Источники
(Примечание: Результаты веб-поиска для данного запроса отсутствовали, поэтому этот ответ основан на официальной документации Node.js и общепринятых практиках.)