[{"data":1,"prerenderedAt":1936},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Ftauri-rust-tech-stack-and-build":46,"\u002Fblog\u002Ftauri-rust-tech-stack-and-build-surround":1931},[4],{"title":5,"path":6,"stem":7,"children":8,"page":45},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37,41],{"title":10,"path":11,"stem":12},"吉布斯自由能、化学势与扩散势","\u002Fblog\u002Fchemical-potential-and-diffusion-potential","blog\u002Fchemical-potential-and-diffusion-potential",{"title":14,"path":15,"stem":16},"Deploying Nuxt Static Sites with Nginx","\u002Fblog\u002Fdeploying-nuxt-static-site-with-nginx","blog\u002Fdeploying-nuxt-static-site-with-nginx",{"title":18,"path":19,"stem":20},"相变驱动力计算","\u002Fblog\u002Fphase-transformation-driving-force","blog\u002Fphase-transformation-driving-force",{"title":22,"path":23,"stem":24},"Python 环境配置完全指南：Conda 与国内镜像源","\u002Fblog\u002Fpython-environment-setup-guide","blog\u002Fpython-environment-setup-guide",{"title":26,"path":27,"stem":28},"Rust 编译与配置指南","\u002Fblog\u002Frust-compilation-and-configuration","blog\u002Frust-compilation-and-configuration",{"title":30,"path":31,"stem":32},"SSH Key Authentication Setup Guide","\u002Fblog\u002Fssh-key-authentication-setup","blog\u002Fssh-key-authentication-setup",{"title":34,"path":35,"stem":36},"Tauri + Rust 技术栈与编译说明","\u002Fblog\u002Ftauri-rust-tech-stack-and-build","blog\u002Ftauri-rust-tech-stack-and-build",{"title":38,"path":39,"stem":40},"Complete Guide to Utoipa Integration with Axum","\u002Fblog\u002Futoipa-integration-with-axum","blog\u002Futoipa-integration-with-axum",{"title":42,"path":43,"stem":44},"Rust: Code Once, Build Anywhere","\u002Fblog\u002Fwhy-rust-priority","blog\u002Fwhy-rust-priority",false,{"id":47,"title":34,"author":48,"body":52,"date":1924,"description":1925,"extension":1926,"image":1927,"meta":1928,"minRead":1577,"navigation":1439,"path":35,"seo":1929,"stem":36,"__hash__":1930},"blog\u002Fblog\u002Ftauri-rust-tech-stack-and-build.md",{"name":49,"avatar":50},"Jing Zhong",{"src":51,"alt":49},"https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002Fme.jpg",{"type":53,"value":54,"toc":1887},"minimark",[55,67,70,75,81,94,97,99,103,108,111,132,136,146,150,188,192,279,281,285,307,311,319,351,354,388,392,401,404,426,428,454,458,461,466,477,480,509,520,524,540,543,546,579,582,584,588,592,613,616,630,634,652,654,680,685,689,705,707,736,742,798,813,816,822,825,831,835,967,969,973,977,982,996,1000,1070,1074,1077,1130,1132,1136,1142,1144,1148,1152,1173,1177,1182,1189,1209,1253,1257,1271,1275,1290,1305,1309,1320,1325,1386,1391,1404,1409,1412,1600,1606,1611,1677,1682,1732,1734,1738,1741,1824,1827,1840,1842,1846,1883],[56,57,58],"blockquote",{},[59,60,61,62,66],"p",{},"本文以 ",[63,64,65],"code",{},"csv_editor_app"," 为例，说明基于 Tauri 2 + Rust + React + Vite + TypeScript 的桌面应用开发环境、编译流程与技术栈。",[68,69],"hr",{},[71,72,74],"h2",{"id":73},"_0-参考项目","0. 参考项目",[59,76,77,78,80],{},"本文配套的示例项目 ",[63,79,65],{}," 可以从以下地址下载：",[82,83,84],"ul",{},[85,86,87],"li",{},[88,89,93],"a",{"href":90,"rel":91},"https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002Fcsv_editor_app-main.zip",[92],"nofollow","csv_editor_app-main.zip",[59,95,96],{},"下载后解压，即可按照下文步骤进行编译和运行。",[68,98],{},[71,100,102],{"id":101},"_1-tauri-rust-框架介绍","1. Tauri + Rust 框架介绍",[104,105,107],"h3",{"id":106},"_11-什么是-tauri","1.1 什么是 Tauri",[59,109,110],{},"Tauri 是一个使用 Web 前端技术构建跨平台桌面应用（以及移动端应用）的框架。它的核心思路是：",[82,112,113,120,126],{},[85,114,115,119],{},[116,117,118],"strong",{},"前端","：使用 React \u002F Vue \u002F Svelte \u002F 原生 JS 等 Web 技术开发界面。",[85,121,122,125],{},[116,123,124],{},"后端\u002F原生层","：使用 Rust 编写，负责与操作系统交互（窗口、文件、对话框、通知等）。",[85,127,128,131],{},[116,129,130],{},"运行时","：操作系统自带的 WebView 渲染前端，Rust 进程提供原生能力，二者通过 Tauri 的 IPC 机制通信。",[104,133,135],{"id":134},"_12-架构模式","1.2 架构模式",[137,138,144],"pre",{"className":139,"code":141,"language":142,"meta":143},[140],"language-text","┌─────────────────────────────────────────┐\n│  前端 UI 层（React + TypeScript）          │\n│  运行在系统 WebView 中                   │\n└────────────┬────────────────────────────┘\n             │ IPC（进程间通信）\n┌────────────▼────────────────────────────┐\n│  Rust 后端层（Tauri Runtime）             │\n│  窗口管理、文件读写、系统对话框等         │\n└─────────────────────────────────────────┘\n","text","",[63,145,141],{"__ignoreMap":143},[104,147,149],{"id":148},"_13-tauri-rust-的主要优势","1.3 Tauri + Rust 的主要优势",[82,151,152,158,164,170,176,182],{},[85,153,154,157],{},[116,155,156],{},"体积小","：相比 Electron，Tauri 应用不需要打包 Chromium，安装包通常只有几 MB 到十几 MB。",[85,159,160,163],{},[116,161,162],{},"启动快、内存占用低","：运行时复用系统 WebView，没有冗余的浏览器内核。",[85,165,166,169],{},[116,167,168],{},"安全性高","：Rust 的内存安全特性 + Tauri 的权限系统（capabilities），默认最小权限原则。",[85,171,172,175],{},[116,173,174],{},"原生性能","：文件 IO、CPU 密集型计算等操作在 Rust 侧执行，性能接近原生应用。",[85,177,178,181],{},[116,179,180],{},"跨平台","：一份代码可构建 Windows、macOS、Linux 桌面应用；Tauri 2 还支持 iOS \u002F Android 移动端构建。",[85,183,184,187],{},[116,185,186],{},"复用 Web 生态","：前端可以复用 npm 生态中的 UI 库、工具链、组件库等。",[104,189,191],{"id":190},"_14-tauri-与-electron-的对比","1.4 Tauri 与 Electron 的对比",[193,194,195,211],"table",{},[196,197,198],"thead",{},[199,200,201,205,208],"tr",{},[202,203,204],"th",{},"特性",[202,206,207],{},"Tauri",[202,209,210],{},"Electron",[212,213,214,225,236,247,258,269],"tbody",{},[199,215,216,219,222],{},[217,218,130],"td",{},[217,220,221],{},"系统 WebView",[217,223,224],{},"内置 Chromium + Node.js",[199,226,227,230,233],{},[217,228,229],{},"包体积",[217,231,232],{},"通常 \u003C 5 MB",[217,234,235],{},"通常 > 100 MB",[199,237,238,241,244],{},[217,239,240],{},"内存占用",[217,242,243],{},"较低",[217,245,246],{},"较高",[199,248,249,252,255],{},[217,250,251],{},"后端语言",[217,253,254],{},"Rust",[217,256,257],{},"Node.js",[199,259,260,263,266],{},[217,261,262],{},"安全模型",[217,264,265],{},"基于 capabilities，IPC 受限",[217,267,268],{},"需额外加固",[199,270,271,274,277],{},[217,272,273],{},"前端技术",[217,275,276],{},"任意 Web 框架",[217,278,276],{},[68,280],{},[71,282,284],{"id":283},"_2-基础开发环境安装","2. 基础开发环境安装",[59,286,287,288,291,292,294,295,298,299,302,303,306],{},"本项目默认使用 ",[116,289,290],{},"bun"," 作为包管理器，请优先使用 bun 执行所有前端依赖安装与脚本命令。若不使用 bun，需自行将下述命令中的 ",[63,293,290],{}," 替换为对应的包管理器，并同步修改 ",[63,296,297],{},"src-tauri\u002Ftauri.conf.json"," 中的 ",[63,300,301],{},"beforeDevCommand"," 和 ",[63,304,305],{},"beforeBuildCommand","。",[104,308,310],{"id":309},"_21-nodejs-bun","2.1 Node.js \u002F bun",[59,312,313,314,318],{},"Tauri 前端使用 npm 生态。项目脚本默认通过 bun 调用，因此需要先安装 ",[88,315,290],{"href":316,"rel":317},"https:\u002F\u002Fbun.sh\u002F",[92],"。同时需要安装 Node.js（建议 LTS v22 或更高）以兼容前端工具链。",[82,320,321,336],{},[85,322,323,324,327,328,331,332,335],{},"建议安装 ",[116,325,326],{},"LTS 版本","（当前项目依赖 ",[63,329,330],{},"@types\u002Fnode: ^24.12.0","，建议 Node.js ",[63,333,334],{},"v22"," 或更高）。",[85,337,338,339,344,345,350],{},"使用 ",[88,340,343],{"href":341,"rel":342},"https:\u002F\u002Fnodejs.org\u002F",[92],"nodejs.org"," 官网安装包，或通过 ",[88,346,349],{"href":347,"rel":348},"https:\u002F\u002Fgithub.com\u002Fcoreybutler\u002Fnvm-windows",[92],"nvm-windows"," 管理多版本。",[59,352,353],{},"安装后验证：",[137,355,359],{"className":356,"code":357,"language":358,"meta":143,"style":143},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","node -v   # 例如 v22.x.x\nbun -v    # 例如 1.x.x\n","bash",[63,360,361,378],{"__ignoreMap":143},[362,363,366,370,374],"span",{"class":364,"line":365},"line",1,[362,367,369],{"class":368},"sBMFI","node",[362,371,373],{"class":372},"sfazB"," -v",[362,375,377],{"class":376},"sHwdD","   # 例如 v22.x.x\n",[362,379,381,383,385],{"class":364,"line":380},2,[362,382,290],{"class":368},[362,384,373],{"class":372},[362,386,387],{"class":376},"    # 例如 1.x.x\n",[104,389,391],{"id":390},"_22-rust-与-cargo","2.2 Rust 与 Cargo",[59,393,394,395,400],{},"Tauri 后端使用 Rust，通过 ",[88,396,399],{"href":397,"rel":398},"https:\u002F\u002Frustup.rs\u002F",[92],"rustup"," 安装最新稳定版。",[59,402,403],{},"Windows 安装步骤：",[405,406,407,413,420,423],"ol",{},[85,408,409,410],{},"访问 ",[88,411,397],{"href":397,"rel":412},[92],[85,414,415,416,419],{},"下载 ",[63,417,418],{},"rustup-init.exe"," 并运行。",[85,421,422],{},"按提示选择默认安装（选项 1 - Proceed with default install）。",[85,424,425],{},"安装完成后可能需要重新打开终端，或按提示执行环境变量刷新命令。",[59,427,353],{},[137,429,431],{"className":356,"code":430,"language":358,"meta":143,"style":143},"rustc --version   # 例如 rustc 1.x.x\ncargo --version   # 例如 cargo 1.x.x\n",[63,432,433,444],{"__ignoreMap":143},[362,434,435,438,441],{"class":364,"line":365},[362,436,437],{"class":368},"rustc",[362,439,440],{"class":372}," --version",[362,442,443],{"class":376},"   # 例如 rustc 1.x.x\n",[362,445,446,449,451],{"class":364,"line":380},[362,447,448],{"class":368},"cargo",[362,450,440],{"class":372},[362,452,453],{"class":376},"   # 例如 cargo 1.x.x\n",[104,455,457],{"id":456},"_23-windows-下的-tauri-系统依赖","2.3 Windows 下的 Tauri 系统依赖",[59,459,460],{},"Windows 平台编译 Tauri 需要以下额外工具：",[462,463,465],"h4",{"id":464},"_1microsoft-visual-c-build-tools","（1）Microsoft Visual C++ Build Tools",[59,467,468,469,472,473,476],{},"Tauri 2 在 Windows 上编译 Rust 代码需要 MSVC 编译器。推荐安装 ",[116,470,471],{},"Visual Studio Build Tools"," 的 ",[116,474,475],{},"使用 C++ 的桌面开发"," 工作负载。",[59,478,479],{},"通过 winget 安装示例：",[137,481,483],{"className":356,"code":482,"language":358,"meta":143,"style":143},"winget install Microsoft.VisualStudio.2022.BuildTools --override \"--wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended\"\n",[63,484,485],{"__ignoreMap":143},[362,486,487,490,493,496,499,503,506],{"class":364,"line":365},[362,488,489],{"class":368},"winget",[362,491,492],{"class":372}," install",[362,494,495],{"class":372}," Microsoft.VisualStudio.2022.BuildTools",[362,497,498],{"class":372}," --override",[362,500,502],{"class":501},"sMK4o"," \"",[362,504,505],{"class":372},"--wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended",[362,507,508],{"class":501},"\"\n",[59,510,511,512,517,518,306],{},"或者从 ",[88,513,516],{"href":514,"rel":515},"https:\u002F\u002Fvisualstudio.microsoft.com\u002Fvisual-cpp-build-tools\u002F",[92],"Visual Studio 下载页面"," 手动下载 Build Tools 并勾选 ",[116,519,475],{},[462,521,523],{"id":522},"_2webview2-runtime","（2）WebView2 Runtime",[82,525,526,529,532],{},[85,527,528],{},"Windows 10\u002F11 通常已内置 WebView2 运行时。",[85,530,531],{},"开发构建需要 WebView2 SDK，Tauri 工具链通常会自动处理。",[85,533,534,535,306],{},"如出现异常，可手动安装 ",[88,536,539],{"href":537,"rel":538},"https:\u002F\u002Fdeveloper.microsoft.com\u002Fen-us\u002Fmicrosoft-edge\u002Fwebview2\u002F",[92],"WebView2 Runtime",[462,541,542],{"id":542},"环境验证",[59,544,545],{},"完成上述安装后，在 PowerShell 或 Git Bash 中执行：",[137,547,549],{"className":356,"code":548,"language":358,"meta":143,"style":143},"rustc --version\ncargo --version\nnode -v\nbun -v\n",[63,550,551,558,564,572],{"__ignoreMap":143},[362,552,553,555],{"class":364,"line":365},[362,554,437],{"class":368},[362,556,557],{"class":372}," --version\n",[362,559,560,562],{"class":364,"line":380},[362,561,448],{"class":368},[362,563,557],{"class":372},[362,565,567,569],{"class":364,"line":566},3,[362,568,369],{"class":368},[362,570,571],{"class":372}," -v\n",[362,573,575,577],{"class":364,"line":574},4,[362,576,290],{"class":368},[362,578,571],{"class":372},[59,580,581],{},"全部正常输出版本号即表示 Windows 开发环境准备就绪。",[68,583],{},[71,585,587],{"id":586},"_3-项目快速编译","3. 项目快速编译",[104,589,591],{"id":590},"_31-进入项目目录并安装依赖","3.1 进入项目目录并安装依赖",[137,593,595],{"className":356,"code":594,"language":358,"meta":143,"style":143},"cd apps\u002Fcsv_editor_app\nbun install\n",[63,596,597,606],{"__ignoreMap":143},[362,598,599,603],{"class":364,"line":365},[362,600,602],{"class":601},"s2Zo4","cd",[362,604,605],{"class":372}," apps\u002Fcsv_editor_app\n",[362,607,608,610],{"class":364,"line":380},[362,609,290],{"class":368},[362,611,612],{"class":372}," install\n",[59,614,615],{},"执行后：",[82,617,618,624],{},[85,619,620,621,306],{},"前端依赖下载到 ",[63,622,623],{},"node_modules\u002F",[85,625,626,629],{},[63,627,628],{},"src-tauri\u002FCargo.toml"," 中的 Rust 依赖会通过 Cargo 自动下载。",[104,631,633],{"id":632},"_32-开发模式编译运行","3.2 开发模式编译运行",[137,635,637],{"className":356,"code":636,"language":358,"meta":143,"style":143},"bun run tauri dev\n",[63,638,639],{"__ignoreMap":143},[362,640,641,643,646,649],{"class":364,"line":365},[362,642,290],{"class":368},[362,644,645],{"class":372}," run",[362,647,648],{"class":372}," tauri",[362,650,651],{"class":372}," dev\n",[59,653,615],{},[82,655,656,667,670],{},[85,657,658,659,662,663,666],{},"Vite 启动前端开发服务器，固定端口 ",[63,660,661],{},"1424","（见 ",[63,664,665],{},"vite.config.ts","）。",[85,668,669],{},"Cargo 编译 Rust 后端，生成调试版本可执行文件。",[85,671,672,673,676,677,306],{},"自动打开应用窗口，标题为 ",[63,674,675],{},"CSV Editor","，默认尺寸 ",[63,678,679],{},"1200x800",[56,681,682],{},[59,683,684],{},"首次编译 Rust 会下载并编译大量依赖，耗时较长，后续会利用增量编译加速。",[104,686,688],{"id":687},"_33-生产模式编译打包","3.3 生产模式编译打包",[137,690,692],{"className":356,"code":691,"language":358,"meta":143,"style":143},"bun run tauri build\n",[63,693,694],{"__ignoreMap":143},[362,695,696,698,700,702],{"class":364,"line":365},[362,697,290],{"class":368},[362,699,645],{"class":372},[362,701,648],{"class":372},[362,703,704],{"class":372}," build\n",[59,706,615],{},[82,708,709,719,722],{},[85,710,711,712,715,716,306],{},"前端执行 ",[63,713,714],{},"tsc -b && vite build","，输出到 ",[63,717,718],{},"dist\u002F",[85,720,721],{},"Rust 以 release 模式编译。",[85,723,724,725,728,729,732,733,666],{},"默认不打包安装程序（",[63,726,727],{},"tauri.conf.json"," 中 ",[63,730,731],{},"bundle.active"," 为 ",[63,734,735],{},"false",[59,737,738,739,741],{},"本项目 ",[63,740,727],{}," 当前打包配置如下：",[137,743,747],{"className":744,"code":745,"language":746,"meta":143,"style":143},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"bundle\": {\n    \"active\": false\n  }\n}\n","json",[63,748,749,754,772,787,792],{"__ignoreMap":143},[362,750,751],{"class":364,"line":365},[362,752,753],{"class":501},"{\n",[362,755,756,759,763,766,769],{"class":364,"line":380},[362,757,758],{"class":501},"  \"",[362,760,762],{"class":761},"spNyl","bundle",[362,764,765],{"class":501},"\"",[362,767,768],{"class":501},":",[362,770,771],{"class":501}," {\n",[362,773,774,777,780,782,784],{"class":364,"line":566},[362,775,776],{"class":501},"    \"",[362,778,779],{"class":368},"active",[362,781,765],{"class":501},[362,783,768],{"class":501},[362,785,786],{"class":501}," false\n",[362,788,789],{"class":364,"line":574},[362,790,791],{"class":501},"  }\n",[362,793,795],{"class":364,"line":794},5,[362,796,797],{"class":501},"}\n",[59,799,800,801,804,805,808,809,812],{},"如需生成安装包，可将其改为 ",[63,802,803],{},"true"," 并配置 ",[63,806,807],{},"targets","（如 ",[63,810,811],{},"nsis","）。注意首次打包安装程序可能需要从网络下载 NSIS 工具。",[59,814,815],{},"产物默认位于：",[137,817,820],{"className":818,"code":819,"language":142,"meta":143},[140],"csv_editor_app\u002Fsrc-tauri\u002Ftarget\u002Frelease\u002F\n",[63,821,819],{"__ignoreMap":143},[59,823,824],{},"直接可执行文件为：",[137,826,829],{"className":827,"code":828,"language":142,"meta":143},[140],"src-tauri\u002Ftarget\u002Frelease\u002Fcsv-editor-app.exe\n",[63,830,828],{"__ignoreMap":143},[104,832,834],{"id":833},"_34-常用脚本速查","3.4 常用脚本速查",[137,836,838],{"className":356,"code":837,"language":358,"meta":143,"style":143},"bun run dev          # 仅启动 Vite 前端开发服务器（不启动 Tauri 窗口）\nbun run build        # 仅构建前端静态资源到 dist\u002F\nbun run preview      # 预览生产构建后的前端\nbun run tauri dev    # 启动 Tauri 开发模式（Vite + Rust + 窗口）\nbun run tauri build  # 完整构建 Tauri 桌面应用安装包\nbun run test         # 运行 Vitest 单元测试\nbun run test:run     # 单次运行 Vitest 测试\nbun run lint         # 运行 ESLint 检查\nbun run format       # 使用 Prettier 格式化代码\nbun run typecheck    # 运行 TypeScript 类型检查\n",[63,839,840,852,864,876,889,902,915,928,941,954],{"__ignoreMap":143},[362,841,842,844,846,849],{"class":364,"line":365},[362,843,290],{"class":368},[362,845,645],{"class":372},[362,847,848],{"class":372}," dev",[362,850,851],{"class":376},"          # 仅启动 Vite 前端开发服务器（不启动 Tauri 窗口）\n",[362,853,854,856,858,861],{"class":364,"line":380},[362,855,290],{"class":368},[362,857,645],{"class":372},[362,859,860],{"class":372}," build",[362,862,863],{"class":376},"        # 仅构建前端静态资源到 dist\u002F\n",[362,865,866,868,870,873],{"class":364,"line":566},[362,867,290],{"class":368},[362,869,645],{"class":372},[362,871,872],{"class":372}," preview",[362,874,875],{"class":376},"      # 预览生产构建后的前端\n",[362,877,878,880,882,884,886],{"class":364,"line":574},[362,879,290],{"class":368},[362,881,645],{"class":372},[362,883,648],{"class":372},[362,885,848],{"class":372},[362,887,888],{"class":376},"    # 启动 Tauri 开发模式（Vite + Rust + 窗口）\n",[362,890,891,893,895,897,899],{"class":364,"line":794},[362,892,290],{"class":368},[362,894,645],{"class":372},[362,896,648],{"class":372},[362,898,860],{"class":372},[362,900,901],{"class":376},"  # 完整构建 Tauri 桌面应用安装包\n",[362,903,905,907,909,912],{"class":364,"line":904},6,[362,906,290],{"class":368},[362,908,645],{"class":372},[362,910,911],{"class":372}," test",[362,913,914],{"class":376},"         # 运行 Vitest 单元测试\n",[362,916,918,920,922,925],{"class":364,"line":917},7,[362,919,290],{"class":368},[362,921,645],{"class":372},[362,923,924],{"class":372}," test:run",[362,926,927],{"class":376},"     # 单次运行 Vitest 测试\n",[362,929,931,933,935,938],{"class":364,"line":930},8,[362,932,290],{"class":368},[362,934,645],{"class":372},[362,936,937],{"class":372}," lint",[362,939,940],{"class":376},"         # 运行 ESLint 检查\n",[362,942,944,946,948,951],{"class":364,"line":943},9,[362,945,290],{"class":368},[362,947,645],{"class":372},[362,949,950],{"class":372}," format",[362,952,953],{"class":376},"       # 使用 Prettier 格式化代码\n",[362,955,957,959,961,964],{"class":364,"line":956},10,[362,958,290],{"class":368},[362,960,645],{"class":372},[362,962,963],{"class":372}," typecheck",[362,965,966],{"class":376},"    # 运行 TypeScript 类型检查\n",[68,968],{},[71,970,972],{"id":971},"_4-csv_editor_app-功能与技术栈","4. csv_editor_app 功能与技术栈",[104,974,976],{"id":975},"_41-项目功能","4.1 项目功能",[59,978,979,981],{},[63,980,65],{}," 是一个基于 Tauri 2 的桌面端 CSV 查看与编辑工具，核心功能包括：",[82,983,984,987,990,993],{},[85,985,986],{},"通过系统对话框打开本地 CSV 文件。",[85,988,989],{},"以表格形式展示 CSV 内容并支持编辑。",[85,991,992],{},"将修改后的内容保存为 CSV 文件。",[85,994,995],{},"提供简洁的工具栏与状态管理。",[104,997,999],{"id":998},"_42-主要技术栈","4.2 主要技术栈",[193,1001,1002,1012],{},[196,1003,1004],{},[199,1005,1006,1009],{},[202,1007,1008],{},"层级",[202,1010,1011],{},"技术",[212,1013,1014,1022,1030,1038,1046,1054,1062],{},[199,1015,1016,1019],{},[217,1017,1018],{},"前端 UI",[217,1020,1021],{},"React 19 + TypeScript",[199,1023,1024,1027],{},[217,1025,1026],{},"构建工具",[217,1028,1029],{},"Vite 7",[199,1031,1032,1035],{},[217,1033,1034],{},"样式",[217,1036,1037],{},"Tailwind CSS 4 + shadcn\u002Fui",[199,1039,1040,1043],{},[217,1041,1042],{},"状态管理",[217,1044,1045],{},"Zustand 5",[199,1047,1048,1051],{},[217,1049,1050],{},"测试",[217,1052,1053],{},"Vitest",[199,1055,1056,1059],{},[217,1057,1058],{},"后端\u002F原生能力",[217,1060,1061],{},"Rust + Tauri 2",[199,1063,1064,1067],{},[217,1065,1066],{},"代码规范",[217,1068,1069],{},"ESLint 9 + Prettier 3",[104,1071,1073],{"id":1072},"_43-进一步探索","4.3 进一步探索",[59,1075,1076],{},"以下文件值得自行阅读：",[82,1078,1079,1085,1090,1095,1100,1106,1112,1118,1124],{},[85,1080,1081,1084],{},[63,1082,1083],{},"package.json","：Node 依赖与脚本。",[85,1086,1087,1089],{},[63,1088,665],{},"：Vite 开发服务器与路径别名配置。",[85,1091,1092,1094],{},[63,1093,628],{},"：Rust 依赖与 release 优化配置。",[85,1096,1097,1099],{},[63,1098,297],{},"：应用名称、窗口、打包目标等核心配置。",[85,1101,1102,1105],{},[63,1103,1104],{},"src-tauri\u002Fcapabilities\u002Fdefault.json","：前端可调用的原生能力权限声明。",[85,1107,1108,1111],{},[63,1109,1110],{},"src-tauri\u002Fsrc\u002Flib.rs","：Rust 入口，插件初始化与窗口事件处理。",[85,1113,1114,1117],{},[63,1115,1116],{},"src\u002Fcomponents\u002FCsvTable.tsx","：CSV 表格组件。",[85,1119,1120,1123],{},[63,1121,1122],{},"src\u002Flib\u002Fcsv.ts","：CSV 解析逻辑。",[85,1125,1126,1129],{},[63,1127,1128],{},"src\u002Fstore\u002FcsvStore.ts","：Zustand 状态管理。",[68,1131],{},[71,1133,1135],{"id":1134},"_5-项目目录结构","5. 项目目录结构",[137,1137,1140],{"className":1138,"code":1139,"language":142,"meta":143},[140],"csv_editor_app\u002F\n├── src\u002F                          # 前端源代码\n│   ├── App.tsx                   # 应用根组件\n│   ├── components\u002F\n│   │   ├── CsvTable.tsx          # CSV 表格展示\u002F编辑组件\n│   │   ├── Toolbar.tsx           # 工具栏组件\n│   │   └── ui\u002F                   # shadcn\u002Fui 组件库\n│   ├── lib\u002F\n│   │   ├── csv.ts                # CSV 解析逻辑\n│   │   ├── csv.test.ts           # CSV 解析单元测试\n│   │   └── file.ts               # 文件操作辅助函数\n│   ├── store\u002F\n│   │   └── csvStore.ts           # Zustand 状态管理\n│   └── main.tsx                  # 前端入口\n├── src-tauri\u002F                    # Rust 后端与 Tauri 配置\n│   ├── src\u002F\n│   │   └── lib.rs                # Rust 入口与插件初始化\n│   ├── Cargo.toml                # Rust 依赖与构建配置\n│   ├── tauri.conf.json           # Tauri 应用配置\n│   ├── capabilities\u002F\n│   │   └── default.json          # 前端可调用原生 API 的权限声明\n│   └── icons\u002F                    # 应用图标\n├── public\u002F                       # 静态资源\n├── dist\u002F                         # 前端生产构建输出\n├── docs\u002F                         # 项目文档\n├── package.json                  # Node 依赖与脚本\n├── vite.config.ts                # Vite 配置\n└── tsconfig*.json                # TypeScript 配置\n",[63,1141,1139],{"__ignoreMap":143},[68,1143],{},[71,1145,1147],{"id":1146},"_6-常见问题","6. 常见问题",[104,1149,1151],{"id":1150},"_61-rust-编译缓慢","6.1 Rust 编译缓慢",[82,1153,1154,1157,1163],{},[85,1155,1156],{},"首次编译会下载并编译大量依赖，建议使用 SSD 并保持网络畅通。",[85,1158,1159,1160,1162],{},"后续开发中，",[63,1161,448],{}," 会利用增量编译显著提速。",[85,1164,738,1165,1168,1169,1172],{},[63,1166,1167],{},"Cargo.toml"," 已开启 ",[63,1170,1171],{},"profile.dev.incremental = true","，提升开发编译速度。",[104,1174,1176],{"id":1175},"_62-windows-上提示缺少-msvc","6.2 Windows 上提示缺少 MSVC",[59,1178,1179,1180,476],{},"安装 Visual Studio Build Tools 的 ",[116,1181,475],{},[104,1183,1185,1186,1188],{"id":1184},"_63-bun-命令找不到","6.3 ",[63,1187,290],{}," 命令找不到",[59,1190,1191,1193,1194,1197,1198,1201,1202,1204,1205,1208],{},[63,1192,727],{}," 当前写的是 ",[63,1195,1196],{},"bun run dev"," \u002F ",[63,1199,1200],{},"bun run build","。如果本机没有安装 ",[63,1203,290],{},"，只有 ",[63,1206,1207],{},"npm","，请将这两项改为：",[137,1210,1212],{"className":744,"code":1211,"language":746,"meta":143,"style":143},"\"beforeDevCommand\": \"npm run dev\",\n\"beforeBuildCommand\": \"npm run build\"\n",[63,1213,1214,1236],{"__ignoreMap":143},[362,1215,1216,1218,1220,1222,1226,1228,1231,1233],{"class":364,"line":365},[362,1217,765],{"class":501},[362,1219,301],{"class":372},[362,1221,765],{"class":501},[362,1223,1225],{"class":1224},"sTEyZ",": ",[362,1227,765],{"class":501},[362,1229,1230],{"class":372},"npm run dev",[362,1232,765],{"class":501},[362,1234,1235],{"class":1224},",\n",[362,1237,1238,1240,1242,1244,1246,1248,1251],{"class":364,"line":380},[362,1239,765],{"class":501},[362,1241,305],{"class":372},[362,1243,765],{"class":501},[362,1245,1225],{"class":1224},[362,1247,765],{"class":501},[362,1249,1250],{"class":372},"npm run build",[362,1252,508],{"class":501},[104,1254,1256],{"id":1255},"_64-前端调用-rust-函数失败","6.4 前端调用 Rust 函数失败",[59,1258,1259,1260,1262,1263,1266,1267,1270],{},"检查 ",[63,1261,1104],{}," 中的权限配置，确保相关能力（如 ",[63,1264,1265],{},"fs:read","、",[63,1268,1269],{},"dialog:open"," 等）已声明并分配给对应窗口。",[104,1272,1274],{"id":1273},"_65-打包时报-nsis-缺失-无法生成安装包","6.5 打包时报 NSIS 缺失 \u002F 无法生成安装包",[59,1276,1277,1278,1281,1282,1285,1286,1289],{},"现象：",[63,1279,1280],{},"bun run tauri build"," 在 Windows 上提示 NSIS 缺失或下载失败（",[63,1283,1284],{},"%TEMP%"," 里可能残留一个下载了却没解压的 ",[63,1287,1288],{},"nsis-3.x.zip","）。原因是本机连不上 GitHub，Tauri 的自动下载中断。",[59,1291,1292,1293,1300,1301,1304],{},"注意 Tauri 在 Windows 上",[116,1294,1295,1296,1299],{},"不用系统已安装的 NSIS、也不读 ",[63,1297,1298],{},"NSIS_PATH"," 环境变量","，只认自己的缓存目录 ",[63,1302,1303],{},"%LOCALAPPDATA%\\tauri\\NSIS\\","，所以\"装一个 NSIS 然后设环境变量\"是无效的。完整的离线修复步骤（基于公司 OSS，已验证可用）见下文「NSIS 工具链（Windows 打包依赖）」一节；该缓存全局共享，配好后本机所有 Tauri 项目均可直接打包。",[104,1306,1308],{"id":1307},"_66-nsis-工具链windows-打包依赖","6.6 NSIS 工具链（Windows 打包依赖）",[59,1310,1311,1312,1315,1316,1319],{},"Tauri 在 Windows 上生成 ",[63,1313,1314],{},".exe"," 安装程序依赖 ",[116,1317,1318],{},"NSIS","。它的获取机制与直觉不同，理解机制才能在自动下载失败时正确处理。",[59,1321,1322],{},[116,1323,1324],{},"工作机制（关键，决定了解决思路）：",[82,1326,1327,1338,1368],{},[85,1328,1329,1330,1335,1336,306],{},"Tauri ",[116,1331,1332,1333,1299],{},"不使用系统已安装的 NSIS，也不读 ",[63,1334,1298],{},"（该变量仅 macOS \u002F Linux 生效）。Windows 下它只认自己缓存目录里的 NSIS：",[63,1337,1303],{},[85,1339,1340,1341,1344,1345],{},"首次打包时，Tauri 会从 ",[116,1342,1343],{},"GitHub"," 自动下载两份文件到该缓存：\n",[405,1346,1347,1357],{},[85,1348,1349,1350,1352,1353,1356],{},"NSIS 本体（",[63,1351,1288],{},"，来自 ",[63,1354,1355],{},"tauri-apps\u002Fbinary-releases","）；",[85,1358,1359,1360,1363,1364,1367],{},"Tauri 专属插件 ",[63,1361,1362],{},"nsis_tauri_utils.dll","（来自 ",[63,1365,1366],{},"tauri-apps\u002Fnsis-tauri-utils","，当前 v0.5.3）。",[85,1369,1370,1371,1374,1375,1378,1379,1381,1382,1385],{},"每次打包前，Tauri 会校验缓存中 13 个必需文件（",[63,1372,1373],{},"NSIS_REQUIRED_FILES","）是否齐全——",[116,1376,1377],{},"缺任意一个就会整体删除并重新下载","。其中只有 ",[63,1380,1362],{}," 会被哈希校验（SHA1 ",[63,1383,1384],{},"75197fee3c6a814fe035788d1c34ead39349b860","），NSIS 本体文件只检查是否存在。",[59,1387,1388],{},[116,1389,1390],{},"常见故障现象（国内网络环境）：",[59,1392,1393,1394,1396,1397,1399,1400,1403],{},"打包时报 NSIS 缺失 \u002F 下载失败，且 ",[63,1395,1284],{}," 下残留一个下载了却没解压的 ",[63,1398,1288],{},"。根因是本机",[116,1401,1402],{},"无法稳定访问 GitHub","（自动下载源头），导致下载或解压中断；杀毒软件误删缓存目录也会引发同样现象。",[59,1405,1406],{},[116,1407,1408],{},"离线安装（推荐，已验证可用）：",[59,1410,1411],{},"公司已将所需文件发布到内网可达的 OSS，可完全不依赖 GitHub 完成配置。在 Git Bash 中执行：",[137,1413,1415],{"className":356,"code":1414,"language":358,"meta":143,"style":143},"CACHE=\"$LOCALAPPDATA\u002Ftauri\"\n\n# 1) 安装 NSIS 3.12（运行安装包，默认装到 C:\\Program Files (x86)\\NSIS）\n#    下载：https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002F3rd\u002Fnsis-3.12-setup.exe\n\n# 2) 把安装好的 NSIS 整体复制进 Tauri 缓存目录，命名为 NSIS\nmkdir -p \"$CACHE\"\nrm -rf \"$CACHE\u002FNSIS\"\ncp -r \"\u002Fc\u002FProgram Files (x86)\u002FNSIS\" \"$CACHE\u002FNSIS\"\n\n# 3) 下载 Tauri 专属插件到指定位置\nmkdir -p \"$CACHE\u002FNSIS\u002FPlugins\u002Fx86-unicode\u002Fadditional\"\ncurl -L \"https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002F3rd\u002Fnsis_tauri_utils.dll\" \\\n  -o \"$CACHE\u002FNSIS\u002FPlugins\u002Fx86-unicode\u002Fadditional\u002Fnsis_tauri_utils.dll\"\n\n# 4) 校验插件完整性（应输出 75197fee3c6a814fe035788d1c34ead39349b860）\nsha1sum \"$CACHE\u002FNSIS\u002FPlugins\u002Fx86-unicode\u002Fadditional\u002Fnsis_tauri_utils.dll\"\n",[63,1416,1417,1435,1441,1446,1451,1455,1460,1475,1492,1515,1519,1525,1541,1560,1575,1580,1586],{"__ignoreMap":143},[362,1418,1419,1422,1425,1427,1430,1433],{"class":364,"line":365},[362,1420,1421],{"class":1224},"CACHE",[362,1423,1424],{"class":501},"=",[362,1426,765],{"class":501},[362,1428,1429],{"class":1224},"$LOCALAPPDATA",[362,1431,1432],{"class":372},"\u002Ftauri",[362,1434,508],{"class":501},[362,1436,1437],{"class":364,"line":380},[362,1438,1440],{"emptyLinePlaceholder":1439},true,"\n",[362,1442,1443],{"class":364,"line":566},[362,1444,1445],{"class":376},"# 1) 安装 NSIS 3.12（运行安装包，默认装到 C:\\Program Files (x86)\\NSIS）\n",[362,1447,1448],{"class":364,"line":574},[362,1449,1450],{"class":376},"#    下载：https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002F3rd\u002Fnsis-3.12-setup.exe\n",[362,1452,1453],{"class":364,"line":794},[362,1454,1440],{"emptyLinePlaceholder":1439},[362,1456,1457],{"class":364,"line":904},[362,1458,1459],{"class":376},"# 2) 把安装好的 NSIS 整体复制进 Tauri 缓存目录，命名为 NSIS\n",[362,1461,1462,1465,1468,1470,1473],{"class":364,"line":917},[362,1463,1464],{"class":368},"mkdir",[362,1466,1467],{"class":372}," -p",[362,1469,502],{"class":501},[362,1471,1472],{"class":1224},"$CACHE",[362,1474,508],{"class":501},[362,1476,1477,1480,1483,1485,1487,1490],{"class":364,"line":930},[362,1478,1479],{"class":368},"rm",[362,1481,1482],{"class":372}," -rf",[362,1484,502],{"class":501},[362,1486,1472],{"class":1224},[362,1488,1489],{"class":372},"\u002FNSIS",[362,1491,508],{"class":501},[362,1493,1494,1497,1500,1502,1505,1507,1509,1511,1513],{"class":364,"line":943},[362,1495,1496],{"class":368},"cp",[362,1498,1499],{"class":372}," -r",[362,1501,502],{"class":501},[362,1503,1504],{"class":372},"\u002Fc\u002FProgram Files (x86)\u002FNSIS",[362,1506,765],{"class":501},[362,1508,502],{"class":501},[362,1510,1472],{"class":1224},[362,1512,1489],{"class":372},[362,1514,508],{"class":501},[362,1516,1517],{"class":364,"line":956},[362,1518,1440],{"emptyLinePlaceholder":1439},[362,1520,1522],{"class":364,"line":1521},11,[362,1523,1524],{"class":376},"# 3) 下载 Tauri 专属插件到指定位置\n",[362,1526,1528,1530,1532,1534,1536,1539],{"class":364,"line":1527},12,[362,1529,1464],{"class":368},[362,1531,1467],{"class":372},[362,1533,502],{"class":501},[362,1535,1472],{"class":1224},[362,1537,1538],{"class":372},"\u002FNSIS\u002FPlugins\u002Fx86-unicode\u002Fadditional",[362,1540,508],{"class":501},[362,1542,1544,1547,1550,1552,1555,1557],{"class":364,"line":1543},13,[362,1545,1546],{"class":368},"curl",[362,1548,1549],{"class":372}," -L",[362,1551,502],{"class":501},[362,1553,1554],{"class":372},"https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002F3rd\u002Fnsis_tauri_utils.dll",[362,1556,765],{"class":501},[362,1558,1559],{"class":1224}," \\\n",[362,1561,1563,1566,1568,1570,1573],{"class":364,"line":1562},14,[362,1564,1565],{"class":372},"  -o",[362,1567,502],{"class":501},[362,1569,1472],{"class":1224},[362,1571,1572],{"class":372},"\u002FNSIS\u002FPlugins\u002Fx86-unicode\u002Fadditional\u002Fnsis_tauri_utils.dll",[362,1574,508],{"class":501},[362,1576,1578],{"class":364,"line":1577},15,[362,1579,1440],{"emptyLinePlaceholder":1439},[362,1581,1583],{"class":364,"line":1582},16,[362,1584,1585],{"class":376},"# 4) 校验插件完整性（应输出 75197fee3c6a814fe035788d1c34ead39349b860）\n",[362,1587,1589,1592,1594,1596,1598],{"class":364,"line":1588},17,[362,1590,1591],{"class":368},"sha1sum",[362,1593,502],{"class":501},[362,1595,1472],{"class":1224},[362,1597,1572],{"class":372},[362,1599,508],{"class":501},[59,1601,1602,1603,1605],{},"完成后回到项目执行 ",[63,1604,1280],{},"，Tauri 会跳过下载直接打包。",[59,1607,1608],{},[116,1609,1610],{},"注意事项：",[82,1612,1613,1623,1632,1646],{},[85,1614,1615,1618,1619,1622],{},[116,1616,1617],{},"版本差异不影响打包","：OSS 提供的是 NSIS 3.12，而 Tauri 默认下载 3.11。由于 Tauri 每次只校验插件 dll 的哈希、本体文件只查存在性，用 3.12 本体 + 正确插件即可正常打包（已在 ",[63,1620,1621],{},"@tauri-apps\u002Fcli"," 2.11.x 实测通过）。",[85,1624,1625,1628,1629,1631],{},[116,1626,1627],{},"缓存全局共享","：配好一次后，本机所有 Tauri 项目共用 ",[63,1630,1303],{},"，无需对每个项目重复操作——新项目遇到同样问题，先检查该目录是否完整即可。",[85,1633,1634,1637,1638,1641,1642,1645],{},[116,1635,1636],{},"持久性","：只要该缓存目录不被清理即可长期使用。建议在杀毒软件中把 ",[63,1639,1640],{},"%LOCALAPPDATA%\\tauri\\"," 加入白名单，避免 ",[63,1643,1644],{},"makensis.exe"," 被误删后再次触发 GitHub 下载。",[85,1647,1648,1651,1652,1654,1655,1657,1658,1197,1661,1664,1665,1668,1669,1672,1673,1676],{},[116,1649,1650],{},"Tauri 升级后插件版本漂移怎么办","：OSS 上的 ",[63,1653,1362],{}," 是 v0.5.3，与当前 ",[63,1656,1621],{}," 2.x 匹配。若升级 Tauri 后构建报插件哈希不匹配（日志出现 ",[63,1659,1660],{},"mis-hashed files",[63,1662,1663],{},"Redownloading","），说明 OSS 版本已过时——",[116,1666,1667],{},"直接自行下载即可，无需更新本文档的 SHA1","：构建日志里会给出新的下载地址（形如 ",[63,1670,1671],{},"nsis_tauri_utils-vX.Y.Z","），用浏览器从 GitHub 取回该 dll，替换缓存目录下 ",[63,1674,1675],{},"NSIS\\Plugins\\x86-unicode\\additional\\nsis_tauri_utils.dll"," 即可。NSIS 本体不受影响，无需重装。",[59,1678,1679],{},[116,1680,1681],{},"相关下载地址汇总：",[193,1683,1684,1697],{},[196,1685,1686],{},[199,1687,1688,1691,1694],{},[202,1689,1690],{},"文件",[202,1692,1693],{},"OSS（内网推荐）",[202,1695,1696],{},"GitHub 官方源（需国际网络）",[212,1698,1699,1716],{},[199,1700,1701,1704,1710],{},[217,1702,1703],{},"NSIS 安装包",[217,1705,1706],{},[88,1707,1708],{"href":1708,"rel":1709},"https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002F3rd\u002Fnsis-3.12-setup.exe",[92],[217,1711,1712],{},[88,1713,1714],{"href":1714,"rel":1715},"https:\u002F\u002Fnsis.sourceforge.io\u002FDownload",[92],[199,1717,1718,1721,1726],{},[217,1719,1720],{},"Tauri 插件",[217,1722,1723],{},[88,1724,1554],{"href":1554,"rel":1725},[92],[217,1727,1728],{},[88,1729,1730],{"href":1730,"rel":1731},"https:\u002F\u002Fgithub.com\u002Ftauri-apps\u002Fnsis-tauri-utils\u002Freleases\u002Ftag\u002Fnsis_tauri_utils-v0.5.3",[92],[68,1733],{},[71,1735,1737],{"id":1736},"_7-其他linux-系统依赖简要说明","7. 其他：Linux 系统依赖（简要说明）",[59,1739,1740],{},"Linux 平台主要需要 GTK 和 WebKitGTK 开发库。以 Ubuntu\u002FDebian 为例：",[137,1742,1744],{"className":356,"code":1743,"language":358,"meta":143,"style":143},"sudo apt update\nsudo apt install libwebkit2gtk-4.1-dev \\\n  build-essential \\\n  curl \\\n  wget \\\n  file \\\n  libxdo3 \\\n  libssl-dev \\\n  libayatana-appindicator3-dev \\\n  librsvg2-dev\n",[63,1745,1746,1757,1770,1777,1784,1791,1798,1805,1812,1819],{"__ignoreMap":143},[362,1747,1748,1751,1754],{"class":364,"line":365},[362,1749,1750],{"class":368},"sudo",[362,1752,1753],{"class":372}," apt",[362,1755,1756],{"class":372}," update\n",[362,1758,1759,1761,1763,1765,1768],{"class":364,"line":380},[362,1760,1750],{"class":368},[362,1762,1753],{"class":372},[362,1764,492],{"class":372},[362,1766,1767],{"class":372}," libwebkit2gtk-4.1-dev",[362,1769,1559],{"class":1224},[362,1771,1772,1775],{"class":364,"line":566},[362,1773,1774],{"class":372},"  build-essential",[362,1776,1559],{"class":1224},[362,1778,1779,1782],{"class":364,"line":574},[362,1780,1781],{"class":372},"  curl",[362,1783,1559],{"class":1224},[362,1785,1786,1789],{"class":364,"line":794},[362,1787,1788],{"class":372},"  wget",[362,1790,1559],{"class":1224},[362,1792,1793,1796],{"class":364,"line":904},[362,1794,1795],{"class":372},"  file",[362,1797,1559],{"class":1224},[362,1799,1800,1803],{"class":364,"line":917},[362,1801,1802],{"class":372},"  libxdo3",[362,1804,1559],{"class":1224},[362,1806,1807,1810],{"class":364,"line":930},[362,1808,1809],{"class":372},"  libssl-dev",[362,1811,1559],{"class":1224},[362,1813,1814,1817],{"class":364,"line":943},[362,1815,1816],{"class":372},"  libayatana-appindicator3-dev",[362,1818,1559],{"class":1224},[362,1820,1821],{"class":364,"line":956},[362,1822,1823],{"class":372},"  librsvg2-dev\n",[59,1825,1826],{},"macOS 环境需要安装 Xcode Command Line Tools：",[137,1828,1830],{"className":356,"code":1829,"language":358,"meta":143,"style":143},"xcode-select --install\n",[63,1831,1832],{"__ignoreMap":143},[362,1833,1834,1837],{"class":364,"line":365},[362,1835,1836],{"class":368},"xcode-select",[362,1838,1839],{"class":372}," --install\n",[68,1841],{},[71,1843,1845],{"id":1844},"_8-参考资源","8. 参考资源",[82,1847,1848,1855,1862,1869,1876],{},[85,1849,1850],{},[88,1851,1854],{"href":1852,"rel":1853},"https:\u002F\u002Ftauri.app\u002F",[92],"Tauri 官方文档",[85,1856,1857],{},[88,1858,1861],{"href":1859,"rel":1860},"https:\u002F\u002Ftauri.app\u002Fstart\u002Fprerequisites\u002F",[92],"Tauri 前置条件",[85,1863,1864],{},[88,1865,1868],{"href":1866,"rel":1867},"https:\u002F\u002Fwww.rust-lang.org\u002Flearn",[92],"Rust 官方文档",[85,1870,1871],{},[88,1872,1875],{"href":1873,"rel":1874},"https:\u002F\u002Fvitejs.dev\u002F",[92],"Vite 官方文档",[85,1877,1878],{},[88,1879,1882],{"href":1880,"rel":1881},"https:\u002F\u002Freact.dev\u002F",[92],"React 官方文档",[1884,1885,1886],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":143,"searchDepth":380,"depth":380,"links":1888},[1889,1890,1896,1901,1907,1912,1913,1922,1923],{"id":73,"depth":380,"text":74},{"id":101,"depth":380,"text":102,"children":1891},[1892,1893,1894,1895],{"id":106,"depth":566,"text":107},{"id":134,"depth":566,"text":135},{"id":148,"depth":566,"text":149},{"id":190,"depth":566,"text":191},{"id":283,"depth":380,"text":284,"children":1897},[1898,1899,1900],{"id":309,"depth":566,"text":310},{"id":390,"depth":566,"text":391},{"id":456,"depth":566,"text":457},{"id":586,"depth":380,"text":587,"children":1902},[1903,1904,1905,1906],{"id":590,"depth":566,"text":591},{"id":632,"depth":566,"text":633},{"id":687,"depth":566,"text":688},{"id":833,"depth":566,"text":834},{"id":971,"depth":380,"text":972,"children":1908},[1909,1910,1911],{"id":975,"depth":566,"text":976},{"id":998,"depth":566,"text":999},{"id":1072,"depth":566,"text":1073},{"id":1134,"depth":380,"text":1135},{"id":1146,"depth":380,"text":1147,"children":1914},[1915,1916,1917,1919,1920,1921],{"id":1150,"depth":566,"text":1151},{"id":1175,"depth":566,"text":1176},{"id":1184,"depth":566,"text":1918},"6.3 bun 命令找不到",{"id":1255,"depth":566,"text":1256},{"id":1273,"depth":566,"text":1274},{"id":1307,"depth":566,"text":1308},{"id":1736,"depth":380,"text":1737},{"id":1844,"depth":380,"text":1845},"2026-08-12","以 csv_editor_app 为例，说明基于 Tauri 2 + Rust + React + Vite + TypeScript 的桌面应用开发环境、编译流程与技术栈。","md","https:\u002F\u002Fppm-sources.oss-cn-hongkong.aliyuncs.com\u002Fzj\u002Ftauri.jpeg",{},{"title":34,"description":1925},"ivLqMA2vBSfDb0Wk3FIzJqjKvH9MmLFuwEWbU7o3z8I",[1932,1934],{"title":30,"path":31,"stem":32,"description":1933,"children":-1},"Learn how to configure SSH key authentication for passwordless remote server login with quick and easy steps.",{"title":38,"path":39,"stem":40,"description":1935,"children":-1},"Learn how to integrate utoipa and Swagger UI in Rust Axum projects to enable OpenAPI documentation with JWT, Cookie, and API Key authentication.",1792686186192]