030 Обзор NPM
Самые популярные пакетные менеджеры:
npm
- самый популярный, простой и понятный менеджерyarn
- разработанныйfacebook
менеджер. Обычно устанавливается первая версия, которая не развивается, но так же имеется и третья версияpnpm
- хранит все скачанные модули в одном месте, но имеет минус в более тяжёлой настройкеboar
Если говорить про NPM
, то мы имеем возможность загружать наши пакеты в него и скачивать для использования в отдельных приложениях. Так же имеется и приватный репозиторий.
Так же менеджер создаёт папку с частоиспользуемыми зависимостями, чтобы быстро их закидывать в наш проект
Эта команда позволяет быстро обновить npm
npm i -g npm
031 Авторизация и профиль
Далее у нас идут команды авторизации и редактирования информации нашего профиля
// даст войти в npm
npm login
// покажет, под каким пользователем сейчас находимся
npm whoami
// устанавливаем в наше окно информации об аккаунте значения
npm profile set fullname "Lvov Valery"
//получаем информацию об аккаунте
npm profile get
// выйти из аккаунта npm
npm logout
Таким образом мы можем залогиниться в наш профиль
А тут поменять информацию и вывести её
032 Разбор package.json
Первым делом нужно инициализировать пакет в git
и npm
// далее добавим его в гит
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <ссылка_на_репозиторий>
git push -u origin main
// инициализируем наш проект с пэкеджем
npm init
И во время иннициализации npm
начально настраиваем пэкэджер
package name: (my) weather-cli <имя пакета>
version: (1.0.0) <версия нашего пакета: мажор.минор.фикс-[aplha|beta]>
description: CLI for getting weather <о чём этот пакет>
entry point: (index.js) <входная точка в пакет>
test command:
git repository: <вставляем имеющийся репозиторий>
keywords: cli, weather, <ключевые слова по нашему пакету>
author: Lvov Valery <имя автора>
license: (ISC) MIT <вид лицензии>
И далее мы получаем такой файлик с нашими изначальными значениями:
package.json
{
"name": "weather-cli",
"version": "1.0.0-alpha",
"description": "CLI for getting weather",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"cli",
"weather"
],
"author": "Lvov Valery",
"license": "MIT"
}
name
- Само имя нашего пакета, которое будет отображаться у него при скачивании и установлении зависимостейverison
- хранит в себе версию нашего пакета:- Мажорная версия проета - это breaking changes, которые конкретно меняют наш пакет и весь старый код может полететь.
- Минорные изменения - это имплементация новых фич, которые дополняют мажорную версию.
- И третья цифра - это мелкие фиксы старых багов.
description
- Кратное описание проектаscripts
- хранит в себе консольные команды, которые мы можем быстро вызватьhomepage
- тут хранится ссылка на ваш сайт с этим пакетомrepository
- тут хранится репозиторий пакетаbugs
- сюда можно обратиться для баг-репортовprivate
- тут определяется приватный пакет или нетmain
- это точка входа в пакет, и если она будет указана неправильно, то войти в приложение не получитсяbrowser
- то же самое, что и main, но если мы публикуем фронт-эндовский пакетbin
- это точка входа в приложение, если мы будем использовать его как отдельное приложение (например, CLI)os
- указываем ограничения по поддерживаемым системам. Например["win32"]
- поддерживается всё, кроме 32-ух разрядных Windowscpu
- поможет указать, какие процессоры поддерживаем или не поддерживаем (так же:"cpu": ["!arm"]
)man
- хранит в себе путь до мануала по данному пакету (["./README.md"]
)engines
- тут уже можно указать, какие версии ноды поддерживаются данным пакетомfunding
- тут указывается ссылка на сайт, где можно поддержать развитие проектаfiles
- позволяет указать, какие файлы мы можем заливать с нашим пакетом, а какие нет (стоит вместо этого использовать гитигнор и нпмигнор)
Так выглядит забитый json
наших настроек
package.json
{
"name": "weather-cli",
"version": "1.0.0-alpha",
"private": false,
"description": "CLI for getting weather",
"main": "index.js",
"bin": "./index.js",
"os": ["!win32"],
"cpu": ["!arm"],
"man": ["./README.md"],
"engines": {
"node": ">14"
},
"files": ["./src/**/*.js"],
"funding": [],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"cli",
"weather"
],
"author": "Lvov Valery",
"license": "MIT",
"homepage": "http://www.weather",
"repository": {
"type": "git",
"url": "https://github.com/ZeiZel/npm-weather-cli"
},
"bugs": {
"url": "https://github.com/",
"email": "valera2003lvov@yandex.ru"
}
}
Тут будут храниться те данные, которые мы не хотим загружать в гит
.gitignore
/dist
/node_modules
Тут будут храниться файлы, которые мы не хотим загружать на сайт npm
.npmignore
/.vscode
/.idea
033 Управление зависимостями
package-lock.json
хранит в себе залоченные версии наших зависимостей. Если нам важно сохранять их, то стоит отправлять этот файл на гитхаб.
Базовые операции, которые нам нужно проводить:
// установит нужный нам модуль
npm install <модуль>
// поможет найти в консоли модуль, который может нам помочь
npm search <ключевое_слово>
// установит все зависимости из package.json, если таковые уже заранее имеются
npm i
// проверяет наши модули на потенциально небезопасные связи
npm audit
// исправит ошибки, которые аудит сможет исправить
npm audit fix --force
// полностью переустанавливает папку нод модулей, учитывая package-lock
npm ci
// покажет модули, авторов которых можно поддержать
npm fund
// ! две полезные команды, если будут ошибки связей
// позволит верифицировать связи наших модулей
npm cache verify
// позволит очистить кэш и заново установить зависимости с ошибками
npm cache clear
И здесь отображены наши зависимости модулей:
В реальности мы буем использовать только dependencies
(для работы приложения), devDependencies
(для разработки приложения) и peerDependencies
(для написания своих плагинов к модулям)
// это зависимости для работы самого приложения
"dependencies": {}
// это зависимости для работы наших инструментов разработки (gulp, webpack, typescript)
"devDependencies": {}
// позволяет указать, что для работы пакета нужны другие зависимости / то есть позволяет эффективно указать, что у нашего пакета есть обязательные зависимости (например, мы пишем свой плагин для nestjs и без него нельзя будет запускаться несту и работать)
"peerDependencies": {}
// это мета-информация для peerDependencies, которая позволяет указать дополнительные настройки (например, фейлиться ли нашему приложению при отсутствии модуля)
"peerDependenciesMeta": {}
// опциональные зависимости - необязательные
"optionalDependencies": {}
Так выглядит работа с нужными для нас модулями:
// установка пакета с зависимостями для рантайма
npm i axios chalk dedent-js
// установка пакета с зависимостями для разработки
npm i -D gulp
// удаляет пакет из проекта и все его зависимости
npm uni gulp
// установка пакета в глобальное пространство (теперь его можно будет вызвать отовсюду)
npm i -g gulp
Тут мы можем определить, какая версия модуля нам нужна будет в дальнейшем
{
"axios": "^1.2.0", // будет поднимать все версии, кроме мажорных
"axios": "~1.2.0", // будет поднимать только версии фиксов
"axios": "1.2.0" // не будет поднимать версию совсем
}
И так же у наших установленных модулей есть свои зависимости, которые так же дополнительно нам устанавливаются. Тут нужно сказать, что не нужно на каждую свою задачу искать модуль, так как модули сильно разрастутся и нам сложно будет отследить модуль с уязвимостью или вирусом, так как от него будет много что зависеть
Папка .bin
хранит в себе бинарники вызова самой утилиты
Этот бинарник вызывается, когда мы упомянаем наш плагин в скриптах