написать впереди
делаетreact-native
npm install
Итак, сегодня я использую один, разработанный мной вios
а такжеandroid
общийCardView
Взяв в качестве примера компоненты, давайте поговорим о том, как разработать собственный компонент, открыть его исходный код на github и опубликовать в npm.
описание
мой компонент называетсяreact-native-rn-cardview. Если это появляется в учебникеreact-native-cardview
Имена компонентов имеют одинаковое значение.
1. Создайте и внедрите
1.1 Создание проекта шаблона пользовательского компонента
1.1.1 Установкаreact-native-create-library
$ npm install -g react-native-create-library
1.1.2 Создание шаблона проекта
мы используем командуreact-native-create-library
Создайте проект и укажите платформу какios,android
Уточнитьandroid
серединаpackage
, другие параметры могут относиться кreact-native-create-libraryсуществуетgithub
Документация по вышеизложенному, я не буду здесь вдаваться в подробности.
$ react-native-create-library --package-identifier com.quenice.cardview --platforms android,ios cardview
Давайте переименуем проект
$ mv cardview react-native-cardview
Некоторые люди могут сказать, почему арендодатель не генерируетreact-native-cardview
cardview
Переименовать еще раз. На самом деле это небольшая хитрость, т.к.react-native-create-library
Для производственных проектов некоторые имена или классы, связанные с компонентами, будут добавлены по умолчанию.react-native
илиRN
приставка.
Например, если ваше исходное имя проектаreact-native-card-view
,Такpackage.json
Компонент определяется имяreact-native-react-native-card-view
, соответствующий класс, определенный в модуле Android, будетRNReactNativeCardviewModule.java
, что явно некрасиво.
хорошо, продолжим.
Текущая структура каталогов:
$ tree
└── react-native-cardview
├── README.md
├── android
│ ├── build.gradle
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── com
│ └── reactlibrary
│ ├── RNCardviewModule.java
│ └── RNCardviewPackage.java
├── index.js
├── ios
│ ├── RNCardview.h
│ ├── RNCardview.m
│ ├── RNCardview.podspec
│ ├── RNCardview.xcodeproj
│ │ └── project.pbxproj
│ └── RNCardview.xcworkspace
│ └── contents.xcworkspacedata
└── package.json
После создания компонентного проекта вы можете начать запись кода реализации
2 Напишите код
Написание кода разделено на три части: одна часть — собственный код Android, одна часть — собственный код iOS, а одна часть — код реакции (или javascript). из-заreact-native-cardviewЭто касается только нативных модулей Android, поэтому в этой статье пока не рассматривается разработка нативных модулей iOS.Если вам интересно, я могу открыть другую статью, чтобы поговорить о нативных модулях iOS.
2.1 Написать собственный модуль Android
Для написания собственного кода Android обычно требуются следующие три класса:
2.1.1 RNxxxModule
Основная функция этого класса — определить собственное имя модуля, которое можно передать непосредственно в javascript.React.NativeModules.xxx
посетить, гдеxxx
вRNxxxModule
Определяется в классеgetName
возвращаемое значение метода. Ниже приведены мои компонентыreact-native-cardviewКласс модуля в
package com.quenice.reactnative;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
public class RNCardViewModule extends ReactContextBaseJavaModule {
private final ReactApplicationContext reactContext;
public RNCardViewModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
@Override
public String getName() {
return "RNCardView";
}
}
2.1.2 RNxxxManager
Класс менеджера в основном является нативной реализацией компонента, и отображает свойства реактивного компонента к нативными свойствами
package com.quenice.reactnative;
import android.graphics.Color;
import android.support.v7.widget.CardView;
import android.view.View;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.view.ReactViewGroup;
public class RNCardViewManager extends ViewGroupManager<CardView> {
@Override
public String getName() {
return "RNCardView";
}
@Override
protected CardView createViewInstance(ThemedReactContext reactContext) {
CardView cardView = new CardView(reactContext);
cardView.setUseCompatPadding(true);
cardView.setContentPadding(0, 0, 0, 0);
ReactViewGroup reactViewGroup = new ReactViewGroup(reactContext);
cardView.addView(reactViewGroup);
return cardView;
}
@ReactProp(name = "cardElevation", defaultFloat = 0f)
public void setCardElevation(CardView view, float cardElevation) {
view.setCardElevation(PixelUtil.toPixelFromDIP(cardElevation));
}
...
}
2.1.3 RNxxxPackage
Главный модуль пакета для регистрации натурального, реализации нативного компонента, который зарегистрирован выше и класс Module Manager
package com.quenice.reactnative;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
public class RNCardViewPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new RNCardViewModule(reactContext));
}
// Deprecated from RN 0.47
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Arrays.<ViewManager>asList(new RNCardViewManager());
}
}
2.2 iOS написана на родном коде
react-native-cardview
iOS
react-native
серединаshadow
Связанные свойства могут быть реализованы, поэтому в этой статье они пока не рассматриваются.
2.3 Написать код Reactnative
Хорошо написанandroid/iOS
После нативного модуля нужно написатьjavascript
код для мостаreact-native
с нативными модулями.
import PropTypes from 'prop-types';
import {requireNativeComponent, View} from 'react-native';
const iface = {
name: 'CardView',
propTypes: {
cardElevation: PropTypes.number,
maxCardElevation: PropTypes.number,
backgroundColor: PropTypes.string,
radius: PropTypes.number,
...View.propTypes, // include the default view properties
},
};
module.exports = requireNativeComponent('RNCardView', iface);
3 Загрузка кода и выпуск компонента
3.1 Загрузите код на github
После написания кода нам нужно загрузить его на Github, а затем нужно использовать адрес github кода при публикации компонента в NPM.
. Если вы еще не выполнили настройку, связанную с github, вы можете обратиться к другой моей статье:Установите и настройте соединение Git GitHub
Выполните следующую команду для синхронизации кода к репозитории, соответствующему вашему GitHub:
$ git add .
$ git commit -a -m "initial commit"
$ git push -u origin master
После синхронизации вы можете зайти на github, чтобы посмотреть, прошел ли пуш успешно:
https://github.com/YourGithubAccount/YourRepository
3.2 Выпуск компонента
После разработки компонента я хочу передать его в другие проекты (или предоставить другим для установки и использования)npm install
Способ установки ваших компонентов, ваша сборка должна быть опубликована в реестре npm.
3.2.1 npm registry
что такое реестр npm
Проще говоря, реестр npm эквивалентен реестру пакетов. Он управляет различными подключаемыми модулями, выпущенными разработчиками по всему миру, и разработчики могутnpm install
способ установки необходимых плагинов.
Официальный реестр npm:registry.npmjs.org/
Быстрее быстрее как:registry.npm.taobao.org/
Проверить
$ npm config get registry
переключать
Конечно, текущий реестр npm можно переключить с помощью команды
# 全局切换
$ npm config set registry http://registry.npmjs.org/
Иногда вам может понадобиться временно переключиться при выполнении определенной команды npm, на этот раз вы можете использовать--registry
Чтобы указать реестр для временного переключения, например публикации в npm
$ npm publish --registry http://registry.npmjs.org/
Можно временно назначить, конечно, после окончания выполнения команды реестр все равно вернется в исходный реестр
3.2.2 Создание/вход в учетную запись реестра npm
Чтобы публиковать компоненты в реестре npm, вы должны быть зарегистрированным пользователем реестра npm через:
$ npm adduser
чтобы добавить пользователя, или вы ужеОфициальный сайтЗарегистрированный пользователь может пройти:
$ npm login
для входа в учетную запись реестра npm.
Чтобы подтвердить, создаете ли вы / успешно посадите реестр npm, используйте следующие два способа.
- Заказ
$ npm whoami
Подтвердите, успешен ли локальный вход в систему и успешна ли аутентификация - открыть онлайнnpmjs.com/~usernameПроверьте, успешно ли создана учетная запись
3.2.3 Подготовка перед выпуском
3.2.3.1 .gitignore и .npmignore
- существует.gitignoreОпределите, какие файлы не загружаются на github в
- существует.npmignoreКакие файлы не упаковываются при выпуске?
- Если есть.gitignoreно ни один.npmignoreфайл, затем.gitignoreможет действовать как.npmignoreроль
- Для ознакомления с конкретными правилами см.:npm-developers, .gitignore or .npmignore pattern rules
3.2.3.2 package.json
Файл package.json определяет всю опубликованную информацию, включая: имя компонента, версию, автора, описание, зависимости и другую ключевую информацию. Для получения подробной информации см.Working with package.json
Нижеreact-native-cardviewСодержимое файла package.json:
{
"name": "react-native-rn-cardview",
"version": "1.0.0",
"description": "A ReactNative CardView Component for android and iOS",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"react-native",
"react-component",
"react-native-component",
"react",
"mobile",
"ios",
"android",
"cardview"
],
"author": {
"name": "quenice",
"email": "qiubing.it@gmail.com"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "git@github.com:quenice/react-native-cardview.git"
},
"devDependencies": {
"react": "^16.2.0",
"react-native": "^0.53.0"
},
"peerDependencies": {
"react": "^16.2.0"
},
"dependencies": {
"prop-types": "^15.6.0"
}
}
3.2.3.3 Запись файла readme.md
Способы использования компонентов и меры предосторожности подробно описаны в файле readme.md. Обычно пишется в синтаксисе Markdown
3.2.4 Выпуск
После того, как вышеуказанные приготовления сделаны, вы можете опубликовать его. Здесь следует отметить, что первый выпуск отличается от последующего выпуска обновления.
Первый выпуск
Для первого выпуска выполните команду напрямую:
$ npm publish
Это сделано, вы можете проверить онлайн, чтобы убедиться, что выпуск прошел успешно. Перейдите по ссылке (
Эй, эта лошадь плюс .com/package/
Посмотрите, есть ли уже контент, и если контент есть, значит, релиз прошел успешно.
выпуск обновления
Если это не первый выпуск, необходимо выполнить две команды
$ npm version <update_type>
$ npm publish
$ npm version
Команда используется для автоматического обновления номера версии,update_type
Значение имеетpatch ``minor ``major
. Так что в каких сценариях вы выбираете то, чтоupdate_type
Шерстяная ткань? См. таблицу ниже
update_type | Сцены | Правила номера версии | Пример |
---|---|---|---|
- | Первый выпуск | Номер версии 1.0.0 | 1.0.0 |
path | При исправлении ошибок и мелких изменениях | Инкрементные изменения из 3-й цифры номера версии | 1.0.0 -> 1.0.1 |
minor | Когда новая функция запущена и не влияет на существующие функциональные модули текущей версии | Инкрементальные изменения со 2-й цифры номера версии | 1.0.3 -> 1.1.3 |
major | Когда запускается несколько новых функциональных модулей, которые повлияют на существующие функции текущей версии. | Инкрементальные изменения с первой цифры номера версии | 1.0.3 -> 2.0.0 |
Уведомление
Если первый номер версии выпуска не 1.0.0, то$ npm version <update_type>
Обновление сообщит об ошибке, потому что вы не следовали его согласованным правилам версии, в настоящее время вы можете вручную изменитьpackage.json
серединаversion
Поле представляет собой номер версии, которая соответствует согласованным правилам, а затем выполняется напрямую.$ npm publish
Вы можете, а затем вы можете использовать его непосредственно в следующий раз, когда будете постепенно обновляться.$ npm version <update_type>
способ автоматического обновления номера версии
4 теста
Процесс сборки от разработки до финального релиза, необходимость постоянно тестировать на функциональную целостность, тогда как это тестировать?
4.1 Создайте реактивный проект
Сначала мы создаем реактивный проект с именем example.
$ react-native init example
example
Каталог проекта можно объединить с каталогом проекта компонента.react-native-cardview
Тот же уровень, конечно, вы также можете разместить его в любом месте, где вы хотите.Здесь, для удобства работы, мы поместили два каталога в каталог одного уровня. То есть текущий каталог выглядит так
$ tree
.
├── example
└── react-native-cardview
Затем все, что нам нужно сделать, это установить локальные или опубликованные компоненты наexample
тест в проекте
4.2 Локальное тестирование кода
Прежде чем компонент будет выпущен, мы можем напрямую установить нативный код наexample
Есть несколько способов тестирования в проекте
4.2.1 yarn link
$ cd react-native-cardview
$ yarn link
$ cd ../example
$ yarn link react-native-cardview
$ react-native link react-native-cardview
Пару очков:
-
yarn link
заключается в том, чтобы зарегистрировать локальный код в текущем каталоге с помощью пряжи какreact-native-cardview
Локальный компонент , имя компонентаreact-native-cardview
На самом деле, согласноpackage.json
серединаname
Значение поля исходит из имени каталога, но оно точно равно имени каталога. -
yarn link react-native-cardview
Команда состоит в том, чтобы поместить этот локальный компонентreact-native-cardview
установлен наexample
проект, вы можетеexample/node_modules
найти этот компонент в -
react-native link react-native-cardview
Это должен знать каждый, просто сделай этоandroid/iOS
Ссылка на нативный модуль - фактически
yarn link
Проще говоря, этот метод заключается в выполненииsymbol link
, то есть,example/node_modules/react-native-cardview/
Содержимое каталога указывает наreact-native-cardview/
Содержимое каталога вы меняетеreact-native-cardview/
Код в каталоге эквивалентен прямому изменениюexample/node_modules/react-native-cardview/
Код в этом каталоге, так что цель изменения кода компонента и просмотра эффекта может быть достигнута.
4.2.2 Настройте локальный путь в package.json
прямо вexample
изpackage.json
увеличить вdependencies
example/package.json
{
"name":"example",
...
"dependencies": {
"react-native": "^0.55.4",
"react-native-cardview":"file:../react-native-cardview",
...
}
...
}
затем выполнить
$ react-native link react-native-cardview
а такжеyarn link
то же самое, это эквивалентно выполнениюsymbol link
Прямая модификацияreact-native-cardview/
Код в каталоге эквивалентен прямому изменениюexample/node_modules/react-native-cardview/
код в этом каталоге
4.2.3 Прямое копирование нативного кода
Этот метод относительно прост и груб, просто скопируйте напрямуюreact-native-cardview/
Содержимое каталога дляexample/node_modules/react-native-cardview/
в этом каталоге
$ cp -rf react-native-cardview/ example/node_modules/
затем выполнить
$ react-native link react-native-cardview
Недостатком этого метода является то, что каждый разreact-native-cardview/
После завершения кода вам нужно обрабатывать копию наexample/node_modules/react-native-cardview/
4.3 Проверка загруженного/опубликованного кода
Компоненты, которые были загружены на github или опубликованы в реестре npm, можно протестировать так же, как мы обычно устанавливаем сторонний компонент.
4.3.1 Через гитхаб
Добавьте свой код и загрузите его в репозиторий github через git, после чего вы сможете напрямую передатьnpm install
Чтобы установить ваши компоненты
npm install --save https://github.com/quenice/react-native-cardview.git
или
npm install --save git@github.com:quenice/react-native-cardview.git
Примечание: замените указанное выше на свой собственный URL-адрес на ghthub.HTTPS
илиSSH
затем выполнить
$ react-native link react-native-rn-cardview
4.3.2 Через нпм
Этот способ ничем не отличается от следующих сторонних компонентов.
$ npm install --save react-native-rn-cardview
затем выполнить
$ react-native link react-native-rn-cardview
Эпилог
До сих порreact-native
компонент завершенdev-тест-выпускЖизненный цикл завершен.
Потому что это комбинация компонентов, разработанных мнойreact-native-rn-cardviewФактический процесс разработки, поэтому неизбежно, что будут упущения, и должно быть много недостатков. Если у вас есть какие-либо вопросы или вы нашли какие-либо ошибки, пожалуйста, оставьте мне сообщение в области комментариев, и мы обсудим и решим их вместе.
Еслиreact-native
нужно использоватьCardView
Да, добро пожаловать в использованиеreact-native-rn-cardview