Фреймворк Quasar предоставляет единый слой абстракции для взаимодействия с нативными API различных платформ: браузера, мобильных устройств и настольных приложений. Это достигается за счёт интеграции с такими технологиями, как Cordova, Capacitor и Electron, что позволяет использовать аппаратные возможности устройства без необходимости писать платформенно-зависимый код.
Доступ к нативным функциям реализуется через:
Ключевой принцип — один и тот же API для разных платформ.
Quasar включает набор встроенных плагинов, упрощающих доступ к базовым возможностям:
Отслеживание состояния приложения (активно/свернуто):
import { AppVisibility } from 'quasar'
AppVisibility.addEventListener(state => {
console.log('Состояние приложения:', state)
})
Определение текущей платформы:
import { Platform } from 'quasar'
if (Platform.is.mobile) {
console.log('Запуск на мобильном устройстве')
}
if (Platform.is.electron) {
console.log('Electron окружение')
}
Доступ к параметрам экрана:
import { Screen } from 'quasar'
if (Screen.lt.md) {
console.log('Маленький экран')
}
Quasar CLI позволяет создавать проекты с поддержкой мобильных платформ:
quasar mode add capacitor
или:
quasar mode add cordova
После этого становится доступным использование нативных API через плагины.
Пример использования камеры через Capacitor:
npm install @capacitor/camera
npx cap sync
import { Camera, CameraResultType } from '@capacitor/camera'
async function takePhoto () {
const image = await Camera.getPhoto({
quality: 90,
resultType: CameraResultType.Uri
})
console.log(image.webPath)
}
Особенности:
Доступ к координатам пользователя:
npm install @capacitor/geolocation
npx cap sync
import { Geolocation } from '@capacitor/geolocation'
async function getLocation () {
const position = await Geolocation.getCurrentPosition()
console.log(position.coords.latitude, position.coords.longitude)
}
Важно:
Пример чтения и записи файлов:
npm install @capacitor/filesystem
npx cap sync
import { Filesystem, Directory } from '@capacitor/filesystem'
async function writeFile () {
await Filesystem.writeFile({
path: 'example.txt',
data: 'Пример текста',
directory: Directory.Documents
})
}
Подключение уведомлений:
npm install @capacitor/push-notifications
npx cap sync
import { PushNotifications } from '@capacitor/push-notifications'
PushNotifications.requestPermissions().then(result => {
if (result.receive === 'granted') {
PushNotifications.register()
}
})
PushNotifications.addListener('registration', token => {
console.log('Токен:', token.value)
})
При использовании Cordova API доступен через глобальный объект:
document.addEventListener('deviceready', () => {
console.log('Cordova готов')
})
Пример работы с вибрацией:
cordova plugin add cordova-plugin-vibration
navigator.vibrate(1000)
В режиме Electron Quasar даёт доступ к Node.js API:
const fs = require('fs')
fs.writeFileSync('test.txt', 'Hello Electron')
Также можно использовать IPC (межпроцессное взаимодействие):
const { ipcRenderer } = require('electron')
ipcRenderer.send('message', 'данные')
Boot-файлы используются для настройки и подключения нативных возможностей:
quasar new boot my-native-api
export default async () => {
// инициализация API
}
Регистрация в quasar.config.js:
boot: ['my-native-api']
На мобильных устройствах доступ к API требует явного разрешения:
import { Geolocation } from '@capacitor/geolocation'
const permissions = await Geolocation.checkPermissions()
if (permissions.location !== 'granted') {
await Geolocation.requestPermissions()
}
Особенности:
Одна из ключевых задач Quasar — скрыть различия платформ:
import { Platform } from 'quasar'
function vibrate () {
if (Platform.is.capacitor || Platform.is.cordova) {
navigator.vibrate(500)
}
}
Изоляция платформенного кода
function getCamera () {
if (!Platform.is.mobile) return null
return Camera
}
Асинхронная обработка
Все нативные API работают через Promise:
try {
const data = await someNativeCall()
} catch (e) {
console.error(e)
}
Graceful degradation
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(...)
} else {
console.log('Геолокация недоступна')
}
Кэширование данных
let cachedPosition = null
async function getPosition () {
if (cachedPosition) return cachedPosition
cachedPosition = await Geolocation.getCurrentPosition()
return cachedPosition
}
console.log и платформенные инструментыРекомендуется:
Пример структуры:
src/
├── boot/
├── services/
│ ├── camera.js
│ ├── location.js
│ └── filesystem.js
// src/services/camera.js
import { Camera, CameraResultType } from '@capacitor/camera'
export async function takePhoto () {
return await Camera.getPhoto({
quality: 80,
resultType: CameraResultType.Uri
})
}
Возможна разработка собственных нативных расширений:
| API | Web | Android | iOS | Electron |
|---|---|---|---|---|
| Камера | частично | да | да | нет |
| Геолокация | да | да | да | да |
| Файловая система | ограничено | да | да | да |
| Push | нет | да | да | да |
document.addEventListener('pause', () => {
console.log('Приложение свернуто')
})
document.addEventListener('resume', () => {
console.log('Приложение активно')
})
jest.mock('@capacitor/geolocation', () => ({
Geolocation: {
getCurrentPosition: jest.fn()
}
}))