На днях мы столкнулись с небольшой проблемой в React Native, которую я решил превратить в эксперимент по созданию пакета NPM. Это общий обзор различных шагов, которые я предпринял в процессе.
Проблема заключалась в отображении читаемых объектов JS на реальном телефоне со сборкой, не предназначенной для разработки. В среде разработки обычно легко подключиться к таким инструментам, как встроенная отладка React Native, автономный React Native Debugger или сетевой инструмент, такой как Charles. Однако не было простого способа проверить объект в самом приложении. Поэтому для этого я создал новый компонент React Native.
DrillableObjectView
Я сопоставил внешний вид / цвета инспектора объектов Chrome, с которым мы все знакомы. Я не буду вдаваться в подробности о самом DrillableObjectView, но это рекурсивный компонент, который отображает дочерние DrillableObjectViews в зависимости от того, находится ли родительский объект в открытом состоянии. По сути, это вариант старого вопроса телефонного собеседования для реализации JSON.stringify или рекурсивного сглаживания массива.
Изначально я построил компонент локально в нашем основном приложении. Однако я пришел к выводу, что есть вероятность, что это может быть полезно другим, и решил включить его в свой собственный пакет NPM.
Пакет package.json
Вы найдете package.json
в любом модуле. Здесь хранится вся важная информация о пакете. Я часто смотрю на package.json других модулей, если начинаю сталкиваться с проблемами зависимости. Запуск npm init
поможет вам начать настройку файла package.json
.
Точка входа в пакет определяется из поля main
. Так что вы можете просто указать на index.js
или на другое место, где находится ваша отправная точка. В моем пакете я указываю на src/index.js
, что означает, что если я импортирую react-native-drillable-object-view
в другое приложение, например:
import SomeName from 'react-native-drillable-object-view';
SomeName
будет установлено значение, которое было экспортировано в src/index.js
.
Еще одно важное поле - это поле version
. Я бы посоветовал почитать о семантическом управлении версиями. Управление версиями важно для всех потребителей вашего модуля, поэтому внимательно следите за тем, как вы сталкиваетесь с опубликованными версиями, если вы не хотите сломать своих потребителей.
Зависимости
Управление зависимостями имеет решающее значение, если другие приложения собираются использовать ваш пакет. В прошлом я видел множество проблем, возникающих из-за невнимания к зависимостям. Вы заметите, что в моих package.json:
dependencies
, peerDependencies
и devDependencies
есть 3 типа.
Нормальные dependencies
- это то, что требуется для запуска вашего кода. peerDependencies
также являются обязательными, но являются ожидаемыми требованиями потребителя вашей упаковки.
Например, у меня react-native
указано как peerDependency
в react-native-drillable-object-view
. Мне нужно react-native
, чтобы запустить мой код. Однако DrillableObjectView
никогда не предназначен для самостоятельной работы. Он всегда предназначен для импорта внешним приложением React Native и запуска там. Можно с уверенностью сказать, что в любом приложении, которое импортирует мой пакет, уже будет react-native
, поэтому я указываю его как peerDependency
. Если бы я указал его как обычный dependency
, то использование моего пакета привело бы к установке двух версий react-native
в проекте потребителя. Очевидно, в этом нет необходимости.
lodash
- это пример обычного dependency
. Хотя приложение-потребитель уже может использовать lodash
, мы не можем быть уверены, что это так. Следовательно, мы хотим потребовать его в dependencies
.
devDependencies
проще понять. Если вы собираетесь разработать пакет и работать над ним, это все, что вам нужно. Как видите, у меня гораздо больше devDependencies
. В их число входят такие вещи, как eslint
и jest
. При разработке нам нужны такие вещи, как линтеры и тесты, которые будут полезны только во время разработки. Ни один из потребителей моего пакета, скорее всего, не захочет запускать eslint
или jest
в моем пакете. Следовательно, они не должны быть кем-либо, кроме devDependency
.
Настройка хуков
Ради меня самого, а также для сценария, когда кто-то еще работает над инструментами пакета, такими как линтеры и тесты, чрезвычайно полезны для поддержания чистоты кода и гарантии того, что что-то не сломается.
eslint
легко настроить и запустить. У меня даже есть команда eslint --init
, которая устанавливает для вас ваш .eslintrc
файл конфигурации, в котором вы можете указать определенные правила и т. Д.
Запускать вручную довольно просто. Однако я хотел быть более строгим и запускать его как хук prepush
до того, как ветка будет помещена в github. К счастью, husky
легко запустить. Он позволяет вам добавлять сценарии precommit
и prepush
в поле scripts
вашего package.json, поэтому я просто добавил линтер к этому сценарию prepush
, и все было в порядке.
Тесты
Хотя линтер предотвращает довольно много ошибок, я решил использовать эту возможность для изучения jest
и тестирования снимков. Я нашел эту статью весьма полезной. Настройка jest
была немного сложнее, чем lint, поскольку необходимо было установить ряд зависимостей, а также несколько параметров и вещей, которые нужно настроить с помощью babel.
Одно интересное замечание - опция snapshotSerializers
. Снимок - это, по сути, захваченное дерево DOM в текстовой форме. Если вы знаете, что компонент работает правильно, он позволяет вам сделать снимок визуализированного компонента и сравнить его с ранее созданным компонентом. Это почти что-то вроде визуального тестирования.
Если такое свойство, как цвет или поля, изменится, тест завершится неудачно, и эти различия будут выделены. Часто изменение может быть преднамеренным, но разработчик должен определить и сделать новый снимок. Определенно другой, но интересный подход к большинству тестов, которые я проводил в прошлом, где я больше использовал подход TDD. В этом стиле построил, а потом сделал снимок, когда он работает.
Сами тесты было легко написать, потому что вы позволяете снимку делать большую часть работы. Когда у меня было несколько из них для различных сценариев, я также добавил в свой хук prepush
выполнение jest
.
Издательский
Когда ваш пакет будет готов, опубликовать его с npm publish
будет довольно просто. Только не забудьте добавить версию своего пакета в package.json! Вы можете найти свой пакет на npm, например: https://www.npmjs.com/package/react-native-drillable-object-view
В этом посте я рассмотрел много высокоуровневого контента, и вам обязательно стоит углубиться в документацию, где это необходимо. Также не стесняйтесь использовать или вносить свой вклад в DrillableObjectView
.