开源项目Viem新一代Ethereum库好用吗

wen 开源项目 23

开源项目Viem新一代Ethereum库好用吗?深度评测与实用指南

📖 目录导读

  1. Viem是什么?为什么开发者都在讨论它?
  2. Viem vs Ethers.js vs Web3.js:核心差异对比
  3. Viem的六大亮点与使用场景
  4. 常见问答:Viem的坑与真相
  5. 实战:5分钟上手Viem
  6. Viem适合你吗?

Viem是什么?为什么开发者都在讨论它?

在2023年末至2024年,一个名为Viem的开源项目悄然走红,成为以太坊(Ethereum)生态中最受关注的JavaScript库之一,如果你打开GitHub,会发现它已经积累了超过2万颗星(截至2025年初),并且被Uniswap、ENS、PancakeSwap等头部DeFi项目采用。

开源项目Viem新一代Ethereum库好用吗

简单说,Viem是一个新一代的、类型安全的以太坊交互库,专门为现代JavaScript/TypeScript开发环境设计,它由著名的web3开发者社区wagmi团队维护(这个团队也是此前大热的React Hooks库wagmi的开发者)。

一句话定义:Viem = 更轻、更快、更安全的Ethereum JS SDK。

它解决的核心痛点是:传统库(如Web3.js、Ethers.js)接口设计老旧、类型推断弱、包体积大,并且处理部分常见场景(如合约交互、日志解析)时代码冗长。


Viem vs Ethers.js vs Web3.js:核心差异对比

为了直观回答“Viem好用吗”,我们用一个表格对比三大主流库:

维度 Viem Ethers.js Web3.js
诞生时间 2023年(新一代) 2017年 2015年(最老牌)
包体积(压缩后) ~30KB ~120KB ~280KB
TypeScript支持 原生完整 较好但有类型缺口 较弱
Tree-shaking(按需加载) ✅ 原生支持 ❌ 全量引入 ❌ 全量引入
合约ABI解析速度 ⚡快(底层优化) 🐢中等 🐢较慢
文档友好度 ⭐⭐⭐⭐⭐(示例丰富)
主流DApp采用率 快速上升(Uniswap等) 最高(行业标准) 逐渐下降

结论先行:如果你正在搭建一个新项目,尤其是使用React/Next.js/TypeScript的现代前端,Viem几乎可以无脑选择,但如果是老项目迁移,需考虑成本。


Viem的六大亮点与使用场景

1 真正的类型安全(TypeScript最强搭档)

Viem内部依赖ABI(合约接口)智能解析,当你传入一个合约ABI后,Viem会自动推断返回值类型、参数类型,甚至函数名补全。

// 传统Ethers.js写法(需要手动断言类型)
const balance = await token.balanceOf(address) as BigNumber;
// Viem写法(自动推断)
const balance = await token.read.balanceOf([address]); 
// Viem知道balance返回的是bigint,你不需要任何类型断言

优点:减少运行时因类型错误导致的崩溃,开发体验接近静态语言(如Rust)。

2 极致轻量与Tree-shaking

对比Ethers.js(120KB+),Viem仅30KB左右,对于移动端、打包体积敏感的项目(比如钱包插件、交易所落地页),这个优势很明显。

3 纯函数式API设计(告别class)

Viem几乎所有功能都是纯函数,而不是类实例,这使得它更容易与React Hooks、Vue Composition API、甚至服务端环境(Node.js)结合。

// 不需要new一个provider,而是通过函数调用
import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({ 
  chain: mainnet, 
  transport: http() 
});

4 链与合约的多态支持

Viem内置了所有主流L2链(Optimism、Arbitrum、Base等)以及测试网(Sepolia、Holesky)的配置,你只需一行切换:

import { base } from 'viem/chains';
const client = createPublicClient({ chain: base, transport: http() });

5 深入优化的日志与事件解析

过去解析合约事件需要写大量模板代码,Viem直接提供getLogs+自动事件参数解码:

const logs = await client.getLogs({
  address: '0x...',
  event: abi.event.Transfer,
});
// logs[0].args.from 自动转为address类型

6 完善的EIP-1193支持

与现代钱包(MetaMask、WalletConnect v2、Rabby)的交互标准集成,不用再写适配代码。


常见问答:Viem的坑与真相

❓ Q1:Viem是否成熟到可以用于生产环境?

答:是。 Viem正式版发布已超过一年,被Uniswap、Compound(部分场景)、PancakeSwap、ENS等头部项目采用,其核心代码测试覆盖率高,且团队持续维护,不推荐在尚未审计的合约调用中依赖Viem的实验性API(例如自定义签名方案)。

❓ Q2:Ethers.js用户迁移到Viem学习成本高吗?

答:中等偏低。 如果熟悉Ethers.js,理解Viem的公共/钱包/合约客户端概念需要1-2小时,主要差异:Viem用read/write/simulate替代了直接调用合约方法;用createPublicClient替代Provider

❓ Q3:Viem在服务端(Node.js后段)表现如何?

答:优秀。 无需DOM依赖,支持原生httpWebSocket传输,一个典型场景:使用Viem在服务端监听区块链事件,然后写入数据库,由于纯函数设计,与Express/Fastify等框架配合流畅。

❓ Q4:Viem有没有明显的缺点?

答:有三个值得注意的问题:

  1. 文档示例偏React:虽然支持任何框架,但官方文档多数Demo使用了React,Vue/Angular开发者可能需要自己转换。
  2. 部分ERC合约方法缺失:比如ERC-4626(代币化金库)的封装尚未完全,仍需手动编写ABI交互。
  3. 与老版本依赖的兼容性:如果你项目中同时使用了Ethers.js v5和Viem,会因为BigNumber与bigint的冲突导致问题,建议统一使用Viem或升级Ethers.js v6。

实战:5分钟上手Viem

目标:用Viem读取以太坊上任意地址的ETH余额,并发送一笔交易。

Step 1:安装

npm install viem
# 或 yarn add viem

Step 2:创建公共客户端(只读模式)

import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({
  chain: mainnet,
  transport: http('https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY'),
});
async function main() {
  const balance = await client.getBalance({
    address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // Vitalik地址
  });
  console.log('Balance:', balance); // 返回值是bigint,单位是wei
}

Step 3:发送交易(需要钱包)

import { createWalletClient, custom } from 'viem';
import { mainnet } from 'viem/chains';
const walletClient = createWalletClient({
  chain: mainnet,
  transport: custom(window.ethereum),
});
const [address] = await walletClient.getAddresses();
const hash = await walletClient.sendTransaction({
  to: '0x...',
  value: 1000000000000000n, // 0.001 ETH
});

注意custom(window.ethereum) 用于浏览器中的MetaMask,若在Node环境,使用http transport + 私钥(不推荐暴露私钥)。

完整代码示例地址

你可以访问Viem官方文档(代码示例部分)查看更多用例,由于版权原因,这里不直接引用,但搜索「Viem example」即可找到运行指导。


Viem适合你吗?

你的场景 推荐度 原因
新做一个DApp前端(React/Next.js) 轻量、类型安全、生态持续增长
做钱包或多链应用(包括L2) 内置多链支持,切换成本极低
维护老项目(Ethers.js v5) 迁移成本较高,建议缓慢过渡
仅做后台监听脚本(Node.js) 纯函数+小体积,适合低资源环境
合约审计工具开发 需要大量特殊ABI操作时,Viem的抽象可能不够底层

最终结论:Viem好用,且正在成为新一代以太坊开发的事实标准,它的设计思路——类型优先、包体积最优、API简洁,恰好解决了过去几年Ethers.js和Web3.js积累的痛点,如果你正在考虑学习新的以太坊开发库,从Viem开始是最佳选择;如果你已经熟悉旧库,花半天时间过渡到Viem,会显著提升长期开发效率。

最后提醒:请在实现生产环境代码前,自行测试并阅读Viem的正式发布日志,本文基于2025年3月的信息整理,部分API可能有版本更新。

抱歉,评论功能暂时关闭!