手把手教你用 Next.js 搭建 Solana NFT 铸造网站

524 阅读3分钟

手把手教你用 Next.js 搭建 Solana NFT 铸造网站

本文将详细介绍如何使用 Next.js 15 + Solana Web3.js + Metaplex 构建一个完整的 NFT 铸造网站

前言

大家好,我是 hyy。最近在研究 Web3 相关技术,正好借这个机会分享一下如何使用 Next.js 搭建一个 Solana NFT 铸造网站。这个项目包含了完整的钱包连接、NFT 铸造等功能,并且支持中英文国际化。

在线预览

在线 Demo

技术选型

首先介绍一下项目用到的主要技术栈:

  • Next.js 15.1: 选择最新的 Next.js 版本,使用 App Router 架构
  • React 19: 最新的 React 版本
  • Solana Web3.js: Solana 区块链交互的核心库
  • Metaplex: 使用 Candy Machine v3 来实现 NFT 铸造
  • TailwindCSS: 原子化 CSS 框架,用于快速构建 UI
  • TypeScript: 提供类型安全
  • i18next: 实现国际化

项目初始化

首先创建项目并安装依赖:

git clone https://github.com/coderhyy/monkey-kingdom-next.git
cd monkey-kingdom-next
pnpm install

项目结构

项目的主要目录结构如下:

.
├── app                   # Next.js App Router 目录
│   ├── [lng]             # 动态路由 (国际化)
│   ├── i18n              # 国际化配置
│   └── lib               # 工具函数
├── components            # 全局共享组件
└── public                # 静态资源

核心功能实现

1. 国际化配置

使用 i18next 实现国际化,主要代码在:

export const fallbackLng = "en";
export const languages = [fallbackLng, "zh"];
export const defaultNS = "translation";
export const cookieName = "i18next";

export function getOptions(
  lng = fallbackLng,
  ns: string | string[] = defaultNS
) {
  return {
    defaultNS,
    // preload: languages,
    fallbackLng,
    fallbackNS: defaultNS,
    lng,
    ns,
    // debug: true,
    supportedLngs: languages,
  };
}

2. Solana 钱包集成

钱包连接是通过 @solana/wallet-adapter 实现的:

export function SolanaProvider({ children }: { children: React.ReactNode }) {
  const { cluster } = useCluster();
  const endpoint = useMemo(() => cluster.endpoint, [cluster]);
  const onError = useCallback((error: WalletError) => {
    console.error(error);
  }, []);

  return (
    <>
      <ConnectionProvider endpoint={endpoint}>
        <WalletProvider autoConnect onError={onError} wallets={[]}>
          <WalletModalProvider>{children}</WalletModalProvider>
        </WalletProvider>
      </ConnectionProvider>
    </>
  );
}

3. NFT 铸造功能

铸造功能的核心实现:

  const handleMint = useCallback(async () => {
    if (!candyMachine) return;

    setIsLoading(true);
    try {
      const transaction = buildMintTransaction();
      if (!transaction) throw new Error("Failed to build transaction");
      await transaction.sendAndConfirm(umi);
      toast.success(t("mintSuccess"));
      await Promise.all([getBalance(), getCandyMachine()]);
    } catch (error) {
      toast.error(error instanceof Error ? t("mintError") : t("unknownError"));
    } finally {
      setIsLoading(false);
    }
  }, [buildMintTransaction, candyMachine, getBalance, getCandyMachine, t, umi]);

4. UI 设计

项目使用 TailwindCSS 实现响应式设计,深色模式配置:

@media (prefers-color-scheme: dark) {
  :root {
    --primary: #7c4dff;
    --primary-hover: #8c6fff;
    --primary-active: #673ab7;

    --background: #0a0a0a;
    --background-secondary: #1a1a1a;

    --foreground: #ededed;
    --foreground-secondary: #a0a0a0;

    --border: #333333;
  }
}

遇到的问题和解决方案

  1. Solana 钱包连接问题

    • 问题:浏览器环境下 Phantom 钱包连接失败
    • 解决:确保在客户端渲染钱包组件,使用 Next.js 的 dynamic import
  2. 国际化路由问题

    • 问题:刷新页面后语言设置丢失
    • 解决:使用 middleware 处理语言重定向
  3. Candy Machine 集成问题

    • 问题:铸造交易失败
    • 解决:增加计算单元限制,设置 COMPUTE_UNITS = 800_000

部署

推荐使用 Vercel 部署,只需要几个简单步骤:

  1. 在 Vercel 创建新项目
  2. 导入 GitHub 仓库
  3. 配置环境变量
  4. 点击部署

后续优化计划

  1. 支持更多钱包
  2. 优化移动端体验
  3. 添加更多语言支持
  4. 集成 NFT 交易市场

结语

通过这个项目,我们不仅学习了如何使用 Next.js 构建现代化的 Web 应用,还掌握了 Solana 生态系统的开发技能。希望这篇文章对大家有帮助!

如果你对这个项目感兴趣,欢迎访问 GitHub 仓库 并给个 Star ⭐️

参考资料