Tauri 跨端笔记实战(2) - 深度整合 Next.js + shadcn/ui 搭建现代化项目

前言

Tauri 跨端笔记实战项目是基于 Notegen 开源项目,本系列深度解析如何运用Tauri框架开发跨平台AI笔记应用。涵盖核心技术选型、架构设计、典型场景开发及常见问题解决方案,通过代码级演示带您掌握集成AI能力的全流程开发技巧。

你可以通过本系列教程跟随我逐步搭建起一款跨端的笔记应用,也可以通过 NoteGen 源码 来独立学习。

本文收录于《Tauri 开源日记》专栏,主要记录使用 Tauri 框架时的开发经验和避坑指南。

NoteGen 应用截图:

从零开始

看过上一期的同学应该已经了解了我们要开发一款什么样的 APP。

从本期开始,我们将真正进入开发阶段的第一步:搭建项目。

开发环境

macOS

如果你打算开发 iOS,你需要安装 Xcode

如果只针对桌面端开发,可以安装 Xcode 命令行工具即可:

xcode-select \--install

windows

下载 Microsoft C++ 构建工具 安装程序并打开它以开始安装。在安装过程中,选中“使用 C++ 进行桌面开发”选项:

Windows 10(从版本 1803 开始)和更高版本的 Windows 上已经安装了 webview2,如果你的版本更低,需要手动安装:

WebView2 Runtime 下载区

安装 rustup

macOS 或 linux 执行一下命令,随后重新启动终端:

curl \--proto '\=https' \--tlsv1.2 https://sh.rustup.rs \-sSf | sh

windows 前往 https://www.rust-lang.org/tools/install 下载并安装。

移动端开发

如果要做移动端开发,还需要做一些配置,有兴趣可以先了解一下:

本文跳过这块,后续做移动端开发时再进行讲解。

创建一个 Tauri2 项目

对 Tauri2 不太了解也没有关系,有时间可以先浏览一遍官方文档,官网目前还有大量内容未汉化,如果你不擅长阅读文档,跟着我一步一步的搭建也是不错的选择,我会更侧重于前端方式来实现,尽量让大家避免使用 rust 实现功能,尽量使用前端的工具链。

Tauri 提供了很多种创建项目的方式,我们选择前端目前最流行的方式 pnpm:

pnpm create tauri-app

随后需要填写几个问题:

✔ Project name · note-gen
✔ Identifier · com.codexu.NoteGen
✔ Choose which language to use for your frontend · TypeScript
✔ Choose your package manager · pnpm
✔ Choose your UI template › 这里先选 react

创建后进入目录:

cd note-gen
pnpm install
pnpm tauri dev

注意这里是 tauri dev,如果是 pnpm run dev 只是跑前端 web 服务。

创建 next.js,合并项目

由于我们目标是使用 next.js 开发,所以要删除 vite 和 react。

可以先删除 src 和 vite.config.ts,如果你不想使用 next.js,直接用你喜欢的框架也是没问题的,核心的思路是没什么区别的。

使用 npx create-next-app@latest 创建一个新项目,随后把里面的文件复制到 tauri 项目中,注意 package.json 的内容合并。

# 其他随意
Would you like to use Tailwind CSS? - yes

更新 Tauri 配置:

{
  "build": {
      "beforeDevCommand": "pnpm dev",
      "beforeBuildCommand": "pnpm build",
      "devUrl": "http://localhost:3456",
      "frontendDist": "../dist"
  }
}

更新 next.config.ts 配置:

import type { NextConfig } from "next";

const isProd = process.env.NODE_ENV === 'production';

const internalHost = process.env.TAURI_DEV_HOST || 'localhost';

const nextConfig: NextConfig = {
  /* config options here */
  output: "export",
  images: {
    unoptimized: true,
  },
  assetPrefix: isProd ? undefined : `http://${internalHost}:3456`,
  devIndicators: {
    appIsrStatus: false,
  },
  sassOptions: {
    silenceDeprecations: ['legacy-js-api'],
  },
};

export default nextConfig;

更新 package.json

"scripts": {
  "dev": "next dev -p 3456",
  "build": "next build",
  "start": "next start -p 3456",
  "lint": "next lint",
  "tauri": "tauri"
},

现在运行 pnpm tauri dev,既可以启动一个桌面端程序,内容是 next.js 初始页面。

shadcn/ui

shadcn/ui 在开发中体验真的是无比舒服,这个只有在体验之后才可以感受到。

运行初始化命令以

pnpm dlx shadcn@latest init

问题是一些风格的选择,这里直接默认即可。

shadcn/ui 与其他常规的组件库安装组件的方式不同,每个组件都是独立安装的,所以就可以独立的去维护。

pnpm dlx shadcn@latest add button

这样就可以安装你的第一个按钮组件了,未来使用的组件多了之后,你的 src/components/ui 目录将会是这样:

他的好处显而易见,你可以在项目里直接修改这些组件。

当你查看 shadcn/ui 文档时,可能会疑问,为什么连 API 接口都不写呢?这是因为它实际上是使用 tailwind 对 radix-ui 做了外观的美化,大部分的组件,你可以查看 radix-ui 文档即可。

结语

本文至此结束,今天带大家创建了一个基础的 tauri + next.js 的项目,目前它还是空空如也,没关系,我将在未来的文章中,带大家一步一步的完成这个笔记应用,如果你已经迫不接待的进行下一步,可以查看我的note-gen仓库,参考其中的源码,同时祝你在其他同学中的学习进度遥遥领先。

21 个赞

感觉自己不想学了,但是还是感谢教程分享。

感谢佬友分享

太强了!大佬

我这个项目也是以学习为目的创建起来的,坚持了几个月,收获了知识,得到了 star,还获得了大家的帮助 :grin:

学习学习了,最近也在搞 nextjs和 shadcn/ui 的东西。一眼就吸引进来了

我是被 shadcn/ui 的风格吸引的

佬 在这里 rust 有啥具体功能实现吗 还是说只是个客户端构建工具

是的,确实很好看

其实 tauri 已经提供了非常多的插件,大部分场景都已经可以直接在前端来实现了。系统截图这功能前端无法实现,就只能通过 rust 来实现。
我的原则就是能前端做就做,做不了再考虑 rust,毕竟 rust 我也不是很熟。

懂了 那么如果调用 http 接口 其实可以纯JS 或者 TS 来实现是吧

可以,但是你要用 tauri 提供的 http 插件做,不然跨域问题没办法解决。

哦哦 还有个问题 这里的前端可以单独出来吧 做个 web 页面 不局限于客户端

可以,比如你想跑客户端,那就是 pnpm tauri dev,如果你想跑网页,就是 pnpm dev 就可以了,打包同理。

哦了 感谢解答 :lark_019:

我不建议别用 shadcn/ui,这玩意看起来跟传统组件库是手动挡和自动挡的区别,事实上也确实是手动挡,只不过是自行车的挡 :grimacing:

功能少得可怜就算了,后续更新也很麻烦,如果你修改了组件源码,大概要像git那样处理冲突?(我也只是体验了一下,没到这一步就弃坑了)

能说下为什么选择next吗

软件工程没有银弹

一开始就抱着学习 tauri 的目的开始的,既然是学习,对 next 也不熟悉,就一块学了。

1 个赞

和传统组件库确实不一样,我用久了真的是喜欢。