логотип PurpleSchool
логотип PurpleSchool

Использование Vue Native для разработки мобильных приложений

Автор

Олег Марков

Введение

Разрабатывать мобильные приложения — задача, требующая оперативности и гибкости. Одно из популярных решений для быстрой кроссплатформенной разработки — Vue Native. Эта технология позволяет вам создавать мобильные приложения под iOS и Android, используя знакомый многим JavaScript-фреймворк Vue. Vue Native основан на связке Vue.js и React Native, сочетая преимущества обоих подходов: декларативную разработку интерфейсов и большую гибкость.

Вы легко сможете писать мобильные приложения на языке и с концепциями, которые уже знаете, если имели опыт с Vue. В статье я подробно расскажу, как начать работу с Vue Native, разберу архитектурные особенности, приведу примеры реального кода, объясню базовые и расширенные возможности, а также отмечу нюансы, которые важно учитывать.

Что такое Vue Native

Vue Native — это open source-фреймворк, который позволяет разрабатывать кроссплатформенные мобильные приложения на базе JavaScript, используя стиль написания компонентов во Vue. Под капотом он работает поверх React Native, а компоненты Vue преобразуются в компоненты React Native через bridge-слой.

Ключевые особенности

  • Позволяет писать мобильные приложения на Vue же синтаксисе
  • Кроссплатформенность: iOS и Android из одного кода
  • Использует богатую экосистему React Native для доступ к нативным возможностям
  • Поддерживает большинство привычных концепций Vue: data, methods, props, lifecycle hooks

Установка и базовая настройка проекта на Vue Native

Давайте пройдем пошагово процесс установки и запуска базового мобильного приложения на Vue Native. Ниже приведу инструкции, которые вы можете применять на практике.

Установка необходимых инструментов

Перед началом работы вам потребуется:

  • Node.js (рекомендуется LTS-версия)
  • npm или yarn
  • Expo CLI — инструмент для быстрой сборки и тестирования мобильных приложений

Установка Expo CLI

npm install -g expo-cli

Создание проекта Vue Native

expo init MyVueNativeApp
cd MyVueNativeApp
npm install vue-native-core vue-native-helper

Переключение шаблона на Vue Native

После этого добавьте файл App.vue в корень проекта, удалив стандартный App.js.

App.vue — основной компонент приложения.

Пример минимального App.vue

<template>
  <view>
    <text>Привет, мир из Vue Native!</text>
  </view>
</template>

<script>
export default {
  name: "App" // Имя компонента
}
</script>

<style>
view {
  flex: 1;
  justify-content: center;
  align-items: center;
}
text {
  font-size: 20px;
  color: #333;
}
</style>

// Здесь мы создаем самый простой компонент, который отображает строку текста посередине экрана

Запуск приложения

Для запуска используйте:

expo start

Вы сможете увидеть ваше приложение в эмуляторе или на реальном устройстве через Expo Go.

Основные компоненты и разметка во Vue Native

В Vue Native вы используете немного отличающийся набор компонентов по сравнению с веб-версией Vue. Основные компоненты для построения интерфейса предоставляются React Native (например, <view>, <text>, <image>), но применяются с Vue-синтаксисом.

Пример: Список элементов

<template>
  <view>
    <text>Ваши задачи:</text>
    <view v-for="(todo, i) in todos" :key="i">
      <text>{{ todo }}</text>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      todos: ["Проверить почту", "Позвонить другу", "Позаниматься спортом"]
    }
  }
}
</script>

// Здесь мы создаем список задач с помощью массива и директивы v-for, аналогично обычному Vue

Работа с данными и состоянием

Vue Native поддерживает реактивные данные (data), методы (methods), вычисляемые свойства (computed). Работа со состоянием максимально схожа с классическим Vue.

Пример: Кнопка счетчика

<template>
  <view>
    <text>Счетчик: {{ count }}</text>
    <button @press="increment">Увеличить</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count += 1 // Увеличиваем значение счетчика
    }
  }
}
</script>

// Здесь показана обработка события кнопки и изменение реактивного состояния

Работа с событиями

События в Vue Native немного отличаются. К примеру, вместо @click используется @press для кнопок (аналог onPress в React Native). Это связано с особенностями мобильных интерфейсов.

Навигация между экранами

Для организации переходов между экранами используется библиотека react-navigation, которая совместима с Vue Native.

Установка react-navigation

npm install @react-navigation/native
npm install @react-navigation/stack

Пример организации навигации

Создайте два компонента: Home.vue и Details.vue.

Home.vue

<template>
  <view>
    <text>Добро пожаловать!</text>
    <button @press="goToDetails">Перейти на детали</button>
  </view>
</template>

<script>
export default {
  methods: {
    goToDetails() {
      this.$navigator.navigate('Details') // Выполняем навигацию
    }
  }
}
</script>

Details.vue

<template>
  <view>
    <text>Это экран деталей</text>
  </view>
</template>

Добавление навигатора в App.vue

// В App.js или в основной точке входа приложения
import { NativeRouter, StackRouter } from 'vue-native-router'

// Создаем навигацию
export default {
  render(h) {
    return (
      <NativeRouter>
        <StackRouter>
          <screen name="Home" component={Home} />
          <screen name="Details" component={Details} />
        </StackRouter>
      </NativeRouter>
    )
  }
}

// Здесь мы добавили роутер, чтобы поддерживать переходы между экранами по мобильному принципу

Подключение внешних библиотек и работы с API

Поскольку Vue Native построен на React Native, большинство библиотек из React Native можно подключать напрямую.

Пример: Использование fetch для запросов

<template>
  <view>
    <button @press="loadUsers">Загрузить пользователей</button>
    <view v-for="user in users" :key="user.id">
      <text>{{ user.name }}</text>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      users: []
    }
  },
  methods: {
    async loadUsers() {
      // Делаем запрос к публичному API
      const response = await fetch("https://jsonplaceholder.typicode.com/users")
      const data = await response.json()
      this.users = data // Заполняем массив пользователей
    }
  }
}
</script>

// В этом примере показан запрос к внешнему API и отрисовка списка на экране

Использование стилей

В Vue Native вы описываете стили с помощью CSS-подобного синтаксиса, но с учетом специфики React Native (snake_case не поддерживается).

Пример оформления

<template>
  <view class="container">
    <text class="main-text">Привет!</text>
  </view>
</template>

<style>
.container {
  flex: 1;
  background-color: #f0f0f0;
  padding: 40px;
  justify-content: center;
  align-items: center;
}
.main-text {
  font-size: 22px;
  color: #0055aa;
  font-weight: bold;
}
</style>

// Используем классы для стилизации компонентов как в обычном Vue, но свойства пишем через дефис

Работа с устройством: доступ к камере, GPS, файлам

Подключение к нативным функциям мобильных устройств осуществляется через библиотеки React Native. Например, чтобы использовать камеру или доступ к файловой системе, подключайте соответствующие модули.

Пример: Получение разрешения на камеру

import * as Permissions from 'expo-permissions';

async function askCameraPermission() {
  const { status } = await Permissions.askAsync(Permissions.CAMERA)
  if (status === 'granted') {
    // Доступ к камере предоставлен
  } else {
    // Доступ запрещен
  }
}

// Для работы с камерой используются инструменты из Expo или сторонние библиотеки React Native

Особенности работы с Vue Native: ограничения и горящие вопросы

Трудности использования

  • Некоторые плагины Vue недоступны (например, Vue Router)
  • Не все Vue плагины совместимы, используйте только те, что не зависят от DOM-браузера
  • Интеграция с native-модулями требует знаний React Native

Преимущества и недостатки

Преимущества

  • Быстрая разработка мобильных приложений, если вы уже знакомы с Vue
  • Меньше времени на переобучение команды
  • Использование более читабельного и декларативного кода

Недостатки

  • Поддержка Vue Native со стороны сообщества ниже, чем у React Native
  • Некоторые фичи React Native недоступны из-за особенностей прослойки
  • Возможны баги/глюки при работе с очень специфичными нативными модулями

Заключение

Vue Native — это удобный инструмент для кроссплатформенной разработки мобильных приложений на знакомом синтаксисе Vue. Благодаря тесной интеграции с React Native, вы получаете доступ к возможностям нативных API и широкой экосистеме мобильных компонентов. Однако стоит помнить об особенностях и ограничениях: не весь функционал Vue доступен из коробки, а для сложных нативных интеграций может потребоваться опыт работы с React Native.

Если вам важна скорость прототипирования и повторное использование Vue-кода и концепций, а также работа с относительно стандартными мобильными задачами, Vue Native станет отличным выбором. Для более сложных кейсов с обилием нативных зависимостей лучше рассмотреть глубокое погружение в React Native или чистый натив.

Часто задаваемые технические вопросы по теме

1. Как добавить нативный модуль, которого нет в стандартных возможностях Vue Native?
Для этого можно установить и использовать любой модуль React Native через npm. После установки подключайте его в JS-коде и используйте согласно официальной документации React Native. Следите за тем, чтобы используемые модули не были строго заточены под React lifecycle — для их подключения может потребоваться обертка-адаптация.

2. Как обновить библиотеку vue-native-core и не потерять совместимость?
Перед обновлением создайте резервную копию проекта. Затем выполните npm update vue-native-core vue-native-helper. После обновления проверьте работоспособность ключевых функций, так как новые версии иногда содержат breaking changes. При появлении ошибок ищите issue на GitHub репозитории проекта — там часто публикуются обходные решения.

3. Что делать, если не работает v-model?
v-model работает не со всеми компонентами Vue Native. Если двусторонняя привязка не срабатывает, используйте явную обработку событий onChange или @input, чтобы вручную присваивать значения требуемым переменным. Например: html <input :value="text" @input="text = $event" />

4. Как подключить сторонние React Native UI-киты типа NativeBase или React Native Elements?
Сначала установите зависимость через npm, затем импортируйте нужные компоненты и используйте в шаблоне. Некоторые компоненты придется оборачивать, чтобы они корректно работали с Vue синтаксисом. Протестируйте рендеринг в Expo или эмуляторе.

5. Как деплоить Vue Native приложение в App Store или Google Play?
Собирайте проект через Expo (expo build:android и expo build:ios), далее следуйте стандартной инструкции публикации от Expo. Экспортируйте apk/ipa-файлы и загружайте в магазины согласно официальной документации App Store/Google Play.

Стрелочка влевоСоздание серверных приложений на Vue с помощью Nuxt jsОрганизация и управление индексной страницей в проектах VueСтрелочка вправо

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийИнтеграция Vue с PHP для создания динамичных веб-приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueСоздание и работа с дистрибутивом build dist Vue приложенийИнтеграция Vue.js с Django для создания полноценных веб-приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueПрименение v-bind для динамической привязки атрибутов в VueСоздание и использование UI Kit для Vue приложенийУправление пользователями и их данными в Vue приложенияхТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование v for и slot в VueИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsОптимизация производительности и предупреждения в Vue
Открыть базу знаний