viem: современная альтернатива ethers
viem — современная альтернатива ethers: легче, типобезопаснее по умолчанию, на ней построен wagmi.
viem — современная TypeScript-библиотека для Ethereum: модульная, с малым весом бандла и сильным выводом типов из ABI «из коробки».
ethers — проверенный временем стандарт, но в 2023–2024 многие новые проекты выбирают viem. Не потому что ethers «плохой», а из-за инженерных причин: размер, типы, предсказуемость. Понимать обе библиотеки полезно — вы встретите код на обеих.
Почему появился viem
- Размер бандла. viem модульный и tree-shakeable: в сборку попадает только то, что используете. Для фронта вес важен.
- Типы по умолчанию. Вывод типов из ABI встроен — не нужен отдельный TypeChain.
- Явность. Разделены клиенты: Public Client (чтение) и Wallet Client (подпись) — это прямой аналог Provider/Signer, но названия честнее отражают роль.
- Производительность. Кодирование/декодирование ABI оптимизировано.
Те же идеи, другой синтаксис
Концепции переносятся один-в-один. Public Client = Provider, Wallet Client = Signer. Чтение баланса:
import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";
const client = createPublicClient({
chain: mainnet,
transport: http("https://eth-mainnet.g.alchemy.com/v2/КЛЮЧ"),
});
const balance = await client.readContract({
address: tokenAddress,
abi, // объявлен как const -> типы выводятся
functionName: "balanceOf",
args: [userAddress],
});Вместо contract.balanceOf(addr) здесь явный объект с functionName и args. Многословнее, зато прозрачнее и полностью типизировано: functionName ограничен функциями из ABI, а тип args и результата выводится.
ethers или viem — что выбрать
| Критерий | ethers | viem |
| Зрелость, примеры в сети | больше | меньше |
| Вес бандла | крупнее | легче |
| Типы из ABI «из коробки» | нет (нужен TypeChain) | да |
| Стиль API | объектный (Contract) | функциональный |
| Связка с React | вручную | через wagmi (на viem) |
Как работает под капотом
Под капотом viem делает то же, что ethers: кодирует вызовы по ABI, шлёт JSON-RPC, декодирует ответы. Разница архитектурная — viem строится из мелких чистых функций (readContract, writeContract, getBalance), а не из «толстых» объектов. Это даёт tree-shaking и предсказуемость. Числа, как и в ethers v6, — нативный bigint, поэтому арифметика wei работает одинаково.
Частые ошибки
- Мешать API ethers и viem в голове. Это разные библиотеки; не зовите методы одной на объектах другой.
- Игнорировать
as constу ABI. Главное преимущество viem — типы — пропадёт. - Выбирать библиотеку «по хайпу». Для существующего проекта на ethers миграция не всегда оправдана.
Итоги
- viem — лёгкая, типобезопасная, функциональная альтернатива ethers.
- Public Client = Provider, Wallet Client = Signer; идеи те же.
- На viem построен wagmi — стандарт для React-dApp (следующий раздел).