Это руководство проведет вас через самый простой процесс создания и выпуска пакета NPM от начала до конца с использованием микропакета .
Поговорим немного о microbundle
. Я считаю это особенно эффективным для простых библиотек, поскольку вам не нужно беспокоиться о настройке, что позволяет вам сосредоточиться на разработке вашего пакета.
Вот краткий список его особенностей:
package.json
tsconfig.json
По сути, microbundle
построен на основеrollup.js . Если вам нужно создать более сложные библиотеки, чем я упомяну в этой статье, вы можете рассмотреть возможность использования чистой rollup.js
.
В качестве примера создадим простую библиотеку для суммирования двух чисел, которая будет экспортировать только одну функцию sum
.
Создайте папку для проекта и запустите npm init
со значениями по умолчанию, чтобы сгенерировать package.json
Создайте index.ts
в папке src
// src/index.ts export function sum(a: number, b: number) { return a + b; }
Установить microbundle
npm i -D microbundle
Обновите package.json
, указав следующие значения:
// package.json ... "type": "module", "source": "src/index.ts", // your source code "exports": { "types": "./dist/index.d.ts", // TypeScript declaration file "require": "./dist/index.cjs", // CommonJS entry point "default": "./dist/index.esm.js" // ES Module entry point }, "main": "./dist/index.cjs", // where to generate the CommonJS bundle "module": "./dist/index.esm.js", // where to generate the ESM bundle "unpkg": "./dist/index.umd.js", // where to generate the UMD bundle "types": "./dist/index.d.ts", // TypeScript declaration file for the package "scripts": { "build": "microbundle", // compiles "source" to "main", "module", "unpkg" "dev": "microbundle watch" // re-build when source files change } ...
Запустите скрипт сборки
npm run build
Вывод должен содержать именно те файлы, которые мы объявили в package.json
.
И вуаля, мы сделали нашу первую посылку. Давайте рассмотрим более сложные сценарии.
Если вы хотите добавить React в свою библиотеку, вы все равно можете использовать его microbundle
, но теперь ваша команда сборки должна выглядеть так:
microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react --globals react/jsx-runtime=jsx
Для удобства в будущем добавьте команду в package.json
в скрипт build
:
// package.json ... "scripts": { "build": "microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react --globals react/jsx-runtime=jsx" } ...
При создании библиотеки пользовательского интерфейса вам может понадобиться «песочница», где вы сможете разрабатывать, визуализировать компоненты и предоставлять демонстрационные компоненты для вашей документации.
Вот и сборник рассказов . Это песочница со своим удобным интерфейсом и сборщиком, в которой вы легко сможете описывать различные состояния ваших компонентов. Каждый захват состояния вашего компонента называется «историей».
На этом изображении, взятом из их документации, показано, как это выглядит:
Установить Storybook довольно просто; просто запустите команду внутри вашей библиотеки:
npx storybook@latest init
Эта команда установит все необходимые зависимости для Storybook, добавит сценарии для запуска и встроит Storybook в package.json
, создаст папку .storybook
с конфигурацией по умолчанию и добавит несколько примеров историй в папку src/stories
.
Вы можете добавить стиль одним из двух способов: файлом CSS или CSS-in-JS. Файл CSS позволяет легко настраивать, но требует отдельного включения, тогда как CSS-in-JS упрощает стилизацию, но увеличивает размер пакета.
CSS-файл
Создайте файл CSS в каталоге src и импортируйте его в корневой файл компонента реакции:
// src/index.tsx import './styles.css'; export const MySuperComponent = () => { return ( <h1 className="title">Hi there!</h1> ) };
Итак, давайте снова запустим команду сборки.
npm run build
И ваш импортированный файл styles.css
будет создан в папке dist
:
Большой! Мы получили CSS-файл с необходимыми стилями. Однако у этого решения есть небольшое неудобство. Файл CSS необходимо добавить отдельно после установки пакета.
Следовательно, пользователям вашей библиотеки потребуется использовать загрузчик CSS (например, загрузчик CSS для веб-пакета) для обработки вашего файла CSS, и их использование будет выглядеть следующим образом:
import { MySuperComponent } from 'my-super-library'; import 'my-super-library/dist/styles.css'; export const App = () => { return ( <MySuperComponent /> ); }
CSS-в-JS
Для этой цели вы можете использовать такие библиотеки, как стилизованные компоненты . И это будет выглядеть так:
import styled from 'styled-components'; const Title = styled.h1` font-size: 30px; font-weight: bold; `; export const MySuperComponent = () => { return ( <Title>Hi there!</Title> ) };
Благодаря этому решению пользователям не нужно будет импортировать файл CSS и добавлять специальный загрузчик для своего проекта. После установки библиотеки компонент будет иметь собственный стиль. Однако это увеличит размер пакета и затруднит пользователям настройку элементов с помощью селекторов CSS.
Выберите вариант, который подходит вам лучше всего. Я предпочитаю использовать файл CSS, поскольку он позволяет пользователям настраивать любой элемент с помощью селекторов CSS, не влияет на размер пакета и работает быстрее.
Файл README.md содержит информацию о вашей библиотеке, способах ее установки, ее базовом использовании и имеющихся у нее функциях. Часто это первый файл, который читают разработчики, когда они сталкиваются с вашим репозиторием или пакетом NPM, поэтому он должен быть кратким и информативным.
Мне нравится создавать структуру в следующем порядке:
Для вдохновения вы можете обратиться к примерам файлов README.md
из моих пакетов, таких как dot-path-value и response-nested-dropdown .
Это важная часть, потому что если вы сделаете это неправильно, пользователи могут столкнуться с конфликтами версий или другими проблемами, и им придется удалить вашу библиотеку. Итак, давайте рассмотрим основные различия между типами зависимостей.
microbundle
, который пользователям не нужно использовать, сохраните его в devDependities, и он не появится в пакете.
«peerDependency» — это зависимости, которые ваш пакет использует, но не включает в себя. Ваш пакет будет использовать версию зависимости, которую пользователь имеет в своем проекте.
По сути, нам следует указать зависимость от однорангового узла, если мы создаем библиотеку для ее экосистемы. Например, если вы создаете компонент React, установите React как одноранговую зависимость. При разработке компонента React с календарем добавьте React и библиотеку расчета дат (например, date-fns) в качестве одноранговых зависимостей.
Если у пользователя нет указанной одноранговой зависимости в его проекте, команда npm install
отобразит предупреждение, но не установит зависимость автоматически.
Просто небольшой пример того, как это выглядит:
// package.json ... "dependencies": { // libraries which will be installed along with your library "clsx": "^1.2.1" // just library for className combining }, "peerDependencies": { // user should have these packages installed "react": "^16.8.0 || ^17.0.0 || ^18.0.0" // user should have react 16.8+ version }, "devDependencies": { // won't be in user's bundle, these libraries just for your developing needs "@types/react": "^18.2.33", "react": "^18.2.0", // in case if we are using storybook, we need actual react library to render our components there "microbundle": "^0.15.1", }, ...
Если вы публикуете пакет NPM, это означает, что он будет общедоступен (если у вас есть бесплатная учетная запись). Чтобы собрать отзывы пользователей, вы можете создать репозиторий GitHub для своего исходного кода. Здесь люди могут создавать проблемы и общаться с вами по поводу вашего пакета. Вы также можете описать свои релизы и получить несколько звезд!
Вы, конечно, можете пропустить этот шаг, но он является неотъемлемой частью культуры разработчиков и может стать ценным вкладом в развитие открытого исходного кода.
Прежде чем вы сможете опубликовать свой пакет, важно убедиться, что ваш файл package.json
настроен правильно. Вот несколько важных шагов, которые необходимо выполнить:
Назовите и попытайтесь описать основные функции вашей библиотеки. Например:
"name": "react-color-picker"
Добавьте информацию о репозитории GitHub (если она существует):
... "homepage": "https://github.com/{your_repository}", "repository": { "type": "git", "url": "https://github.com/{your_repository}" }, "bugs": { "url": "https://github.com/{your_repository}/issues" }, ...
Настройте files
:
... "files": [ "dist", ], ...
Вы должны указать файлы, которые будут включены в node_modules
при установке вашей библиотеки. Обычно достаточно включить папку dist
.
Добавьте keywords
:
Ключевые слова — это массив строк, описывающих ваш пакет и используемых NPM для поиска и рекомендаций. Выберите слова, относящиеся к вашему пакету, которые, как вы ожидаете, люди будут использовать при поиске. Давайте создадим ключевые слова для нашей библиотеки sum
:
... "keywords": ["typescript", "math", "sum", "numbers", "arithmetic", "calculator", "calculation"] ...
Важно указать ваши технологии, потому что пользователи часто ищут такие термины, как «библиотека машинописных текстов для математики» или «выбор календаря React».
Создайте учетную запись NPM, если вы еще этого не сделали, и запустите npm login
в своем терминале; следуйте инструкциям для аутентификации вашей учетной записи. По умолчанию версия вашего пакета будет 1.0.0
; вы можете проверить это в файле package.json
. Я рекомендую изменить его на 0.0.1
.
Запустите npm publish
и все готово! Чтобы обновить версию в будущем, используйте команду npm version patch
для увеличения версии, а затем опубликуйте обновленный пакет с помощью npm publish
.
Как видите, создать свою собственную библиотеку очень просто! По сути, это все, что вам нужно для создания и поддержки пакета. Если вам сложно ограничить свою библиотеку с помощью microbundle
, я рекомендую использоватьrollup.js с более конкретной конфигурацией.
Создание пакетов NPM и участие в разработке открытого исходного кода — это полезный и ценный опыт для разработчиков всех уровней квалификации. Это позволяет вам поделиться своим кодом с сообществом, получить большой опыт и создать портфолио своих работ.