JavaScript: Пакеты
По мере роста программы увеличивается не только количество строк кода, но и количество модулей. В небольших проектах десятки файлов ещё можно держать рядом, но в реальных приложениях файлов могут быть сотни и тысячи. Кроме того, удобный код хочется переиспользовать в разных проектах.
В Python для группировки модулей используют пакеты-директории. В экосистеме JavaScript единицей переиспользования и распространения служит пакет (npm-пакет). Пакет — это набор модулей, который публикуют и устанавливают целиком.
Что такое пакет
Пакет описывается файлом package.json и устанавливается командой npm install в директорию node_modules. Именно оттуда подключаются его модули. Один из таких пакетов — hexlet-basics, из которого мы импортируем функции в этом курсе.
Импорт по имени пакета
Когда пакет установлен, его содержимое импортируют по имени пакета, а не по пути к файлу:
import { round } from 'hexlet-basics/math';
console.log(round(3.14159, 2)); // => 3.14Один пакет — несколько модулей
Пакет обычно содержит не один модуль, а несколько. Чтобы выбрать конкретный модуль внутри пакета, после его имени указывают путь через /:
import { reverse } from 'hexlet-basics/string'; // модуль string пакета hexlet-basics
import { round } from 'hexlet-basics/math'; // модуль math того же пакетаЧасть до / — это имя пакета, а часть после — модуль внутри него. Так один пакет может объединять много модулей, сгруппированных по задачам.
package.json
Пакет сам описывает себя в файле package.json. В нём указывают имя, зависимости и то, какие модули пакет отдаёт наружу:
{
"name": "hexlet-basics",
"dependencies": {},
"exports": {
"./string": "./src/hexlet/string.js",
"./math": "./src/hexlet/math.js"
}
}Поле exports задаёт, какие пути доступны при импорте. Благодаря ему запись hexlet-basics/string приводит к нужному файлу внутри пакета.
node_modules и реестр npm
Установленные пакеты попадают в директорию node_modules. Их не пишут вручную — основным источником служит реестр npm, где опубликованы сотни тысяч готовых пакетов: для работы с датами, сетью, тестами и почти любой другой задачей.
Особняком стоят встроенные модули среды Node.js (node:fs, node:path и другие). Их не нужно устанавливать — они поставляются вместе с Node.js, как стандартная библиотека.
Задание
Реализуйте функцию formatPrice(). Она принимает число и возвращает его строковое представление, округлённое до двух знаков после запятой.
Используйте функцию round() из модуля hexlet-basics/math — это другой модуль того же пакета hexlet-basics, с которым вы работали в прошлом уроке. Импорт напишите самостоятельно.
formatPrice(12.3456); // => '12.35'
formatPrice(2.5); // => '2.50'
formatPrice(10); // => '10.00'Подсказка
- В начале файла импортируйте функцию:
import { round } from 'hexlet-basics/math'; - Второй аргумент
round()— количество знаков после запятой
Полезное
Ваше упражнение проверяется по этим тестам
// @ts-check
import { expect, test } from 'vitest';
import formatPrice from './index.js';
test('packages', () => {
expect(formatPrice(12.3456)).toBe('12.35');
expect(formatPrice(2.5)).toBe('2.50');
expect(formatPrice(10)).toBe('10.00');
});Решение учителя откроется через:
20:00
