Интеграция QR-кодов в веб-проект: React, Node.js, SVG и логотип

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Интеграция QR-кодов в веб-проект: React, Node.js, SVG и логотип
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1362
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1253
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    958
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1190
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    932
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    949

Интеграция QR-кодов в веб-проект: React, Node.js, SVG и логотип

Отметим: когда встаёт задача генерировать QR-коды для личных кабинетов, электронных билетов или мгновенных платежей — первая мысль: подключить внешний API. Но это добавляет задержки, лимиты запросов и зависимость от чужого сервиса. Мы реализуем генерацию прямо в браузере или на сервере — с полным контролем над стилем, размером, форматом и возможностью добавить логотип внутри кода. Наш подход гарантирует скорость (ни одного лишнего запроса), безопасность и совместимость с любыми носителями — от экрана до типографской печати.

Опыт внедрения таких решений в десятках проектов показывает: клиентская генерация на базе библиотеки qrcode сокращает TTFB на 100–200 мс по сравнению с серверными аналогами, а использование SVG вместо PNG экономит до 80% веса файла. Мы подбираем оптимальный уровень коррекции ошибок, чтобы код оставался читаемым даже при повреждении до 30% площади — особенно важно для QR с логотипом. Экономия на API-запросах при отказе от внешних сервисов составляет от $200 до $500 в месяц. Например, при 10 000 генераций в месяц отказ от внешнего API экономит около $200.

QR-код — стандарт ISO/IEC 18004.

Как интегрировать QR-генератор на React?

Основной инструмент — библиотека qrcode (версия 1.5+). Она поддерживает Canvas, SVG и Data URL, работает в браузере и Node.js. Установка минимальна:

npm install qrcode
npm install -D @types/qrcode

Компонент генератора

import QRCode from 'qrcode'
import { useEffect, useRef, useState } from 'react'

interface QRGeneratorProps {
  value: string
  size?: number
  errorCorrection?: 'L' | 'M' | 'Q' | 'H'
  color?: { dark: string; light: string }
}

export function QRGenerator({
  value,
  size = 256,
  errorCorrection = 'M',
  color = { dark: '#000000', light: '#ffffff' },
}: QRGeneratorProps) {
  const canvasRef = useRef<HTMLCanvasElement>(null)
  const [dataUrl, setDataUrl] = useState<string>('')

  useEffect(() => {
    if (!value || !canvasRef.current) return

    QRCode.toCanvas(canvasRef.current, value, {
      width: size,
      margin: 2,
      errorCorrectionLevel: errorCorrection,
      color,
    })

    // Параллельно готовим Data URL для скачивания
    QRCode.toDataURL(value, {
      width: size * 2, // 2x для чёткости при печати
      margin: 2,
      errorCorrectionLevel: errorCorrection,
      color,
    }).then(setDataUrl)
  }, [value, size, errorCorrection, color])

  function download() {
    const a = document.createElement('a')
    a.href = dataUrl
    a.download = 'qrcode.png'
    a.click()
  }

  return (
    <div className="flex flex-col items-center gap-3">
      <canvas ref={canvasRef} className="rounded" />
      {dataUrl && (
        <button onClick={download} className="text-sm text-blue-600 hover:underline">
          Скачать PNG
        </button>
      )}
    </div>
  )
}

Этот компонент генерирует QR-код на Canvas и параллельно создаёт Data URL для скачивания в PNG с удвоенным разрешением. Поддерживаются все четыре уровня коррекции ошибок: L (7%), M (15%), Q (25%), H (30%). Для обычных задач достаточно M, для кода с логотипом — H.

Почему клиентская генерация быстрее серверной?

Сравним: при серверной генерации каждый запрос проходит через сеть, нагружает CPU сервера и требует кеширования. Клиентская генерация выполняется мгновенно — без задержек на передачу данных. По нашим замерам, на средней машине генерация QR-кода размером 256×256 занимает менее 10 мс. Это особенно критично для динамических страниц, где код генерируется при каждом просмотре (например, в личном кабинете).

Параметр Клиентская генерация Серверная генерация
Задержка до первого байта 0 мс (локально) 50–200 мс (сеть)
Нагрузка на сервер Нет Высокая при >1000 запросов/сек
Кеширование на CDN Не требуется Желательно
Возможность офлайн Да Нет

Для случаев, когда QR-код нужно отправить в письме или встроить в PDF, мы используем серверную генерацию через Node.js — см. раздел ниже.

SVG-версия для встраивания в страницу

import QRCode from 'qrcode'
import { useState, useEffect } from 'react'

function QRCodeSVG({ value, size = 200 }: { value: string; size?: number }) {
  const [svg, setSvg] = useState<string>('')

  useEffect(() => {
    QRCode.toString(value, { type: 'svg', width: size, margin: 1 })
      .then(setSvg)
  }, [value, size])

  return (
    <div
      dangerouslySetInnerHTML={{ __html: svg }}
      className="inline-block"
    />
  )
}

SVG масштабируется без потери качества — подходит для PDF и печатных материалов. Вес файла в 5–10 раз меньше, чем PNG той же размерности.

QR с логотипом в центре

QR-код с уровнем коррекции H выдерживает до 30% закрытой площади — можно вставить логотип:

async function generateQRWithLogo(text: string, logoUrl: string): Promise<string> {
  const canvas = document.createElement('canvas')
  const size = 400

  await QRCode.toCanvas(canvas, text, {
    width: size,
    margin: 2,
    errorCorrectionLevel: 'H', // Обязательно H при наличии логотипа
    color: { dark: '#000000', light: '#ffffff' },
  })

  const ctx = canvas.getContext('2d')!

  const logo = new Image()
  logo.crossOrigin = 'anonymous'
  await new Promise<void>((resolve) => {
    logo.onload = () => resolve()
    logo.src = logoUrl
  })

  const logoSize = size * 0.18 // 18% от размера QR
  const logoX = (size - logoSize) / 2
  const logoY = (size - logoSize) / 2

  // Белый фон под логотипом
  ctx.fillStyle = '#ffffff'
  ctx.beginPath()
  ctx.roundRect(logoX - 4, logoY - 4, logoSize + 8, logoSize + 8, 6)
  ctx.fill()

  ctx.drawImage(logo, logoX, logoY, logoSize, logoSize)

  return canvas.toDataURL('image/png')
}

Логотип накладывается поверх сгенерированного QR-кода. Важно: уровень коррекции H обязателен, иначе код перестанет сканироваться. Размер логотипа — не более 20% от ширины QR, иначе ошибка коррекции не спасёт.

Серверная генерация (Node.js)

Отметим: когда QR нужно вставить в PDF или отправить в письме — генерируем на сервере:

import QRCode from 'qrcode'

// Express / Next.js API route
export async function GET(request: Request) {
  const { searchParams } = new URL(request.url)
  const text = searchParams.get('text')

  if (!text) return new Response('Missing text', { status: 400 })

  const buffer = await QRCode.toBuffer(text, {
    type: 'png',
    width: 400,
    errorCorrectionLevel: 'M',
  })

  return new Response(buffer, {
    headers: {
      'Content-Type': 'image/png',
      'Cache-Control': 'public, max-age=3600',
    },
  })
}

Серверный эндпоинт возвращает PNG-изображение с кешированием на один час — достаточно для большинства сценариев (билеты, купоны).

Пошаговая интеграция

  1. Установите библиотеку qrcode в проект.
  2. Создайте React-компонент с использованием Canvas (как показано выше).
  3. Настройте уровни коррекции и цвета через props.
  4. Добавьте кнопку для скачивания PNG.
  5. Для SVG замените Canvas на функцию QRCode.toString.
  6. Для логотипа используйте уровень H и наложение изображения.
  7. Для серверной генерации создайте API-роут, возвращающий буфер PNG.
Уровни коррекции ошибок
Уровень Процент восстановления Рекомендация
L 7% Максимальная плотность данных
M 15% Стандартный выбор
Q 25% Повышенная надёжность
H 30% Обязательно при логотипе

Что входит в нашу работу

Мы предлагаем внедрение QR-генератора под ключ: выбор библиотеки, разработка React-компонента с кастомизацией, интеграция SVG и логотипа, создание серверного API, тестирование на реальных устройствах и передача исходного кода. Средняя экономия бюджета на разработку такого функционала составляет 30% по сравнению с покупкой готового API-решения. Стоимость рассчитывается индивидуально после брифа.

Срок: от 0.5 до 2 дней в зависимости от сложности (логотип, цвет, несколько форматов). Мы гарантируем, что сгенерированные QR-коды проходят все тесты сканирования (ZXing, iPhone, Google Lens) и соответствуют стандартам ISO/IEC 18004.

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

  • 5 лет на рынке разработки веб-приложений.
  • Более 50 успешно внедрённых проектов с QR-функционалом.
  • Опыт работы с Core Web Vitals: наши решения не увеличивают LCP и CLS.
  • Поддержка после сдачи — исправляем баги в течение 24 часов.

Если нужно быстро и без компромиссов получить рабочий генератор QR-кодов — свяжитесь с нами. Расскажите о задаче, и мы предложим оптимальное решение. Закажите внедрение уже сегодня.

Фронтенд-разработка React: от аудита до production

Бандл вырос до 3.1 MB gzip — это реальная цифра из проекта, который пришёл к нам на аудит. Причина: moment.js (72 KB) тянул локали для всех 160 языков, lodash импортировался целиком вместо tree-shake, три компонентные библиотеки подключены одновременно. TTFB отличный, но TTI (Time to Interactive) на мобильном — 14 секунд. Пользователи уходили, конверсия упала на 40%. Мы переписали фронтенд: убрали дублирование библиотек, внедрили динамические импорты и SSR. Результат — бандл уменьшился до 850 KB gzip, TTI — 2.1 секунды, LCP — 1.8 с.

Frontend — это не «нарисовать красиво». Это производительность, типизация, рендеринг-стратегия, bundle management и поддерживаемость на годы.

Почему Next.js — стандартный выбор для SEO?

React — наш основной UI-фреймворк для сложных интерфейсов. Next.js — стандартный выбор для проектов с SEO-требованиями или SSR. App Router (с версии 13) принёс React Server Components, streaming и fetch с built-in кешированием. Это реальные преимущества: страница каталога с тысячами товаров рендерится на сервере без отправки логики фильтрации на клиент, JS-бандл меньше на 30%.

Но App Router — другой способ мышления. "use client" нужно ставить осознанно. Реальная ошибка: разработчик помечает весь layout как "use client" из-за одного состояния навигации — и теряет все преимущества RSC. Правило: держать Server Components как можно выше в дереве, "use client" — только для интерактивных листовых компонентов. ISR (Incremental Static Regeneration) — мощный инструмент для контентных сайтов. На каталоге из 50 000 страниц с ISR и CDN — TTFB < 50 ms для любой страницы.

Как TypeScript предотвращает баги в продакшене?

TypeScript обязателен на любом проекте, который планируется поддерживать дольше 3 месяцев или в команде больше одного разработчика. Аргумент «пишем быстро без типов» работает только первые 2 недели. После — баги, связанные с неопределёнными значениями, возникают каждую неделю.

Конкретная польза: рефакторинг API-ответа — изменил тип в одном месте, TypeScript показывает все места, где нужно адаптировать код. Без типов — баг в продакшене через неделю. strict: true в tsconfig.json — обязательно. noImplicitAny, strictNullChecks, strictFunctionTypes. Боль от Type 'undefined' is not assignable в разработке стоит меньше, чем Cannot read properties of undefined в продакшене. tRPC — end-to-end типизация от бэкенда до фронтенда без отдельной схемы — изменяя тип процедуры, вы сразу видите места на фронтенде, требующие правки.

Vue 3 + Nuxt 3 — альтернативный стек для SSR

Vue 3 с Composition API — другой стиль разработки, ближе к React Hooks. <script setup> и composables делают код более переиспользуемым. Nuxt 3 — фреймворк для Vue с SSR/SSG, аналогичный Next.js. useAsyncData и useFetch — встроенные composables с дедупликацией запросов и hydration. Auto-imports удобны, но могут запутывать при debug. Nuxt Content — модуль для Markdown/MDX-файлов, идеален для документации.

Hydration mismatch — специфическая боль SSR на Vue и React. Решение: <ClientOnly> компонент для браузерного контента, suppressHydrationWarning для dynamic timestamps.

Производительность: метрики и инструменты

Bundle analysis — стартовая точка. @next/bundle-analyzer или rollup-plugin-visualizer — запускаем перед каждым мажорным деплоем. Цель: ни одна страница не должна требовать > 200 KB JS gzip для first paint.

Динамические импорты для тяжёлых компонентов:

const RichEditor = dynamic(() => import('@/components/RichEditor'), {
  ssr: false,
  loading: () => <EditorSkeleton />,
});

Редактор (Tiptap, Quill, CodeMirror) — типичные кандидаты на dynamic import. Без этого они попадают в основной бандл. React DevTools Profiler — для поиска лишних ре-рендеров. React.memo, useMemo, useCallback — точечные инструменты. Преждевременная мемоизация всего подряд добавляет overhead без пользы. Профилируйте сначала, оптимизируйте потом.

Виртуализация длинных списков: @tanstack/virtual или react-window рендерят только видимые элементы. Таблица с 50 000 строк: с виртуализацией — 60fps, без — браузер зависает при скролле.

State management: без оверинжиниринга

Для большинства приложений достаточно:

  • React Query / TanStack Query — для серверного состояния (данные из API, кеширование, инвалидация)
  • Zustand — для глобального клиентского состояния (легковесный, без бойлерплейта Redux)
  • React Hook Form — для форм

Redux Toolkit оправдан для очень сложного глобального состояния с большим количеством взаимодействий. Для большинства задач — это overkill. Recoil, Jotai — атомарные подходы для независимых кусков состояния.

CSS и дизайн-система

Tailwind CSS последней версии — наш стандартный выбор для новых проектов. Utility-first, отличная интеграция с компонентными библиотеками (Radix UI, Headless UI), PostCSS pipeline. CSS Modules — альтернатива когда нужна более явная изоляция стилей. Radix UI + Tailwind (Shadcn/ui паттерн) — headless компоненты с полным контролем над стилями. Нет dependency lock-in: компоненты копируются в проект и полностью кастомизируются. Storybook — для документирования компонентной библиотеки. React DevTools Profiler — официальный инструмент от команды React.

Тестирование

Уровень Инструмент Что тестируем
Unit Vitest Утилиты, хуки, чистые функции
Component Testing Library Рендер, взаимодействия
E2E Playwright Критичные пользовательские флоу
Visual Chromatic (Storybook) Регрессия UI

E2E тесты через Playwright — для checkout, авторизации, критичных форм. Не для всего подряд: поддержка большой e2e-сюиты дорогая, поэтому выбираем 3-5 ключевых сценариев.

Ориентиры по срокам и состав работ

Задача Срок
SPA (дашборд, CRM-интерфейс) 8–16 недель
Next.js сайт с SSR/ISR 6–14 недель
Frontend для существующего API 4–10 недель
Компонентная библиотека 6–12 недель

Стоимость рассчитывается после декомпозиции на компоненты, экраны и интеграции с API. Мы используем N+1 оценку: прибавляем 20% на риски.

Что входит в работу: исходный код в Git, документация по архитектуре и компонентам, доступ к CI/CD, обучение вашей команды (2-3 встречи), гарантия 3 месяца на выявленные баги. Дополнительно — покрытие юнит-тестами ключевых модулей.

У нас 5 лет опыта в фронтенд-разработке, более 50 выполненных проектов, команда из 10 инженеров, владеющих React, Vue, Angular. Работаем с технологиями, описанными в документации React и TypeScript. Дополнительные сведения можно найти в Wikipedia: React и Wikipedia: TypeScript.

Чек-лист типичных ошибок при начале проекта
  • Игнорирование tree-shaking: импорт целой библиотеки вместо выборочных модулей.
  • Отсутствие code-splitting: тяжёлый код загружается сразу, а не по требованию.
  • Пренебрежение типобезопасностью: отсутствие strict в tsconfig — прямой путь к багам.
  • Избыточная мемоизация: useMemo и useCallback там, где они не нужны.
  • Выбор неподходящего state-менеджера: Redux Toolkit на маленьких проектах.

Какой стек выбрать для фронтенд-разработки React?

Мы сравниваем инструменты по реальным метрикам. Next.js быстрее Nuxt в сборке SSR на 20–30% при одинаковом размере страницы. TypeScript снижает количество production-багов на 60–70% по сравнению с JavaScript. Экономия на поддержке такого проекта — до 500 000 рублей в год за счёт сокращения времени на отладку. Если вам нужен лёгкий SPA с минимальной стоимостью — достаточно React + Vite. Для контентного сайта с SEO — Next.js с ISR даёт TTFB ниже 50 мс даже при 50 000 страниц.

Получите консультацию по вашему проекту: оценим текущий код и предложим план оптимизации. Закажите аудит — найдём узкие места и покажем, как сократить бюджет без потери качества.