Работа с третьими сторонами в приложении create-реакции-приложение с реагированием-native-web
Мы пытаемся использовать одни и те же компоненты React как в мобильных (response-native), так и в веб (create-реагировать-приложение).
До сих пор это работает довольно хорошо благодаря response-native-web (конфигурация ниже).
Однако response-native-vector-icons, которые мы широко используем в проекте Reaction-native, не компилируется с response-native-web. Это означает, что любой компонент, который использует компонент с векторными значками, также нуждается в определенной веб-версии. Наличие определенных версий веб-компонентов обеспечивает обслуживание.
Есть ли известный способ, без необходимости извлекать конфигурацию создания-реагирования-приложения, для работы с третьими сторонами, такими как реагировать-нативные-векторные иконки в сети?
import {createIconSetFromIcoMoon} from "react-native-vector-icons";
import Font from './Font.json';
export default createIconSetFromIcoMoon(UbeyaFont);
Вещи, о которых мы думали до сих пор: в настоящее время мы рассматриваем две идеи:
Экологический импорт:
# Pseudo code: # if mobile import this, otherwise import that.
Мы не уверены, возможен ли такой динамический импорт
Конфигурация веб-пакета, которая вставляется в node_modules / реагировать-скрипты. Не элегантно, но с глотком часов, которые у нас есть в любом случае, мы можем убедиться, что конфигурация всегда там.
Любые идеи или мысли приветствуются.
Конфигурация: Мы создали новый частный пакет NPM, который содержит все компоненты React, и, используя gulp watch, который копирует пакет как в мобильные, так и в веб-проекты, мы избавляемся от необходимости постоянно публиковать и загружать npm во время разработки (единственный недостаток Webstorm - процесс индексации).
1 ответ
В итоге мы использовали скрипт gulp для перезаписи веб-пакета. Этапы:
1) Сборка сменных пакетов
Мы создали веб-версию для каждой третьей стороны React Native. Для реакций-нативных векторных иконок это оказалось довольно просто:
import React from 'react';
export const Icon = (props) => <div className="material-icons"
style={{color:props.color}}>
{props.name}
</div>;
export default Icon;
2) Настройте конфигурацию Webpack
Используя gulp, мы перезаписываем конфигурацию веб - пакета create - Reaction -app следующим образом:
resolve: {
modules: ...
alias: {
"babel-runtime": path.dirname(
require.resolve("babel-runtime/package.json")
),
"react-native": "@ourcompany/react-native-web",
"react-native-vector-icons": "@ourcompany/react-native-vector-icons",
...
Скрипт задачи gulp:
gulp.task("copyWebpack", function() {
return gulp
.src(["package.json", "src/_webpack/*.js"])
.pipe(
gulp.dest(
path.resolve(pathWeb + "/node_modules/react-scripts/config")
)
);
});
Замечания:
- Удаление конфигурации create-реагировать на приложение является более чистым, однако это означает, что вам нужно будет поддерживать конфигурацию, и мы предпочли оставить конфигурацию как есть и перезаписать ее во время процесса сборки.
- Вы могли заметить, что мы перезаписали саму реакцию-нативную сеть. Подробнее об этом в следующем необязательном шаге.
3) Расширить реактивную нативную сеть (опционально)
Если вы используете компоненты, которые реактив-native-web еще не поддерживает, вам следует создать пакеты для них и расширить реактив-native-web, чтобы ваша веб-версия работала. Просто создайте новый пакет @ yourcompany / react -native-web и сгенерируйте index.js, в который импортируются компоненты, которые существуют в Reaction-native-web, и ссылаются на созданные вами. Обратите внимание, что когда мы создавали наш проект response-native-web, у него не было FlatList или SectionList, а теперь (октябрь 2018 г.) они имеют оба (модальный по-прежнему отсутствует:-)).
import {
StyleSheet as _StyleSheet,
View as _View,
Text as _Text,
Image as _Image,
I18nManager as _I18nManager,
AsyncStorage as _AsyncStorage,
Platform as _Platform,
Linking as _Linking,
ActivityIndicator as _ActivityIndicator,
ListView as _ListView,
Modal as _Modal,
Picker as _Picker,
RefreshControl as _RefreshControl,
TextInput as _TextInput,
Touchable as _Touchable,
TouchableHighlight as _TouchableHighlight,
TouchableNativeFeedback as _TouchableNativeFeedback,
TouchableOpacity as _TouchableOpacity,
TouchableWithoutFeedback as _TouchableWithoutFeedback,
Dimensions as _Dimensions,
Animated as _Animated,
ScrollView as _ScrollView,
SafeAreaView as _SafeAreaView,
BackHandler as _BackHandler,
Switch as _Switch,
NetInfo as _NetInfo,
AppState as _AppState,
ColorPropType as _ColorPropType,
} from 'react-native-web';
import {SectionList as _SectionList} from './SectionList';
import {FlatList as _FlatList} from './FlatList';
import {Alert as _Alert} from './Alert';
import {WebView as _WebView} from './WebView';
import {Share as _Share} from './Share';
import {PermissionsAndroid as _PermissionsAndroid} from './PermissionsAndroid';
import {ActionSheetIOS as _ActionSheetIOS} from './ActionSheetIOS';
import {ToastAndroid as _ToastAndroid} from './ToastAndroid';
export const StyleSheet = _StyleSheet;
export const View = _View;
export const Text = _Text;
export const Image = _Image;
export const I18nManager = _I18nManager;
export const AsyncStorage = _AsyncStorage;
export const Platform = _Platform;
export const Linking = _Linking;
export const ActivityIndicator = _ActivityIndicator;
export const ListView = _ListView;
export const Modal = _Modal;
export const Picker = _Picker;
export const RefreshControl = _RefreshControl;
export const TextInput = _TextInput;
export const Touchable = _Touchable;
export const TouchableHighlight = _TouchableHighlight;
export const TouchableNativeFeedback = _TouchableNativeFeedback;
export const TouchableOpacity = _TouchableOpacity;
export const TouchableWithoutFeedback = _TouchableWithoutFeedback;
export const Dimensions = _Dimensions;
export const Animated = _Animated;
export const ScrollView = _ScrollView;
export const SafeAreaView = _SafeAreaView;
export const BackHandler = _BackHandler;
export const Switch = _Switch;
export const NetInfo = _NetInfo;
export const AppState = _AppState;
export const Alert = _Alert;
export const Share = _Share;
export const WebView = _WebView;
export const PermissionsAndroid = _PermissionsAndroid;
export const ActionSheetIOS = _ActionSheetIOS;
export const ToastAndroid = _ToastAndroid;
export const SectionList = _SectionList;
export const FlatList = _FlatList;
export const ColorPropType = _ColorPropType;