Плагины для устройств в экосистеме Quasar представляют собой обёртки над нативными возможностями мобильных платформ, браузера или настольных сред. Они позволяют работать с аппаратными функциями устройства через единый API, независимо от целевой платформы: SPA, PWA, Cordova, Capacitor или Electron.
Quasar не реализует доступ к устройствам самостоятельно — он интегрируется с такими решениями, как Cordova и Capacitor, предоставляя удобный слой взаимодействия внутри Vue-приложения.
Работа с устройствами начинается с выбора режима сборки:
Добавление режима:
quasar mode add capacitor
или:
quasar mode add cordova
После этого становятся доступны API соответствующей платформы.
В Quasar плагины устройств обычно подключаются через:
Пример boot-файла:
// src/boot/device.js
import { boot } from 'quasar/wrappers'
import { Device } from '@capacitor/device'
export default boot(async ({ app }) => {
const info = await Device.getInfo()
app.config.globalProperties.$deviceInfo = info
})
Регистрация в quasar.config.js:
boot: ['device']
Capacitor — современный инструмент для доступа к нативным функциям.
Установка:
npm install @capacitor/core @capacitor/cli
npx cap init
Добавление платформ:
npx cap add android
npx cap add ios
import { Device } from '@capacitor/device'
const info = await Device.getInfo()
console.log(info)
Доступные данные:
import { Camera, CameraResultType } from '@capacitor/camera'
const photo = await Camera.getPhoto({
resultType: CameraResultType.Uri
})
Ключевые параметры:
quality — качество изображенияallowEditing — разрешение редактированияsource — камера или галереяimport { Geolocation } from '@capacitor/geolocation'
const position = await Geolocation.getCurrentPosition()
Доступ:
import { Preferences } from '@capacitor/preferences'
await Preferences.set({
key: 'username',
value: 'admin'
})
const { value } = await Preferences.get({ key: 'username' })
import { Haptics, ImpactStyle } from '@capacitor/haptics'
await Haptics.impact({ style: ImpactStyle.Medium })
Cordova использует плагины из репозитория:
cordova plugin add cordova-plugin-camera
Доступ через глобальный объект:
navigator.camera.getPicture(success, error, options)
В Quasar рекомендуется оборачивать такие вызовы в boot-файлы для унификации.
| Характеристика | Capacitor | Cordova |
|---|---|---|
| Архитектура | Современная | Устаревающая |
| API | Promise-based | Callback-based |
| Поддержка Vue | Отличная | Ограниченная |
| Плагины | Новые + совместимые | Огромная база |
Для доступа к устройствам требуется разрешение пользователя.
Пример (геолокация):
const permission = await Geolocation.requestPermissions()
Результат:
{
"location": "granted"
}
AndroidManifest.xmlInfo.plist<script setup>
import { Camera } from '@capacitor/camera'
const takePhoto = async () => {
const photo = await Camera.getPhoto({
resultType: 'uri'
})
}
</script>
Часто используется вместе с компонентами:
QBtn — вызов функций устройстваQDialog — запрос разрешенийQImg — отображение изображений с камерыПример:
<q-btn label="Сделать фото" @click="takePhoto" />
try {
const photo = await Camera.getPhoto()
} catch (err) {
console.error('Ошибка камеры', err)
}
Типичные ошибки:
Quasar предоставляет утилиту:
import { Platform } from 'quasar'
if (Platform.is.capacitor) {
// мобильная среда
}
if (Platform.is.electron) {
// desktop
}
if (Platform.is.mobile) {
useCamera()
} else {
uploadFile()
}
Для оптимизации:
const { Camera } = await import('@capacitor/camera')
Создание собственного плагина:
npx cap plugin:generate
Структура:
android/ios/web/Пример метода:
export interface MyPlugin {
echo(options: { value: string }): Promise<{ value: string }>
}
npx cap open android
1. Сканер QR-кодов
2. Фото профиля
3. Отслеживание маршрута
4. Push-уведомления
Пример:
export function useCamera() {
const takePhoto = async () => {
const { Camera } = await import('@capacitor/camera')
return await Camera.getPhoto()
}
return { takePhoto }
}
Популярные плагины:
В режиме Electron доступ к устройствам осуществляется через Node.js API:
const { desktopCapturer } = require('electron')
Данные устройств часто сохраняются в:
Пример:
const store = useDeviceStore()
store.setLocation(position)
Работа с устройствами всегда асинхронная:
Интеграция с реактивностью:
const location = ref(null)
location.value = await Geolocation.getCurrentPosition()
src/
├─ boot/
│ └─ device.js
├─ composables/
│ └─ useCamera.js
├─ services/
│ └─ deviceService.js
Такой подход обеспечивает: