Рубрики
Без рубрики

Как использовать Module.exports в Node.js

Автор оригинала: Tendai Mutunhire.

Использование модулей является неотъемлемой частью построения полных приложений и программных систем с использованием Node.js. В отсутствие модулей ваш код будет фрагментирован и трудно запустить, не говоря уже о том, чтобы поддерживать со временем. Но что такое модуль? И как именно вы должны использовать Module.exports Чтобы построить свои программы Node.js?

Модуль – это дискретная программа, содержащаяся в одном файле в Node.js. Поэтому модули привязаны к файлам, с одним модулем на файл. Модули доступны на других языках программирования. Node.js использует систему модулей Commonjs, но в экосистеме JavaScript используются другие типы модулей. Наиболее заметным из этих других модульных систем являются асинхронный модуль (AMD) и (ECMAScript 6) модульные системы ES6.

Как мы увидим, Module.exports Это объект, который текущий модуль возвращает, когда он «требуется» в другой программе или модуле.

Вы можете включить функциональные возможности из других модулей в любом другом модуле. Для этого называется «нуждающимся» модулем, который просто вызывает определенный специальный объект, представляющий функциональность модуля.

Сообщить код с Module.exports

Для повседневного использования модули позволяют нам составлять более крупные программы вне небольших частей. Модули Станьте основными строительными блоками большего количества программного обеспечения, которые коллективно определяют.

Под крышками модуль отслеживает себя через объект с именем модуль Отказ Внутри каждого модуля, следовательно, «модуль» относится к объекту, представляющему текущему модулю. Этот объект содержит метаданные о модуле, например имя файла модуля, а также идентификатор модуля.

Вот маленький фрагмент кода, который вы можете запустить, чтобы увидеть значения этих примерных свойств в модуле:

// module1.js

console.log(module.filename);
console.log(module.id);
console.log(module.exports);

Вы можете запустить это, используя команду Узел Module1.js Отказ Вы увидите, например, что module.filename Свойство установлено на пункт файла, который заканчивается правильным именем файла, в котором существует этот модуль, который является module1.js Отказ Вот пример выхода для кода выше:

$ node module1.js
/Users/scott/projects/sandbox/javascript/module-test/module1.js
.
{}

В Node.js практика изготовления кода модуля доступна для других модулей для использования, называется «экспортирующим» значениями.

Но если в отдельных модулях будет построена кусок сложного программного обеспечения, вы уже можете думать о следующих вопросах:

Важный вопрос № 1 : Как Node.js идентифицирует модуль «Основной», чтобы начать запустить программу?

Node.js идентифицирует основной модуль для запуска аргументов, которые передаются на Узел исполняемый. Например, если у нас есть модуль, содержащийся в файле server.js Наряду с другими частями нашей программы, содержащейся в файлах login.js и music_stream.js Призывая команду Node Server.js Определяет Сервер модуль как основной. Этот главный модуль, в свою очередь, позвонит функциональности в других модулях «требует» их.

Важный вопрос № 2 : Как модуль имеет свой код с другими модулями?

модуль Объект имеет специальное свойство, называемое Экспорт , который отвечает за определение того, что может использовать модуль для использования других модулей. В Node.js терминология, Module.exports Определяет значения, которые экспортирует модуль. Помните, что «экспорт» просто делает объекты или значения, доступные для других модулей для импорта и использования.

Следовательно, мы можем экспортировать любое значение или функцию или другой объект, который мы хотели бы экспортировать, прикрепляя его как свойство Module.exports объект. Например, если мы хотели бы экспортировать переменную с именем температура , мы могли бы сделать его доступным для использования за пределами модуля, просто добавив его как новое свойство Module.exports следующим образом:

module.exports.temperature = temperature; 

Экспорт и требование функций и переменных с Module.exports

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

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

// book_recommendations.js

// stores the favorite author in a constant variable
const favoriteAuthor = { name: "Ken Bruen", genre: "Noir", nationality: "Irish" };

// returns the favorite book
function favoriteBook() {
    return { title: "The Guards", author: "Ken Bruen" };
}
 
// returns a list of good books
function getBookRecommendations() {
    return [
        {id: 1, title: "The Guards", author: "Ken Bruen"},
        {id: 2, title: "The Stand", author: "Steven King"},
        {id: 3, title: "The Postman Always Rings Twice", author: "James M. Cain"}
    ];
}
 
// exports the variables and functions above so that other modules can use them
module.exports.favoriteAuthor = favoriteAuthor;
module.exports.favoriteBook = favoriteBook;
module.exports.getBookRecommendations = getBookRecommendations;

Мы добавили все переменные и функции, которые мы хотели бы экспортировать в Module.exports в качестве свойств объекта. Мы только что достигли нашей цели экспортировки этих функций и переменных из book_recommendations модуль.

Теперь давайте посмотрим, как мы сможем импортировать этот модуль и получить доступ к его функциям из другого модуля.

Для того чтобы импортировать модуль, нам нужно использовать специальное ключевое слово, используемое для импорта вещей, и это называется требуется Отказ Где Module.exports давайте установим вещи для экспорта, требуется Давайте укажем модули для импортированных в текущий модуль.

Функциональные возможности для импортирующих модулей предоставляются в модуле с именем требуется , доступно в глобальном масштабе. Основной экспорт этого модуля является функцией, к которой мы передаем путь модуля, который мы хотели бы импортировать. Например, чтобы импортировать модуль, определенный в Music.js мы бы ? требуется ('./music') , где мы указали относительный путь.

Теперь мы можем видеть, насколько легко импортировать что-либо, используя требуется Отказ Возвращаясь к нашему book_recommendations Модуль, мы можем импортировать его и получить доступ к функциям, которые он экспортирует. Это показано в следующем списке кода. Этот модуль печатает сообщение, описывающее рекомендуемые подарки на день рождения. Он рекомендуется книги из модуля импортированных рекомендаций книги и сочетают в себе с помощью музыкальных рекомендаций.

Создайте новый модуль, как показано ниже, то запустите его, как показано ранее, чтобы увидеть его, используя функции, определенные в Imported book_recommendations модуль.

// birthday_gifts.js

// import the book recommendations module
let books = require('./book_recommendations');

// gets some music recommendations as well
let musicAlbums = [
    { artist: "The Killers", title: "Live From The Royal Albert Hall" },
    { artist: "Eminem", title: "The Marshall Mathers LP" }
];

// the two best items from each category
let topIdeas = function() {
    return [musicAlbums[0], books.favoriteBook()];
}
 
// outputs a message specifying the customer's recommended gifting items
let gifts = function() {
    console.log("Your recommended gifts are:\n");
    console.log("######MUSIC######");

    for (let i = 0, len = musicAlbums.length; i < len; i++) {
        console.log(musicAlbums[i].title + " by " + musicAlbums[i].artist);
    }

    console.log("######BOOKS######");

    let recommendedBooks = books.getBookRecommendations();

    for (let i = 0, len = recommendedBooks.length; i < len; i++) {
        console.log(recommendedBooks[i].title + " by " + recommendedBooks[i].author);
    }

    console.log("\n\nYours");
    console.log("Shop Staff\n*************");
    console.log("P.S. If you have a limited budget, you should just get the music album " + topIdeas()[0].title + " and the book " + topIdeas()[1].title + ".");
}

console.log("Welcome to our gift shop.\n");

// Get the gifts
gifts();

Как вы можете видеть, мы использовали требуется импортировать book_recommendations модуль. Внутри нового модуля мы могли бы получить доступ к переменным и функциям, которые были экспортированы, добавив их в Module.exports Отказ

С оба модулями завершены, вызывая Узел Maynay_Gifts.js Отпечатывает аккуратное сообщение с полными рекомендациями подарков клиента. Вы можете увидеть вывод на следующем изображении.

Welcome to our gift shop.

Your recommended gifts are:

######MUSIC######
Live From The Royal Albert Hall by The Killers
The Marshall Mathers LP by Eminem
######BOOKS######
The Guards by Ken Bruen
The Stand by Steven King
The Postman Always Rings Twice by James M. Cain


Yours
Shop Staff
*************
P.S. If you have a limited budget, you should just get the music album Live From The Royal Albert Hall and the book The Guards.

Эта модель сочинения программ Node.js из меньших модулей – это то, что вы часто видите, например, с экспресс-промежуточным программным обеспечением.

Экспорт и требование классов с модулем. Экспорты

В дополнение к функциям и переменным мы также можем использовать Module.exports экспортировать другие сложные объекты, такие как классы. Если вы не знакомы с использованием классов или других принципов Node.js, вы можете взглянуть на наш Node.js для начинающих Guide Отказ

В следующем примере мы создаем класс CAT, который содержит имя и возраст для объектов CAT. Затем мы экспортируем класс CAT, прикрепляя его как свойство Module.exports объект. Как видите, это не так отличается от того, как мы экспортировали функции и переменные раньше.

// cat.js

// constructor function for the Cat class
function Cat(name) {
    this.age = 0;
    this.name = name;
}
 
// now we export the class, so other modules can create Cat objects
module.exports = {
    Cat: Cat
}

Теперь мы можем получить доступ к этому классу Cat, импортируя кот модуль. Как только это сделано, мы можем создавать новые объекты CAT и использовать их в модуле импорта, как показано в следующем примере. Опять же, вы должны попробовать запустить этот код с Узел Cat_school.js Чтобы увидеть имена и возраст новых кошек в вашей командной строке.

// cat_school.js

// import the cat module
let cats = require('./cat');
let Cat = cats.Cat;

// creates some cats
let cat1 = new Cat("Manny");
let cat2 = new Cat("Lizzie");

// Let's find out the names and ages of cats in the class
console.log("There are two cats in the class, " + cat1.name + " and " + cat2.name + ".");
console.log("Manny is " + cat1.age + " years old " +  " and Lizzie is " + cat2.age + " years old.");

Как мы только что увидели, экспортировка класса может быть достигнуто путем прикрепления класса как свойство Module.exports объект. Во-первых, мы создали класс с помощью функции конструктора. Тогда мы экспортировали класс, используя Module.exports Отказ Чтобы использовать класс, то мы требовали его в другом модуле, а затем создали экземпляры класса.

Для примера экспортировки класса, созданный с синтаксисом ES6, см. Книга класс ниже.

Альтернатива: использование сокращения экспорта VS Module.exports

Хотя мы можем продолжать назначать вещи для экспорта в качестве свойств Module.exports , существует сокращение способа экспорта вещей из модуля. Этот сокращенный путь включает в себя использование только Экспорт вместо Module.exports Отказ Есть некоторые Различия между двумя Отказ Ключевая вещь, чтобы заметить здесь, однако, что вы Должен Назначьте ваши новые значения в качестве свойств ярлыка Экспорт объект, а не назначать объекты непосредственно перезаписать значение Экспорт сам.

Вот пример, в котором я использую этот список сокращений, чтобы экспортировать пару объектов из модуля с именем film_school Отказ

// film_school.js

// a beginner film course
let film101 = {
    professor: 'Mr Caruthers',
    numberOfStudents: 20,
    level: 'easy'
}
 
// an expert film course
let film102 = {
    professor: 'Mrs Duguid',
    numberOfStudents: 8,
    level: 'challenging' 
}
 
// export the courses so other modules can use them
exports.film101 = film101;
exports.film102 = film102;

Обратите внимание, как мы присваиваем объекты как, например, Exports.film101 = ... вместо Экспорт Отказ Это позже назначение не экспортируют переменную, но полностью запутайте свой ярлык экспорта.

Экспорт, проделанный в сокращении сверху, могло быть достигнут в длительном способе, которым мы использовали с Module.exports используя следующие строки для экспорта.

// export the courses so other modules can use them
module.exports.film101 = film101;
module.exports.film102 = film102;

Мы также могли бы экспортировать два объекта, назначив объект напрямую на Module.exports Но это не будет работать с Экспорт Отказ

// export the courses so other modules can use them
module.exports = {
    film101: film101,
    film102: film102
}

Два очень похожи, и справедливо так. Это два способа достижения того же, но Экспорт Может ли отключить вас, если вы назначите объект для экспорта, как вы назначаете Module.exports Отказ

Различия между модулями Node.js и модулями ES6

Модули, используемые в Node.js, следуют спецификации модуля, известной как Commonjs Технические характеристики. Последние обновления на языке программирования JavaScript в форме ES6 укажите изменения на языке, добавление таких вещей, как новый синтаксис класса и A Модульная система Отказ Эта система модуля отличается от модулей Node.js. Модуль в ES6 выглядит следующим образом:

// book.js
const favoriteBook = {
    title: "The Guards",
    author: "Ken Bruen"
}

// a Book class using ES6 class syntax
class Book {
    constructor(title, author) {
        this.title = title;
        this.author = author;
    }

    describeBook() {
        let description = this.title + " by " + this.author + ".";
        return description;
    }
}

// exporting looks different from Node.js but is almost as simple
export {favoriteBook, Book};

Чтобы импортировать этот модуль, мы использовали ES6 Импорт Функциональность, как следует.

// library.js

// import the book module
import {favoriteBook, Book} from 'book';

// create some books and get their descriptions
let booksILike = [
    new Book("Under The Dome", "Steven King"),
    new Book("Julius Ceasar", "William Shakespeare")
];

console.log("My favorite book is " + favoriteBook + ".");
console.log("I also like " + booksILike[0].describeBook() + " and " + booksILike[1].describeBook());

Модули ES6 выглядят почти так же просто, как модули, которые мы использовали в Node.js, но они несовместимы с модулями Node.js. Это связано с тем, как модули загружаются по-разному между двумя форматами. Если вы используете компилятор, как Бабел , вы можете смешивать и сопоставлять форматы модулей. Если вы намерены кодировать на сервере в одиночку с Node.js, однако вы можете придерживаться формата модуля для Node.js, который мы охватываем ранее.

Учить больше

Хотите узнать больше о основах Node.js? Лично я бы порекомендовал онлайн курс, как WES BOS ‘Узнайте Node.js Поскольку видеоролики намного проще следовать, и вы действительно получите приложение по реальному миру.

Заключение

Использование Module.exports Позволяет нам экспортировать значения, объекты и стили из модулей Node.js. В сочетании с использованием требуется Чтобы импортировать другие модули, у нас есть полная экосистема для составления больших программ вне небольших частей. Когда мы объединяем ряд модулей, которые заботятся о уникальных частях функциональности, мы можем создать больше, более полезную, но легко поддерживать приложения и программные системы.