НейроАгент

Импорт модулей Node.js: функции из других файлов

Узнайте, как импортировать и использовать функции из других файлов в Node.js с помощью require() и module.exports. Полное руководство с примерами для лучшей организации и переиспользования кода.

Как включить функции из других файлов в JavaScript/Node.js?

У меня есть файл app.js со следующим кодом:

javascript
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').

Содержание


Базовый шаблон импорта модулей

В Node.js каждый файл по умолчанию рассматривается как отдельный модуль. Для обмена функциональностью между файлами необходимо явно экспортировать функции из одного файла и импортировать их в другой. Базовый шаблон включает:

  1. Экспорт из исходного файла с помощью module.exports
  2. Импорт в целевом файле с помощью require()

В вашем конкретном случае вам потребуется изменить оба файла, чтобы установить эту связь между app.js и tools.js.


Создание и экспорт функций

Создадим файл tools.js с некоторыми функциями, которые вы хотите использовать:

javascript
// 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
};

Также можно использовать сокращенный синтаксис свойств, если имена переменных совпадают:

javascript
// 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, чтобы импортировать и использовать эти функции:

javascript
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. Отдельный экспорт

javascript
// tools.js
exports.greetUser = function(name) {
  return `Привет, ${name}!`;
};

exports.formatTitle = function(title) {
  return title.toUpperCase();
};

2. Экспорт одной функции

Если вы хотите экспортировать только одну функцию:

javascript
// tools.js
function greetUser(name) {
  return `Привет, ${name}!`;
}

module.exports = greetUser;

Затем используйте в app.js:

javascript
var greetUser = require('./tools');
app.get('/', function(req, res) {
  var greeting = greetUser('Посетитель');
  // ...
});

3. Экспорт конструктора/класса

Для более сложного функционала:

javascript
// 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 это поддерживает

Обработка ошибок

javascript
// 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')) для встроенных или установленных модулей

Асинхронная загрузка

Для сценариев, где требуется динамическая загрузка модуля:

javascript
// Динамическая загрузка модуля
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. Если вам нужны свежие экземпляры:

javascript
// Очистка кэша 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 и общепринятых практиках.)