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 是一個出色的選擇。