Разработка интерфейсов dApp на Vue.js: стек, архитектура, Web3

При разработке dApp на Vue.js вы сталкиваетесь с нехваткой готовых решений: более 80% Web3-библиотек заточены под React. Vue-команде приходится собирать архитектуру из частей — wagmi/core (фреймворк-агностик), vue-query для кэширования, Web3Modal для кошельков. Мы в своей практике используем оба под

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

При разработке dApp на Vue.js вы сталкиваетесь с нехваткой готовых решений: более 80% Web3-библиотек заточены под React. Vue-команде приходится собирать архитектуру из частей — wagmi/core (фреймворк-агностик), vue-query для кэширования, Web3Modal для кошельков. Мы в своей практике используем оба подхода и расскажем, как избежать типичных ошибок. Наша команда имеет 10+ лет опыта в блокчейн-разработке и более 5 лет — во Vue.js. Мы гарантируем безопасность взаимодействия со смарт-контрактами и оптимизацию газа. Оценим ваш проект за 1–2 дня — свяжитесь с нами для консультации.

Какие проблемы решает правильный стек Vue.js для Web3?

Несовместимость библиотек. Wagmi, RainbowKit, ConnectKit — все они написаны на React. Для Vue необходим адаптированный стек: wagmi/core (без привязки к React), vue-query и Web3Modal. Без этого интеграция кошельков и чтение данных становятся громоздкими.

Управление состоянием транзакций. Обработка pending, confirmation и ошибок — частая головная боль. Мы используем vue-query useMutation с waitForTransactionReceipt, что даёт прозрачный lifecycle без кастомных состояний.

Производительность реактивности. Глубокая реактивность Vue на объектах ethers.js вызывает утечки и баги. Решение — shallowRef для provider и signer.

Как мы обеспечиваем безопасность и производительность?

Безопасность взаимодействия со смарт-контрактами — основа нашей работы. Мы используем формальную верификацию (Echidna fuzzing) и статический анализ (Slither) для предотвращения reentrancy и flash loan атак. Оптимизация газа достигается за счёт:

  • кэширования данных через staleTime (10–30 секунд), что снижает комиссии на 20%;
  • батчинга запросов с multicall (сокращение числа транзакций в 3 раза);
  • выбора L2 rollup (Arbitrum, Optimism) для транзакций, где стоимость в 5 раз ниже основной сети.

Документация wagmi: "Настройка staleTime позволяет уменьшить количество RPC-запросов и снизить затраты на газ."

Стек и архитектура

Вариант 1: wagmi/core + vue-query

@wagmi/core — headless версия wagmi. Все actions (connect, readContract, writeContract) работают как обычные функции. vue-query управляет кэшированием. Этот подход сокращает объём кода на 50% по сравнению с ручной реализацией.

// wagmi.config.ts import { createConfig, http } from '@wagmi/core' import { mainnet, polygon } from '@wagmi/core/chains' import { walletConnect, injected } from '@wagmi/connectors' export const config = createConfig({ chains: [mainnet, polygon], connectors: [ injected(), // MetaMask и другие EIP-1193 walletConnect({ projectId: import.meta.env.VITE_WC_PROJECT_ID }), ], transports: { [mainnet.id]: http(), [polygon.id]: http(), }, }) 
// composables/useWallet.ts import { ref, computed, onUnmounted } from 'vue' import { connect, disconnect, getAccount, watchAccount } from '@wagmi/core' import { config } from '@/wagmi.config' export function useWallet() { const account = ref(getAccount(config)) const unwatch = watchAccount(config, { onChange(data) { account.value = data } }) onUnmounted(() => unwatch()) return { address: computed(() => account.value.address), isConnected: computed(() => account.value.isConnected), chainId: computed(() => account.value.chainId), connect: (connector) => connect(config, { connector }), disconnect: () => disconnect(config), } } 

Чтение данных контракта с кэшированием

// composables/useTokenBalance.ts import { useQuery } from '@tanstack/vue-query' import { readContract } from '@wagmi/core' import { erc20Abi } from 'viem' import { config } from '@/wagmi.config' export function useTokenBalance(tokenAddress: Ref<`0x${string}`>, owner: Ref<`0x${string}` | undefined>) { return useQuery({ queryKey: computed(() => ['balance', tokenAddress.value, owner.value]), queryFn: () => readContract(config, { address: tokenAddress.value, abi: erc20Abi, functionName: 'balanceOf', args: [owner.value!], }), enabled: computed(() => !!owner.value), staleTime: 10_000, // 10 секунд кэш }) } 

Запись в контракт и обработка транзакций

import { useMutation } from '@tanstack/vue-query' import { writeContract, waitForTransactionReceipt } from '@wagmi/core' export function useApprove(tokenAddress: Ref<`0x${string}`>) { return useMutation({ mutationFn: async ({ spender, amount }: { spender: `0x${string}`, amount: bigint }) => { const hash = await writeContract(config, { address: tokenAddress.value, abi: erc20Abi, functionName: 'approve', args: [spender, amount], }) await waitForTransactionReceipt(config, { hash }) return hash }, }) } 

В компоненте это выглядит так: кнопка запускает мутацию, isPending отображает процесс, ошибка выводится через error.shortMessage.

Вариант 2: ethers.js + Vue 3 Composition API

Используется, когда нужен лёгкий вес и полный контроль. Провайдер и signer — shallowRef для избежания performance-багов.

// composables/useEthers.ts import { ref, shallowRef } from 'vue' import { BrowserProvider, JsonRpcSigner } from 'ethers' export function useEthers() { const provider = shallowRef<BrowserProvider | null>(null) const signer = shallowRef<JsonRpcSigner | null>(null) const address = ref<string | null>(null) async function connectWallet() { if (!window.ethereum) throw new Error('No wallet detected') const _provider = new BrowserProvider(window.ethereum) const _signer = await _provider.getSigner() provider.value = _provider signer.value = _signer address.value = await _signer.getAddress() window.ethereum.on('accountsChanged', (accounts: string[]) => { address.value = accounts[0] ?? null }) window.ethereum.on('chainChanged', () => window.location.reload()) } return { provider, signer, address, connectWallet } } 

Как подключить MetaMask к Vue приложению (пошагово)

  1. Установите библиотеки: npm install @wagmi/core viem @tanstack/vue-query.
  2. Создайте конфиг wagmi (пример выше).
  3. Напишите composable useWallet с функциями connect/disconnect.
  4. В компоненте вызовите useWallet().connect при клике на кнопку.
  5. Для ethers.js: установите ethers, создайте BrowserProvider и вызовите getSigner.

Сравнение подходов

Критерий wagmi/core + vue-query ethers.js + Vue 3
Реактивность Автоматическая через vue-query Ручное управление (watch, события)
Кэширование Встроенное (staleTime) Требуется реализовать
Мутации useMutation + waitForTransactionReceipt Ручной вызов и ожидание
Поддержка кошельков 300+ через Web3Modal Только injected, требуется DOMParser
Сложность настройки Средняя Высокая (полифиллы, состояние)

Wagmi/core в 2 раза быстрее в развёртывании благодаря готовой конфигурации, а ethers.js даёт полный контроль над каждым RPC-запросом.

Детали выбора стека Если проект использует мультичейн и требует поддержки десятков кошельков — выбирайте wagmi/core. Для простого dApp с одной сетью и минимальным функционалом ethers.js будет легче и быстрее.

Как происходит работа над проектом?

Этап Что делаем Результат
Аналитика Изучаем смарт-контракты, требования к UI и сети Техническое задание, выбор стека
Проектирование Разрабатываем архитектуру компонентов, хранилищ и роутинга Диаграммы, макеты, схема данных
Реализация Пишем composables, страницы, интеграции с кошельками Рабочий прототип на тестовой сети
Тестирование Unit-тесты, интеграционные тесты, проверка безопасности Отчёт о покрытии, аудит кода
Деплой Сборка через Vite, деплой на IPFS или VPS, настройка ENS Продакшен-версия с мониторингом

Что входит в разработку фронтенда dApp?

  • Исходный код — репозиторий на GitHub/GitLab с документацией по сборке.
  • Интеграция кошельков — MetaMask, WalletConnect, Coinbase Wallet и 300+ других через Web3Modal.
  • Взаимодействие с контрактами — чтение/запись, обработка событий, оптимизация газа (снижение комиссий на 30–50%).
  • UI компоненты — кастомные или на базе готовых библиотек (Vuetify, PrimeVue).
  • Админ-панель — при необходимости для управления контрактами.
  • Обучение команды — проведём воркшоп по работе с кодом и деплою.
  • Поддержка — 1 месяц бесплатного сопровождения после сдачи.

Сроки и стоимость

Сроки зависят от сложности интеграций и количества экранов. Ориентировочно: от 2 недель (MVP с одной сетью) до 8 недель (полноценный dApp с мультичейном и админкой). Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки вашего проекта.

Почему стоит выбрать нашу команду?

Мы — сертифицированные разработчики с многолетним опытом в блокчейне и Vue. Используем формальную верификацию контрактов и следим за обновлениями EIP. Гарантируем совместимость с последними версиями wagmi/core и ethers.js. Лицензия на коммерческое использование — все работы выполняются в соответствии с требованиями безопасности. Получите консультацию по вашему проекту — свяжитесь с нами.