viem:下一代 Web3 開發的 TypeScript 接口

作者: Calpa Liu
字數:1481
出版:2025 年 3 月 29 日
viem 是一個功能強大的 TypeScript 接口,為以太坊和其他 EVM 兼容區塊鏈提供低層次的無狀態原語。作為 ethers.js 和 web3.js 的替代品,viem 在開發者體驗、穩定性、捆綁包大小和性能方面有著顯著優勢。本文將深入探討 viem 的特性及其為 Web3 開發者帶來的獨特價值。

viem 的核心優勢

卓越的開發者體驗

viem 通過提供自動類型安全和推斷、全面的文檔以及可組合的 API,極大地提升了開發者體驗。雖然 viem 的 API 可能比其他替代庫更加詳細,但這種設計理念使其模塊化構建塊極為靈活,易於移動、更改和刪除。

viem 採用文檔和測試驅動的開發方法來構建模塊,這導致 API 更加可預測和穩定。此外,viem 還為用戶提供強類型 API,通過自動完成和類型檢查提供最佳的開發體驗。

顯著的性能提升

viem 的一個最直接優勢是其卓越的性能。從 Ethers.js 遷移到 viem 時,性能差異非常明顯——viem 提供更快的執行時間,特別是對於大規模合約交互或批量操作。這使它非常適合性能直接影響用戶體驗的項目,如遊戲或金融 dApp。

import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'

const client = createPublicClient({
  chain: mainnet,
  transport: http(),
})

const blockNumber = await client.getBlockNumber()

上述代碼展示了 viem 簡潔高效的 API 設計。

輕量級和模塊化設計

與其他框架(如 Web3.js)經常帶有臃腫的包不同,viem 採用模塊化設計。您可以準確選擇需要的庫部分,這保持了應用程序的輕量級,並減少了捆綁包大小。這對於性能敏感的應用程序特別有用,在這些應用中,每一毫秒都很重要。

viem 的檔案大小僅為 27kb,相比之下 Ethers 約為 130kb。這種顯著的差異對於優化 web 應用程序加載時間和性能至關重要。

強化的 TypeScript 整合

類型安全是許多開發者喜愛的特性,尤其是當它有助於減少運行時錯誤時。viem 的緊密 TypeScript 整合是一個改變遊戲規則的因素,它允許開發者更加自信地構建,無需擔心類型錯誤潛入。雖然 Ethers.js 也提供 TypeScript 支持,但 viem 進一步推進了這一點,使類型安全感覺更加內在於開發體驗。

氣體優化

使用 viem,優化氣體使用從未如此簡單。該框架提供對交易創建和管理的精細控制,這有助於節省氣體費用。Ethers.js 和 Web3.js 提供基本的氣體估算工具,但 viem 提供更準確的估算和更好的優化選項。

穩定性保證

viem 非常注重穩定性,其測試套件在復制的以太坊網絡上運行,確保完整的測試覆蓋率。這意味著您可以信賴 viem 在各種情境下的可靠運作。

viem 與其他 Web3 庫的比較

viem vs Ethers.js

當構建以太坊上的 dapps 時,選擇正確的庫可以顯著影響您的開發過程和項目成功。Ethers.js 和 viem 都提供強大的工具集,用於連接智能合約、發送交易和查詢區塊鏈數據,並正式支持 TypeScript。

viem 是首選,特別是在效率、輕量級捆綁包和極簡設計是關鍵考慮因素的項目中。它在 Web 項目中表現出色,其中高效性對用戶體驗至關重要。

viem vs Web3.js

雖然 Web3.js 長期以來一直是 Ethers.js 的主要競爭對手,但現在情況已經改變。截至 2024 年 4 月,根據 npm 趨勢,viem 的下載量已超過 Web3.js,鞏固了其作為以太坊生態系統中主要玩家的地位。

實際應用案例

與 React 的整合

viem 也適用於 Web 應用開發。與 Web3 庫不同,這些庫主要關注於網絡並可能依賴於 Node.js 或瀏覽器 API,viem 在 React 環境中良好運作。

// 在 React 應用中設置 viem 客戶端
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'

const client = createPublicClient({
  chain: mainnet,
  transport: http(),
})

與 Hardhat 的整合

Hardhat 插件hardhat-viem提供了 viem 與 Hardhat 開發環境的整合。這允許開發者在 Hardhat 項目中直接使用 viem 的功能。

// 在 Hardhat 環境中使用 viem
import hre from "hardhat";

const publicClient = await hre.viem.getPublicClient();
const blockNumber = await publicClient.getBlockNumber();

與 Wagmi 的協同工作

Wagmi 本質上是一個 viem 的包裝器,提供多鏈功能(通過 Wagmi Config)和自動帳戶管理(通過 Connectors)。所有核心 Wagmi 動作都是友好的 viem 動作包裝器,注入多鏈和連接器感知的 Wagmi Config。

// 使用 Wagmi 與 viem
import { http, createConfig, getClient } from '@wagmi/core'
import { mainnet } from '@wagmi/core/chains'
import { getLogs } from 'viem/actions'

const config = createConfig({
  chains: [mainnet],
  transports: {
    [mainnet.id]: http(),
  },
})

const publicClient = getClient(config)
const logs = await getLogs(publicClient, /* ... */)

創建自定義客戶端

viem 允許開發者通過使用createClient函數構建自己的客戶端,並可選擇使用.extend擴展它。這是 viem 內部客戶端(Public、Wallet 和 Test)的構建方式。

import { createClient, http } from 'viem'
import { mainnet } from 'viem/chains'

// 初始化基本客戶端
const client = createClient({
  chain: mainnet,
  transport: http()
})

// 使用自定義動作擴展客戶端
const extendedClient = client.extend(client => ({
  async customAction(args) {
    // 實現自定義功能
    return client.request({
      method: 'custom_method',
      params: [args]
    })
  }
}))

結論

viem 已迅速成為 Web3 開發生態系統中的突出工具。其性能、類型安全性和模塊化設計相比較舊的框架如 Web3.js 提供了明顯的優勢,並且正迅速追趕 Ethers.js。

截至 2024 年 4 月,viem 已在下載量上超過 Web3.js,成為明確的挑戰者。憑藉其現代化、精簡的 API、增強的性能和卓越的 TypeScript 支持,viem 有望成為區塊鏈開發領域的主導力量。

如果您正在開發那些性能和安全性是關鍵因素的 dApp,viem 絕對值得考慮。對於希望優化氣體成本、改善類型安全性並保持代碼庫精簡的開發者,viem 是一個出色的選擇。

關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章

最新文章