tauri-2-setup-react-rust_آکادمی تخصصی ریسمان
تاریخ انتشار :
میانگین: 5.0

آموزش راه‌اندازی Tauri 2؛ ساخت برنامه دسکتاپ با React و Rust

اگر می‌خواهید با استفاده از فناوری‌های وب، نرم‌افزار دسکتاپ ویندوز بسازید، Tauri یکی از گزینه‌های مناسب برای شروع است. در این مقاله، راه‌اندازی Tauri 2 را از صفر و به‌صورت مرحله‌به‌مرحله یاد می‌گیرید. ابتدا پیش‌نیازهای نصب Node.js، Rust و ابزارهای کامپایل ویندوز را بررسی می‌کنیم و سپس یک پروژه React و TypeScript می‌سازیم. در ادامه، نحوه اجرای برنامه دسکتاپ، طراحی رابط کاربری با Tailwind CSS و ارتباط میان React و Rust را آموزش می‌دهیم. همچنین با روش اتصال پایگاه داده SQLite، رفع خطاهای رایج و ساخت فایل اجرایی ویندوز آشنا خواهید شد. در پایان، می‌توانید مسیر توسعه یک نرم‌افزار دسکتاپ واقعی مانند سیستم مدیریت بیماران یا برنامه نوبت‌دهی را با Tauri آغاز کنید.

 

Share
Pin
Like
Send
Share
Send
Send
Share

۱. Tauri چیست و چرا باید از آن استفاده کنیم؟

Tauri یک فریم‌ورک متن‌باز برای ساخت برنامه‌های دسکتاپ و سایر برنامه‌های مبتنی بر رابط وب است. در این معماری، رابط کاربری می‌تواند با React، Vue، Svelte یا فناوری‌های مشابه ساخته شود و بخش بومی برنامه با Rust و قابلیت‌های سیستم‌عامل ارتباط برقرار کند. برخلاف تصور بعضی از توسعه‌دهندگان، Tauri صرفاً یک ابزار برای تبدیل سایت به فایل EXE نیست؛ بلکه بستری برای ساخت یک برنامه دسکتاپ با مرز مشخص میان رابط کاربری وب و قابلیت‌های بومی سیستم‌عامل فراهم می‌کند. برای مثال، می‌توانید فرم ثبت بیمار را با React بسازید، اعتبارسنجی داده‌ها را در رابط کاربری انجام دهید و سپس از طریق فرمان‌های Rust اطلاعات را در پایگاه داده ذخیره کنید.

یکی از ویژگی‌های مهم Tauri استفاده از موتور وب موجود در سیستم‌عامل است. در ویندوز، این موتور بر پایه WebView2 است که از فناوری‌های Microsoft Edge استفاده می‌کند. به همین دلیل، Tauri معمولاً نیازی ندارد یک نسخه کامل از مرورگر را همراه برنامه توزیع کند؛ موضوعی که می‌تواند اندازه بسته نصب را کاهش دهد. البته اندازه نهایی به وابستگی‌ها، فایل‌های جانبی، پایگاه داده، آیکون‌ها و نوع بسته‌بندی نیز بستگی دارد و نباید انتظار داشت همه برنامه‌های Tauri الزاماً حجم یکسانی داشته باشند.

برای یک پروژه واقعی، مزیت اصلی Tauri در امکان استفاده هم‌زمان از اکوسیستم توسعه وب و قابلیت‌های زبان Rust است. فرض کنید قصد دارید نرم‌افزار مدیریت یک مرکز فیزیوتراپی را طراحی کنید. می‌توانید با React فرم پذیرش، فهرست بیماران، تقویم نوبت‌ها و داشبورد را بسازید و برای عملیات فایل، ارتباط با پایگاه داده و منطق حساس برنامه از قابلیت‌های بومی استفاده کنید. این ساختار به شما امکان می‌دهد رابط کاربری را سریع توسعه دهید، بدون اینکه تمام برنامه را از ابتدا با یک فریم‌ورک گرافیکی بومی طراحی کنید.

تفاوت Tauri با Electron

Electron و Tauri هر دو امکان ساخت نرم‌افزار دسکتاپ با فناوری‌های وب را فراهم می‌کنند، اما معماری آن‌ها متفاوت است. Electron معمولاً Chromium و Node.js را در محیط برنامه خود ارائه می‌دهد؛ در مقابل، Tauri از WebView سیستم‌عامل استفاده می‌کند و برای بخش بومی به Rust متکی است. این تفاوت معماری می‌تواند بر حجم بسته، مصرف منابع و شیوه دسترسی به امکانات سیستم‌عامل اثر بگذارد، اما نتیجه واقعی به نوع برنامه و نحوه پیاده‌سازی بستگی دارد.

ویژگی

Tauri 2

Electron

رابط کاربری

HTML، CSS، React و سایر فریم‌ورک‌ها

HTML، CSS، React و سایر فریم‌ورک‌ها

فناوری اصلی بخش بومی

Rust

Node.js و کد بومی

موتور نمایش رابط

WebView سیستم‌عامل

Chromium همراه برنامه

دسترسی به قابلیت‌های سیستم

فرمان‌ها و افزونه‌های Tauri

APIهای Electron و ماژول‌های Node.js

حجم بسته

معمولاً امکان ساخت بسته کوچک‌تر وجود دارد

معمولاً شامل اجزای بیشتری از محیط اجراست

پیش‌نیاز توسعه

Node.js، Rust و ابزارهای سیستم‌عامل

Node.js و ابزارهای ساخت متناسب با پروژه

مناسب برای

برنامه‌های دسکتاپ سبک با مرزبندی امنیتی مشخص

برنامه‌های دسکتاپ با اکوسیستم گسترده Node.js

هیچ‌کدام در تمام پروژه‌ها برنده مطلق نیستند. اگر به کتابخانه‌های گسترده Node.js یا قابلیت‌های خاص Electron وابستگی دارید، Electron ممکن است انتخاب عملی‌تری باشد. اگر می‌خواهید از React برای رابط کاربری و Rust برای بخش بومی استفاده کنید و حجم بسته و کنترل دسترسی‌ها برایتان اهمیت دارد، Tauri ارزش بررسی جدی دارد.

۲. پیش‌نیازهای نصب Tauri در ویندوز

قبل از ایجاد پروژه، باید محیط توسعه را درست آماده کنید. بخش قابل‌توجهی از خطاهای ابتدای کار Tauri نه از کد React ناشی می‌شوند و نه از خود فریم‌ورک، بلکه به نصب ناقص Rust، نبود کامپایلر C++ یا تنظیم نبودن متغیرهای محیطی مربوط هستند. بنابراین بهتر است به‌جای نصب تصادفی ابزارها، هر مرحله را کامل کنید و بعد به سراغ مرحله بعدی بروید. مستندات رسمی Tauri برای توسعه در ویندوز، ابزارهای ساخت C++، محیط Rust و WebView2 را از پیش‌نیازهای اصلی معرفی می‌کند.

Tauri

۲.۱. نصب Node.js و ابزارهای مدیریت بسته

اگر قرار است رابط کاربری را با React و TypeScript بسازید، به Node.js و یک مدیر بسته مانند npm نیاز دارید. Node.js محیط اجرای JavaScript خارج از مرورگر است و npm نیز برای نصب کتابخانه‌ها، مدیریت وابستگی‌ها و اجرای اسکریپت‌های پروژه استفاده می‌شود. برای شروع، نسخه پایدار و پشتیبانی‌شده LTS را از وب‌سایت رسمی Node.js دریافت کنید: nodejs.org.

پس از نصب، ترمینال جدیدی باز کنید و دستورات زیر را اجرا کنید:

node -v
npm -v

اگر هر دو دستور شماره نسخه را نمایش دهند، این مرحله به‌درستی انجام شده است. اما اگر با خطایی مانند node is not recognized مواجه شدید، ابتدا بررسی کنید Node.js نصب شده باشد و مسیر پوشه نصب آن در متغیر محیطی PATH قرار گرفته باشد؛ سپس ترمینال را ببندید و دوباره باز کنید.

یک نکته مهم: نصب Node.js به‌تنهایی برای اجرای برنامه دسکتاپ Tauri کافی نیست. Node.js وابستگی‌های رابط کاربری را مدیریت می‌کند، درحالی‌که کامپایل بخش بومی برنامه به ابزارهای دیگری نیاز دارد. این تفکیک را از همان ابتدا درک کنید تا هنگام مشاهده خطاهای کامپایل، مشکل را اشتباهاً به React یا npm نسبت ندهید.

۲.۲. نصب Rust و ابزارهای کامپایل ویندوز

Tauri برای بخش بومی برنامه از Rust استفاده می‌کند. ابزار پیشنهادی نصب Rust در ویندوز، rustup است که امکان نصب و مدیریت نسخه‌های کامپایلر و ابزارهای وابسته را فراهم می‌کند. برای دریافت آن به rust-lang.org/tools/install مراجعه کنید و هنگام نصب، ابزارهای متناسب با محیط ویندوز و معماری سیستم خود را انتخاب کنید.

بعد از نصب، این دستورات را اجرا کنید:

rustc --version
cargo --version
rustup show

دستور اول نسخه کامپایلر Rust، دستور دوم نسخه Cargo و دستور سوم اطلاعات محیط Rust را نمایش می‌دهد. Cargo ابزار رسمی مدیریت پروژه، وابستگی‌ها و فرایند کامپایل در اکوسیستم Rust است. برای نمونه، هنگام ساخت نسخه نهایی Tauri، بخشی از فرایند کامپایل از طریق Cargo انجام می‌شود.

در ویندوز باید ابزارهای ساخت C++ مایکروسافت را نیز نصب کنید. در نصب‌کننده Visual Studio Build Tools، گزینه Desktop development with C++ را انتخاب کنید. همچنین WebView2 Runtime برای نمایش رابط وب برنامه موردنیاز است؛ این مؤلفه در بسیاری از نسخه‌های جدید ویندوز از قبل وجود دارد، اما بهتر است وضعیت آن را بررسی کنید.

Tauri

اگر نصب Rust به دلیل خطای شبکه متوقف شد، صرفاً تکرار دستور نصب لزوماً مشکل را حل نمی‌کند. ابتدا دسترسی به منابع دانلود، تنظیمات پروکسی و خطاهای TLS را بررسی کنید. همچنین پس از تغییر متغیرهای محیطی، یک ترمینال تازه باز کنید؛ زیرا ترمینال فعلی ممکن است همچنان مقادیر قبلی را در اختیار داشته باشد.

۳. ایجاد پروژه React با Vite

اکنون که پیش‌نیازها آماده‌اند، نوبت ایجاد رابط کاربری است. برای این کار از Vite استفاده می‌کنیم؛ ابزاری که محیط توسعه سریع و فرایند ساخت فایل‌های نهایی را برای پروژه‌های مدرن JavaScript فراهم می‌کند. React مسئول ساخت اجزای رابط کاربری خواهد بود و TypeScript کمک می‌کند بسیاری از خطاهای مربوط به نوع داده‌ها را پیش از اجرا شناسایی کنید.

در PowerShell به پوشه‌ای بروید که می‌خواهید پروژه در آن ساخته شود. سپس دستور زیر را اجرا کنید:

npm create vite@latest

در مراحل تعاملی، نام پروژه را برای مثال clinic-desktop انتخاب کنید، React را به‌عنوان فریم‌ورک و TypeScript را به‌عنوان زبان رابط کاربری برگزینید. اگر از قبل می‌دانید که می‌خواهید در ادامه از Tailwind CSS و React Router استفاده کنید، لازم نیست همه این وابستگی‌ها را هنگام ساخت اولیه نصب کنید؛ می‌توانید آن‌ها را در مرحله مناسب به پروژه اضافه کنید.

پس از پایان ایجاد پروژه، وارد پوشه آن شوید و وابستگی‌ها را نصب کنید:

cd clinic-desktop
npm install

سپس سرور توسعه را اجرا کنید:

npm run dev

Vite یک نشانی محلی، معمولاً مشابه http://localhost:5173، نمایش می‌دهد. آن را در مرورگر باز کنید تا مطمئن شوید صفحه اولیه React اجرا می‌شود. اگر این مرحله شکست بخورد، هنوز نباید سراغ عیب‌یابی Rust یا Tauri بروید؛ ابتدا باید پروژه وب را به حالت سالم برسانید.

۳.۱. نصب وابستگی‌ها و اجرای اولیه

پس از اجرای موفق React، ساختار اولیه پروژه را بشناسید. پوشه src معمولاً شامل کدهای رابط کاربری است، فایل package.json وابستگی‌ها و اسکریپت‌ها را نگه می‌دارد و فایل vite.config.ts تنظیمات Vite را تعریف می‌کند. در این مرحله هنوز برنامه دسکتاپ ندارید؛ تنها یک رابط وب ساخته‌اید که در مرورگر اجرا می‌شود.

برای جلوگیری از اشتباه، دو مفهوم را از هم جدا کنید: سرور توسعه وب و پنجره دسکتاپ Tauri. سرور توسعه فایل‌های React را در اختیار محیط اجرا قرار می‌دهد، اما Tauri آن محتوا را در یک پنجره بومی نمایش می‌دهد و قابلیت‌های سیستم‌عامل را از طریق بخش Rust یا افزونه‌های مجاز در دسترس قرار می‌دهد.

اگر می‌خواهید از همان ابتدا پروژه را با قالب رسمی Tauri ایجاد کنید، راه دیگری هم وجود دارد. مستندات رسمی ابزار create-tauri-app را برای ساخت پروژه‌های جدید معرفی می‌کند و این ابزار قالب React و TypeScript را نیز ارائه می‌دهد.

Tauri

با این حال، روش ساخت React با Vite و افزودن Tauri در مرحله بعد برای یادگیری معماری و درک نقش هر بخش مناسب است.

۴. نصب و راه‌اندازی Tauri 2

پس از آماده شدن رابط React، باید Tauri را به پروژه اضافه کنید. در پوشه اصلی پروژه، این دستور را اجرا کنید:

npm install -D @tauri-apps/cli@latest

سپس برای ایجاد پیکربندی اولیه Tauri دستور زیر را اجرا کنید:

npx tauri init

در فرایند راه‌اندازی، نام برنامه، شناسه یکتای برنامه، محل فایل‌های رابط کاربری، نشانی سرور توسعه و فرمان‌های ساخت رابط کاربری از شما پرسیده می‌شود. برای یک پروژه Vite معمولی، تنظیمات پایه می‌تواند مشابه موارد زیر باشد:

گزینه

مقدار نمونه

نام برنامه

Clinic Desktop

شناسه برنامه

ir.striing.clinic

مسیر فایل‌های وب

../dist

نشانی توسعه

http://localhost:5173

فرمان توسعه رابط

npm run dev

فرمان ساخت رابط

npm run build

شناسه برنامه باید برای محصول شما مناسب و یکتا باشد. همچنین مقادیر بالا نمونه هستند؛ اگر قالب پروژه یا تنظیمات Vite شما متفاوت است، باید مقادیر واقعی پروژه را وارد کنید. مستندات رسمی Tauri نیز برای افزودن دستی این فریم‌ورک به پروژه موجود، ابتدا تعیین نشانی سرور توسعه و سپس اجرای فرمان tauri init را توضیح می‌دهد.

Tauri

۴.۱. پیکربندی اولیه و شناخت فایل‌های پروژه

پس از راه‌اندازی، ساختار پروژه تغییر می‌کند و فایل‌های مربوط به بخش بومی نیز ایجاد می‌شوند. در یک پروژه متداول Tauri 2، ساختار کلی می‌تواند به شکل زیر باشد:

clinic-desktop/
├── public/
├── src/
│   ├── App.tsx
│   ├── main.tsx
│   └── ...
├── src-tauri/
│   ├── capabilities/
│   ├── icons/
│   ├── src/
│   │   ├── lib.rs
│   │   └── main.rs
│   ├── Cargo.toml
│   ├── build.rs
│   └── tauri.conf.json
├── package.json
├── tsconfig.json
└── vite.config.ts

فایل src/App.tsx معمولاً نقطه شروع رابط کاربری React است. در مقابل، پوشه src-tauri کدها و تنظیمات بخش بومی را در خود نگه می‌دارد. فایل Cargo.toml وابستگی‌های Rust و تنظیمات بسته را مدیریت می‌کند و tauri.conf.json شامل تنظیماتی مانند نام برنامه، پنجره، مسیر فایل‌های وب و فرایند ساخت است.

فایل‌های main.rs و lib.rs نیز وظایف متفاوتی دارند که به قالب پروژه وابسته است. در بسیاری از قالب‌های Tauri، تابع راه‌اندازی اصلی در lib.rs تعریف می‌شود و فایل اجرایی آن را فراخوانی می‌کند. بنابراین اگر می‌خواهید فرمان Rust اضافه کنید یا افزونه‌ای را ثبت کنید، ابتدا فایل راه‌اندازی واقعی پروژه را بررسی کنید؛ فرض اینکه همه منطق همیشه در main.rs قرار دارد، اشتباه است.

نکته امنیتی مهم این است که تنظیمات مجوزها در Tauri 2 به ساختار قابلیت‌ها یا capabilities وابسته است. نصب یک افزونه به‌تنهایی به این معنا نیست که رابط کاربری مجاز است تمام عملیات آن را اجرا کند. باید دسترسی‌های لازم را آگاهانه تعریف کنید و از اعطای مجوزهای گسترده و غیرضروری خودداری کنید.

۵. اجرای برنامه دسکتاپ در محیط توسعه

اکنون زمان اجرای نخستین پنجره دسکتاپ است. در پوشه اصلی پروژه، سرور Vite را در صورت نیاز از طریق اسکریپت Tauri راه‌اندازی کنید:

npm run tauri dev

این فرمان در صورتی کار می‌کند که اسکریپت tauri در بخش scripts فایل package.json تعریف شده باشد؛ قالب‌های رسمی معمولاً چنین اسکریپتی را ایجاد می‌کنند. اگر این اسکریپت وجود ندارد، باید آن را متناسب با نسخه CLI نصب‌شده اضافه کنید یا از فرمان مستقیم npx tauri dev استفاده کنید.

در نخستین اجرا، کامپایل بخش Rust ممکن است زمان‌بر باشد؛ به‌ویژه اگر وابستگی‌ها هنوز دانلود نشده باشند. پس از پایان موفق کامپایل، پنجره‌ای باز می‌شود که رابط React را در محیط دسکتاپ نمایش می‌دهد. در این مرحله می‌توانید دکمه‌ها، فرم‌ها و سایر اجزای رابط را توسعه دهید و تغییرات بخش وب را در محیط توسعه مشاهده کنید.

برای نمونه، اگر پروژه مدیریت بیماران می‌سازید، می‌توانید ابتدا یک داشبورد ساده با عنوان «مدیریت کلینیک» طراحی کنید. هنوز نیازی نیست پایگاه داده یا عملیات ثبت اطلاعات را پیاده‌سازی کنید. بهتر است ابتدا مسیر اجرای برنامه، نمایش صحیح فونت فارسی و جهت راست‌به‌چپ، و رفتار پنجره را بررسی کنید؛ بعد به سراغ بخش‌های پیچیده‌تر بروید.

اگر فرمان اجرا با خطای rustc is not recognized مواجه شد، مشکل از شناسایی ابزار Rust است، نه از کد React. اگر خطای مربوط به linker یا کامپایل C++ مشاهده کردید، نصب Visual Studio Build Tools را بررسی کنید. اگر پنجره باز شد اما محتوای آن خالی بود، ابتدا خروجی Vite، نشانی سرور توسعه و خطاهای کنسول را بررسی کنید.

۶. طراحی رابط کاربری با TypeScript و Tailwind CSS

یکی از مزیت‌های Tauri این است که برای طراحی رابط کاربری مجبور نیستید از یک کتابخانه گرافیکی اختصاصی استفاده کنید. می‌توانید از همان ابزارهایی استفاده کنید که در پروژه‌های وب به کار می‌برید؛ از جمله React، TypeScript، Tailwind CSS و کتابخانه‌های آیکون. این موضوع به‌خصوص برای نرم‌افزارهای مدیریتی اهمیت دارد، زیرا فرم‌ها، جدول‌ها، فیلترها، منوهای کناری و داشبوردها را می‌توان به شکل کامپوننت‌های قابل استفاده مجدد طراحی کرد.

برای نصب Tailwind CSS نسخه ۴ در پروژه Vite، دستور زیر را اجرا کنید:

npm install tailwindcss @tailwindcss/vite

سپس در فایل vite.config.ts افزونه Tailwind را ثبت کنید. اگر از قبل افزونه React را دارید، آن را حذف نکنید؛ هر دو افزونه باید در آرایه plugins باقی بمانند:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";

export default defineConfig({
  plugins: [react(), tailwindcss()],
});

در فایل CSS اصلی رابط کاربری، دستور زیر را قرار دهید:

@import "tailwindcss";

@theme {
  --font-sans: "Vazirmatn", sans-serif;
  --color-primary: #168b83;
  --color-primary-dark: #106d67;
}

این تنظیمات برای تعریف فونت و رنگ‌های سفارشی Tailwind مناسب هستند، به شرط آنکه فایل فونت Vazirmatn را نیز به‌درستی در پروژه قرار دهید و بارگذاری آن را تنظیم کنید. اگر فونت را از فایل محلی بارگذاری می‌کنید، مسیر فایل و نام وزن‌های فونت باید با ساختار واقعی پروژه هماهنگ باشند.

برای یک نرم‌افزار فارسی، جهت صفحه را نیز تنظیم کنید. برای مثال، در فایل index.html مقدار ویژگی dir عنصر html را برابر rtl قرار دهید. بهتر است جهت کلی برنامه را از جهت اجزای خاص جدا نگه دارید؛ زیرا ممکن است بعضی از فیلدها مانند شماره تلفن، ایمیل یا کدهای فنی همچنان به جهت چپ‌به‌راست نیاز داشته باشند.

در طراحی برنامه دسکتاپ، فقط زیبایی اهمیت ندارد. جدول‌ها باید در اندازه‌های مختلف پنجره قابل استفاده باشند، فرم‌ها باید خطاهای ورودی را روشن نمایش دهند و عملیات طولانی نباید باعث قفل شدن رابط کاربری شوند. همچنین برای یک برنامه عملیاتی، بهتر است اجزایی مانند منوی کناری، نوار عنوان، اعلان‌ها و فرم‌های ثبت اطلاعات را به کامپوننت‌های مستقل تقسیم کنید تا تغییرات آینده به اصلاح یک فایل بزرگ و پیچیده وابسته نباشد.

۷. ارتباط React با بخش Rust

تا این مرحله، رابط کاربری ساخته‌اید؛ اما برای دسترسی کنترل‌شده به قابلیت‌های بومی سیستم‌عامل باید ارتباط React و Rust را برقرار کنید. Tauri این ارتباط را از طریق سازوکاری شامل فرمان‌های بومی و فراخوانی آن‌ها از رابط کاربری فراهم می‌کند. در این روش، رابط React یک فرمان را فراخوانی می‌کند، بخش Rust عملیات موردنظر را انجام می‌دهد و نتیجه را به رابط برمی‌گرداند.

برای نمونه، فرض کنید می‌خواهید فرمانی به نام greet بسازید که یک نام را دریافت و پیام خوشامدگویی تولید کند. در فایل راه‌اندازی Rust پروژه، معمولاً src-tauri/src/lib.rs، می‌توانید کدی مشابه زیر بنویسید:

#[tauri::command]
fn greet(name: String) -> String {
    format!("سلام، {}!", name)
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("خطا در اجرای برنامه Tauri");
}

این مثال برای قالبی است که تابع راه‌اندازی در lib.rs تعریف شده است. اگر پروژه شما از ساختار دیگری استفاده می‌کند، باید فرمان را به همان نمونه tauri::Builder متصل کنید که برنامه را اجرا می‌کند؛ تعریف فرمان به‌تنهایی کافی نیست.

حالا در سمت React، ابتدا API فراخوانی فرمان را نصب کنید:

npm install @tauri-apps/api

سپس می‌توانید فرمان را از رابط کاربری فراخوانی کنید:

import { useState } from "react";
import { invoke } from "@tauri-apps/api/core";

export default function App() {
  const [message, setMessage] = useState("");

  async function handleGreet() {
    const result = await invoke("greet", {
      name: "کاربر",
    });

    setMessage(result);
  }

  return (
    

{message}

); }

با کلیک روی دکمه، React فرمان greet را فراخوانی می‌کند و متن بازگشتی Rust را نمایش می‌دهد. در این مثال، عملیات ساده است؛ اما همین الگو می‌تواند برای عملیات پیچیده‌تر مانند خواندن اطلاعات پایگاه داده یا پردازش یک فایل استفاده شود.

نکته فنی مهم این است که در یک برنامه واقعی، خطاهای فرمان باید مدیریت شوند. برای مثال، اگر عملیات ذخیره‌سازی با شکست مواجه شد، نباید رابط کاربری بدون توضیح باقی بماند. همچنین اعتبارسنجی سمت React جای اعتبارسنجی سمت Rust را نمی‌گیرد؛ داده‌هایی که از رابط کاربری دریافت می‌شوند باید در بخش بومی نیز بر اساس نیاز برنامه بررسی شوند.

۸. اتصال SQLite و مدیریت اطلاعات

برای بسیاری از نرم‌افزارهای دسکتاپ، پایگاه داده محلی انتخاب مناسبی است. SQLite یک پایگاه داده رابطه‌ای سبک است که اطلاعات را در فایل ذخیره می‌کند و برای برنامه‌هایی مانند مدیریت بیماران، انبارداری، حسابداری ساده و مدیریت نوبت‌ها کاربرد دارد. برخلاف PostgreSQL یا MySQL، در معماری معمول SQLite لازم نیست یک سرور پایگاه داده مستقل نصب و اجرا کنید.

در Tauri می‌توانید از افزونه SQL برای ارتباط با SQLite استفاده کنید یا عملیات پایگاه داده را از طریق فرمان‌های Rust و کتابخانه‌هایی مانند SQLx پیاده‌سازی کنید. انتخاب میان این دو روش به معماری پروژه بستگی دارد. برای نمونه، اگر می‌خواهید منطق داده‌ها، اعتبارسنجی و عملیات پایگاه داده عمدتاً در Rust متمرکز باشند، استفاده از SQLx می‌تواند انتخاب مناسبی باشد؛ اما باید مدیریت اتصال، مهاجرت‌های پایگاه داده و خطاها را نیز خودتان طراحی کنید.

برای نصب افزونه SQL رسمی Tauri 2، این دستور را اجرا کنید:

npm install @tauri-apps/plugin-sql

بخش بومی افزونه نیز باید به وابستگی‌های Rust اضافه شود. ازآنجاکه نسخه‌های افزونه باید با نسخه اصلی Tauri سازگار باشند، بهتر است مراحل نصب و پیکربندی را مطابق مستندات رسمی همان نسخه دنبال کنید.

در معماری مبتنی بر افزونه SQL، صرف نصب بسته JavaScript کافی نیست. افزونه باید در سمت Rust ثبت شود و مجوزهای لازم نیز در فایل‌های قابلیت‌ها تعریف شوند. اگر هنگام اجرای عملیات با خطایی مانند sql.execute not allowed روبه‌رو شدید، باید تنظیمات مجوز عملیات SQL را بررسی کنید؛ البته بهتر است تنها مجوزهایی را فعال کنید که واقعاً برای برنامه لازم هستند.

در معماری مبتنی بر SQLx نیز ابتدا باید مسیر پایگاه داده به‌درستی تعیین شود. برای برنامه دسکتاپ، قرار دادن فایل پایگاه داده در مسیر نصب برنامه معمولاً تصمیم مناسبی نیست؛ زیرا پوشه نصب ممکن است مجوز نوشتن نداشته باشد یا هنگام به‌روزرسانی تغییر کند. بهتر است فایل داده در مسیر مناسب داده‌های برنامه کاربر قرار گیرد و مسیر آن در زمان اجرا به‌صورت کنترل‌شده مدیریت شود.

برای یک سیستم نوبت‌دهی، طراحی جدول‌ها باید از ابتدا دقیق باشد. برای مثال، جدول بیماران می‌تواند شامل شناسه، نام، نام خانوادگی، شماره تلفن و زمان ایجاد رکورد باشد؛ جدول نوبت‌ها نیز باید اطلاعاتی مانند شناسه بیمار، تاریخ نوبت، وضعیت و زمان ثبت را نگه دارد. اگر قرار است چند اپراتور به اطلاعات مشترک دسترسی داشته باشند، باید تفاوت میان پایگاه داده محلی و پایگاه داده مرکزی را جدی بگیرید؛ SQLite محلی به‌خودی‌خود همگام‌سازی چند رایانه را فراهم نمی‌کند.

۹. ساخت فایل اجرایی و نصب‌کننده ویندوز

پس از تکمیل برنامه، نوبت ساخت نسخه قابل توزیع است. در Tauri، فرمان ساخت نسخه نهایی علاوه بر آماده‌سازی رابط وب، بخش بومی برنامه را نیز کامپایل و بسته‌بندی می‌کند. قبل از ساخت، مطمئن شوید که برنامه در محیط توسعه بدون خطای جدی اجرا می‌شود و فرمان ساخت رابط کاربری در package.json درست تنظیم شده است.

در پوشه اصلی پروژه اجرا کنید:

npm run tauri build

این فرمان در قالبی که اسکریپت tauri را تعریف کرده باشد، نسخه نهایی برنامه را تولید می‌کند. اگر اسکریپت وجود ندارد، می‌توانید از فرمان مستقیم زیر استفاده کنید:

npx tauri build

خروجی‌های ساخت معمولاً در زیرپوشه‌هایی از مسیر src-tauri/target/release و پوشه‌های مربوط به بسته‌بندی قرار می‌گیرند؛ مسیر دقیق بسته‌ها به پیکربندی پروژه و نسخه Tauri وابسته است. خروجی می‌تواند شامل فایل اجرایی و بسته نصب مناسب ویندوز باشد.

بااین‌حال، ساخت فایل EXE به معنای تضمین اجرای برنامه روی هر رایانه‌ای نیست. برای مثال، برنامه‌ای که از WebView2 استفاده می‌کند، به فراهم بودن محیط اجرایی موردنیاز وابسته است. همچنین اگر برنامه شما به فایل‌های داده، فونت، کتابخانه جانبی یا تنظیمات خاصی وابسته باشد، باید مطمئن شوید که همه موارد لازم در بسته نهایی پیش‌بینی شده‌اند.

پیش از انتشار، نسخه ساخته‌شده را روی یک محیط آزمایشی اجرا کنید. نصب و اجرای برنامه در رایانه توسعه‌دهنده به‌تنهایی کافی نیست؛ زیرا ممکن است ابزارهایی روی آن سیستم نصب باشند که روی رایانه مقصد وجود ندارند. اگر قصد توزیع عمومی دارید، امضای دیجیتال، فرایند به‌روزرسانی، پشتیبان‌گیری از داده‌ها و روش بازیابی خطاها را نیز در برنامه انتشار لحاظ کنید.

۱۰. خطاهای رایج هنگام راه‌اندازی Tauri

بسیاری از مشکلات راه‌اندازی با بررسی منظم محیط توسعه برطرف می‌شوند. اشتباه رایج این است که توسعه‌دهنده پس از مشاهده یک خطا، چندین بسته را نصب یا تنظیمات مختلف را هم‌زمان تغییر می‌دهد؛ درنتیجه، تشخیص علت اصلی دشوارتر می‌شود. بهتر است متن کامل خطا را بخوانید و بر اساس مرحله‌ای که شکست خورده است، مشکل را دسته‌بندی کنید.

خطا یا نشانه

علت احتمالی

اقدام پیشنهادی

node is not recognized

نصب ناقص Node.js یا مشکل PATH

بررسی نصب و بازکردن ترمینال جدید

rustc is not recognized

Rust در دسترس ترمینال نیست

بررسی نصب Rust و تنظیم مسیرها

خطای linker یا کامپایل C++

ابزارهای ساخت ویندوز ناقص‌اند

بررسی Visual Studio Build Tools

خطاهای اتصال هنگام نصب Rust

مشکل شبکه، پروکسی یا TLS

بررسی اتصال به منابع نصب

پنجره خالی

خطای رابط، نشانی نادرست Vite یا خطای JavaScript

بررسی لاگ‌ها و نشانی سرور

خطای مجوز افزونه

قابلیت لازم در Tauri 2 فعال نشده است

بررسی capabilities و تنظیمات افزونه

خطای بازکردن SQLite

مسیر نادرست یا نبود مجوز نوشتن

بررسی مسیر مطلق، پوشه داده و مجوزها

ساخت ناموفق نصب‌کننده MSI

ابزار یا قابلیت لازم برای بسته‌بندی ناقص است

بررسی خطای کامل و پیش‌نیازهای MSI

چگونه خطاها را اصولی بررسی کنیم؟

ابتدا نسخه ابزارها را کنترل کنید. سپس پروژه React را مستقل اجرا کنید تا مطمئن شوید مشکل از رابط کاربری نیست. اگر رابط سالم است، برنامه را با فرمان توسعه Tauri اجرا کنید و خروجی ترمینال را بخوانید. این روش مرحله‌به‌مرحله کمک می‌کند مشخص شود خطا از محیط JavaScript، کامپایل Rust، پیکربندی Tauri یا یکی از افزونه‌ها ناشی شده است.

برای مثال، اگر دستور npm run dev موفق است اما npm run tauri dev شکست می‌خورد، نباید بلافاصله کدهای React را بازنویسی کنید. ابتدا ابزارهای بومی، نسخه Rust و تنظیمات Tauri را بررسی کنید. از طرف دیگر، اگر پنجره برنامه باز می‌شود اما یک دکمه کار نمی‌کند، احتمال دارد فرمان Rust ثبت نشده باشد، نام فرمان اشتباه باشد یا مجوز لازم برای عملیات مربوطه تعریف نشده باشد.

۱۱. نکات امنیتی و بهینه‌سازی پروژه

Tauri امکاناتی برای کنترل دسترسی رابط وب به قابلیت‌های بومی ارائه می‌دهد، اما استفاده از این امکانات به معنی امن بودن خودکار برنامه نیست. اگر یک فرمان Rust اطلاعات حساس را بدون اعتبارسنجی دریافت کند، یا رابط کاربری به قابلیت‌هایی بیش از نیاز خود دسترسی داشته باشد، همچنان امکان بروز مشکلات امنیتی وجود دارد. بنابراین امنیت باید بخشی از طراحی معماری باشد، نه کاری که فقط پیش از انتشار انجام می‌دهید.

در یک نرم‌افزار مدیریت بیماران، برای نمونه، اطلاعات هویتی و سوابق درمانی باید با دقت محافظت شوند. دسترسی کاربران به بخش‌های مختلف باید بر اساس نقش آن‌ها طراحی شود و نباید صرفاً مخفی کردن یک دکمه در React را معادل کنترل دسترسی واقعی بدانید. عملیات حساس باید در لایه‌ای انجام شوند که بتواند مجوزها را به‌درستی بررسی کند.

از نظر کارایی نیز بهتر است کارهای سنگین را از مسیر اصلی تعامل کاربر جدا کنید. عملیات طولانی پایگاه داده، پردازش فایل‌های بزرگ یا محاسبات پیچیده نباید باعث شود رابط کاربری برای مدت طولانی پاسخ‌گو نباشد. استفاده از عملیات ناهمگام، مدیریت درست خطاها و نمایش وضعیت پردازش می‌تواند تجربه کاربری را بهبود دهد.

در نهایت، از همان ابتدای پروژه ساختار پوشه‌ها و مسئولیت هر لایه را مشخص کنید. برای مثال، کامپوننت‌های React را از منطق پایگاه داده جدا نگه دارید، فرمان‌های Rust را بر اساس وظیفه دسته‌بندی کنید و تغییرات ساختار پایگاه داده را با مهاجرت‌های نسخه‌بندی‌شده مدیریت کنید. این تصمیم‌ها شاید در یک نمونه ساده ضروری به نظر نرسند، اما با افزایش تعداد جدول‌ها، فرم‌ها و قابلیت‌ها اهمیت زیادی پیدا می‌کنند.

 

 چگونه ساختار پروژه Tauri را برای توسعه حرفه‌ای طراحی کنیم؟

راه‌اندازی موفق Tauri تنها به نصب ابزارها و اجرای اولین پنجره دسکتاپ محدود نمی‌شود؛ مرحله مهم‌تر، طراحی ساختاری است که با رشد پروژه همچنان قابل نگهداری باقی بماند. در یک نمونه ساده، ممکن است تمام کدهای React در یک فایل قرار بگیرند و تمام فرمان‌های Rust نیز در یک ماژول نوشته شوند، اما این روش در پروژه‌های واقعی خیلی زود دردسرساز می‌شود. برای مثال، نرم‌افزار مدیریت کلینیک می‌تواند شامل بیماران، نوبت‌ها، بیمه‌ها، خدمات درمانی، صندوق و گزارش‌ها باشد و هر بخش منطق و داده‌های مخصوص خود را داشته باشد. اگر از همان ابتدا مسئولیت‌ها را تفکیک نکنید، تغییر یک قابلیت ممکن است بخش‌های نامرتبط برنامه را نیز تحت تأثیر قرار دهد. بنابراین، طراحی معماری باید از روزهای نخست توسعه مورد توجه قرار بگیرد، نه زمانی که پروژه به صدها فایل رسیده است.

H3: ۱. تفکیک رابط کاربری از منطق برنامه

در معماری پیشنهادی Tauri، رابط کاربری React وظیفه نمایش اطلاعات، دریافت ورودی و مدیریت تعامل کاربر را بر عهده دارد، درحالی‌که بخش Rust می‌تواند مسئول اجرای عملیات بومی و منطق حساس برنامه باشد. این تفکیک به معنای آن نیست که تمام منطق تجاری الزاماً باید در Rust نوشته شود؛ تصمیم نهایی به نیاز پروژه بستگی دارد. برای مثال، تغییر وضعیت باز یا بسته بودن یک منوی کناری بهتر است در React انجام شود، اما بررسی مجاز بودن یک عملیات حساس یا اجرای یک تراکنش پایگاه داده باید در لایه‌ای انجام شود که بتواند قواعد موردنیاز را به‌طور معتبر اعمال کند. اگر رابط کاربری مستقیماً مسئول تمام جزئیات ذخیره‌سازی باشد، تغییر روش دسترسی به داده‌ها در آینده دشوارتر خواهد شد. به همین دلیل، بهتر است ارتباط میان این دو بخش از طریق یک رابط مشخص و قابل آزمایش انجام شود.

 ۲. سازمان‌دهی پوشه‌های React

برای یک پروژه متوسط، می‌توانید پوشه‌های رابط کاربری را بر اساس قابلیت‌های برنامه سازمان‌دهی کنید. برای نمونه، پوشه features می‌تواند شامل بخش‌های بیماران، نوبت‌ها و گزارش‌ها باشد، درحالی‌که پوشه components برای اجزای مشترک مانند دکمه‌ها، فیلدهای فرم و پنجره‌های تأیید استفاده شود. فایل‌های مربوط به مسیرها نیز می‌توانند در بخش مستقلی قرار بگیرند تا تعریف مسیرهای برنامه با جزئیات نمایش صفحات مخلوط نشود. این ساختار زمانی ارزش خود را نشان می‌دهد که چندین فرم و جدول به قابلیت‌های مشترکی نیاز داشته باشند. البته نباید برای هر فایل کوچک، چندین پوشه تو در تو بسازید؛ هدف، یافتن سریع کد و مشخص بودن مسئولیت هر بخش است، نه افزایش تعداد پوشه‌ها.

نمونه‌ای از ساختار مناسب برای رابط کاربری:

src/
├── app/
│   ├── App.tsx
│   └── router.tsx
├── components/
│   ├── Button.tsx
│   └── DataTable.tsx
├── features/
│   ├── patients/
│   ├── appointments/
│   └── services/
├── services/
│   └── patientService.ts
├── types/
└── styles/

 ۳. تفکیک فرمان‌های Rust بر اساس مسئولیت

در بخش Rust نیز بهتر است به‌جای قرار دادن همه فرمان‌ها در یک فایل بزرگ، آن‌ها را بر اساس دامنه کاری دسته‌بندی کنید. برای مثال، فرمان‌های مربوط به بیماران می‌توانند در ماژولی مانند commands::patients و عملیات مربوط به نوبت‌ها در commands::appointments قرار بگیرند. لایه دیگری می‌تواند مسئول دسترسی به پایگاه داده باشد تا فرمان‌ها مجبور نباشند مستقیماً جزئیات تمام پرس‌وجوهای SQL را مدیریت کنند. چنین ساختاری امکان استفاده مجدد از منطق داده‌ها را افزایش می‌دهد و نوشتن آزمون‌های مستقل را آسان‌تر می‌کند. در پروژه‌ای که چندین جدول مرتبط دارد، این تفکیک همچنین به کاهش تکرار کد و شناسایی بهتر خطاهای منطقی کمک خواهد کرد.

H3: ۴. تعریف قرارداد روشن میان React و Rust

وقتی React فرمانی مانند get_patients را فراخوانی می‌کند، باید مشخص باشد که چه ورودی‌هایی ارسال می‌شوند و چه ساختاری از داده‌ها بازمی‌گردد. اگر یک فرمان گاهی آرایه بیمار و گاهی رشته خطا برگرداند، مدیریت نتیجه در رابط کاربری دشوار خواهد شد. بهتر است خروجی موفق و خطاهای عملیاتی به‌شکل قابل پیش‌بینی تعریف شوند و انواع داده‌ها در TypeScript و Rust تا حد امکان با هم سازگار باشند. برای نمونه، اگر شناسه بیمار در پایگاه داده عدد صحیح است، نباید بدون دلیل در رابط کاربری آن را به یک ساختار متفاوت تبدیل کنید. این قرارداد روشن، احتمال خطا در اتصال فرم‌ها، جدول‌ها و عملیات ویرایش را کاهش می‌دهد.

 ۵. مدیریت وضعیت در React

در برنامه‌های دسکتاپ، وضعیت رابط کاربری باید از داده‌های پایدار پایگاه داده متمایز باشد. برای مثال، باز بودن یک پنجره تأیید یا انتخاب یک ردیف جدول معمولاً وضعیت موقتی رابط کاربری است، اما اطلاعات ثبت‌شده یک بیمار باید از منبع داده معتبر دریافت شود. اگر همه اطلاعات را بدون تفکیک در یک متغیر عمومی نگه دارید، تغییرات متعدد می‌توانند باعث نمایش داده‌های قدیمی یا رفتار غیرمنتظره شوند. برای پروژه‌های کوچک می‌توانید از امکانات داخلی React مانند useState و useContext استفاده کنید و در صورت افزایش پیچیدگی، ابزار مدیریت وضعیت مناسب را بررسی کنید. انتخاب ابزار باید بر اساس نیاز واقعی پروژه باشد، نه صرفاً محبوبیت یک کتابخانه.

 ۶. طراحی مسیرها و ناوبری برنامه

برای برنامه‌ای که صفحات متعددی دارد، استفاده از مسیریابی باعث می‌شود منوی کناری، نوار عنوان و محتوای صفحات به‌صورت منظم مدیریت شوند. در پروژه React می‌توانید از React Router استفاده کنید و برای برنامه دسکتاپ مبتنی بر HashRouter مسیرهایی مانند /patients و /appointments تعریف کنید. در این حالت، جابه‌جایی میان صفحات به درخواست یک مسیر مستقل از سرور وب وابسته نیست. البته مسیریابی به‌تنهایی جایگزین کنترل دسترسی نیست؛ مخفی کردن یک صفحه در منو نباید به‌عنوان مانع امنیتی برای اجرای عملیات حساس تلقی شود. در نرم‌افزارهای چندکاربره، مجوزهای دسترسی باید در لایه معتبر برنامه نیز بررسی شوند.

 ۷. مدیریت تنظیمات و متغیرهای محیطی

اطلاعاتی مانند نشانی سرور توسعه، نام برنامه و مسیر فایل‌های خروجی باید از اطلاعات محرمانه جدا نگه داشته شوند. تنظیمات ساخت پروژه را می‌توان در فایل‌های مخصوص Tauri و Vite مدیریت کرد، اما اطلاعات حساسی مانند کلیدهای محرمانه نباید در کد رابط کاربری قرار بگیرند. هر مقداری که در بسته نهایی JavaScript قرار گیرد، بالقوه قابل استخراج است و نباید راز امنیتی محسوب شود. اگر برنامه به یک سرویس مرکزی متصل می‌شود، احراز هویت و حفاظت از اطلاعات حساس باید در سمت سرور طراحی شود. تفکیک درست تنظیمات از کد، علاوه بر افزایش امنیت، تغییر تنظیمات توسعه و انتشار را ساده‌تر می‌کند.

 ۸. مستندسازی و آزمون از ابتدای پروژه

مستندسازی معماری نباید به روزهای پایانی توسعه موکول شود. حتی یک فایل کوتاه که مسئولیت پوشه‌ها، روش اجرای پروژه و نحوه افزودن فرمان جدید را توضیح دهد، برای توسعه آینده مفید خواهد بود. همچنین می‌توانید برای توابع مستقل Rust آزمون بنویسید و منطق تبدیل یا اعتبارسنجی داده‌ها را بدون اجرای کامل رابط کاربری بررسی کنید. در سمت React نیز آزمون کامپوننت‌ها و اعتبارسنجی فرم‌ها می‌تواند از بازگشت خطاهای قبلی جلوگیری کند. برای مثال، اگر قانون برنامه اجازه ثبت نوبت در یک بازه زمانی اشغال‌شده را نمی‌دهد، باید این قاعده در منطق معتبر برنامه و آزمون‌های مربوطه بررسی شود، نه اینکه تنها به غیرفعال کردن یک دکمه در رابط کاربری اکتفا کنید.

 

ساختار مناسب پروژه Tauri باعث می‌شود توسعه قابلیت‌های جدید ساده‌تر و خطاهای نگهداری کمتر شوند. برای رسیدن به این هدف، رابط کاربری، فرمان‌های بومی، منطق تجاری و دسترسی به داده‌ها را با مرزبندی روشن طراحی کنید. پوشه‌بندی بیش‌ازحد یا پیچیده‌سازی زودهنگام ضرورتی ندارد؛ معماری باید با اندازه و نیازهای پروژه تناسب داشته باشد. اگر پیش از اضافه کردن قابلیت‌های متعدد، قرارداد میان React و Rust را مشخص کنید، توسعه و آزمایش بخش‌های بعدی با اطمینان بیشتری انجام خواهد شد.

 آموزش مدیریت حرفه‌ای اطلاعات در برنامه دسکتاپ Tauri

یکی از مراحل مهم توسعه نرم‌افزار دسکتاپ، انتخاب روش مناسب برای ذخیره‌سازی اطلاعات است. اگر برنامه شما فقط یک ابزار ساده برای نمایش داده‌ها باشد، شاید نیازی به پایگاه داده نداشته باشید؛ اما در نرم‌افزارهایی مانند مدیریت بیماران، حسابداری یا نوبت‌دهی، اطلاعات باید به‌شکل پایدار و قابل اطمینان ذخیره شوند. SQLite گزینه‌ای مناسب برای بسیاری از برنامه‌های دسکتاپ است، زیرا اطلاعات را در یک فایل پایگاه داده نگه می‌دارد و به نصب یک سرور مستقل نیاز ندارد. در کنار آن، SQLx کتابخانه‌ای برای کار با پایگاه داده در Rust است که امکان اجرای پرس‌وجوهای SQL و مدیریت ارتباطات را فراهم می‌کند. ترکیب Tauri، Rust، SQLx و SQLite می‌تواند معماری مناسبی برای یک نرم‌افزار دسکتاپ با داده‌های محلی ایجاد کند، به شرط آنکه مدیریت تراکنش‌ها، مسیر پایگاه داده و پشتیبان‌گیری به‌درستی طراحی شوند.

۱. انتخاب میان افزونه SQL و SQLx

در Tauri دو رویکرد متداول برای دسترسی به SQLite وجود دارد: استفاده از افزونه رسمی SQL یا مدیریت پایگاه داده در Rust با SQLx. افزونه SQL می‌تواند برای پروژه‌هایی که به عملیات متداول پایگاه داده نیاز دارند، مسیر ساده‌تری فراهم کند؛ در مقابل، SQLx برای توسعه‌دهندگانی مناسب است که می‌خواهند ارتباط پایگاه داده و منطق داده‌ها را در بخش Rust متمرکز کنند. این انتخاب نباید صرفاً بر اساس کوتاه‌تر بودن چند خط کد انجام شود، زیرا معماری امنیت، آزمون‌پذیری و نحوه مدیریت خطاها نیز اهمیت دارد. برای نمونه، در یک سیستم نوبت‌دهی که قوانین پیچیده‌ای برای جلوگیری از رزرو هم‌زمان وجود دارد، طراحی لایه داده و تراکنش‌ها از انتخاب ابزار مهم‌تر است.

۲. نصب SQLx و وابستگی‌های موردنیاز

اگر تصمیم گرفته‌اید از SQLx استفاده کنید، ابتدا باید وابستگی‌های متناسب با نسخه Rust و ساختار پروژه را در فایل Cargo.toml اضافه کنید. برای نمونه، در یک پروژه مبتنی بر SQLite ممکن است به قابلیت‌های runtime-tokio، sqlite و macros نیاز داشته باشید؛ انتخاب دقیق قابلیت‌ها باید با نسخه کتابخانه و روش استفاده شما هماهنگ باشد. همچنین اگر قصد دارید از ماکروی sqlx::migrate! استفاده کنید، باید قابلیت مربوط به مهاجرت‌ها و پیکربندی لازم را در نظر بگیرید. نصب وابستگی‌ها به‌تنهایی تضمین نمی‌کند که برنامه به پایگاه داده متصل شود؛ مسیر فایل، مجوزهای سیستم‌عامل و نحوه ساخت اتصال نیز باید درست باشند. بهتر است ابتدا یک اتصال ساده را اجرا کنید و سپس عملیات پیچیده‌تر را به پروژه اضافه کنید.

نمونه‌ای از وابستگی‌ها در Cargo.toml:

[dependencies]
sqlx = {
    version = "0.8",
    features = [
        "runtime-tokio",
        "sqlite",
        "macros",
        "migrate"
    ]
}

این نمونه برای آشنایی با ساختار تنظیمات است؛ نسخه و قابلیت‌های دقیق باید با نسخه Tauri و سایر وابستگی‌های پروژه هماهنگ شوند.

۳. انتخاب مسیر صحیح فایل SQLite

یکی از خطاهای رایج در برنامه‌های دسکتاپ، تلاش برای ایجاد فایل پایگاه داده در مسیری است که وجود ندارد یا مجوز نوشتن در آن فراهم نیست. برای مثال، اگر برنامه را از یک پوشه نصب‌شده در مسیر محافظت‌شده ویندوز اجرا کنید، ممکن است امکان ایجاد فایل در کنار فایل اجرایی وجود نداشته باشد. راه‌حل اصولی این است که مسیر داده‌های برنامه را از طریق امکانات مسیرهای سیستم‌عامل و APIهای Tauri تعیین کنید و در صورت نیاز، پوشه موردنظر را ایجاد کنید. مسیر نهایی باید در زمان اجرا به‌درستی به اتصال SQLite داده شود؛ استفاده از مسیر نسبی بدون درک پوشه کاری برنامه می‌تواند به ایجاد فایل در مکانی غیرمنتظره منجر شود. همچنین باید مشخص کنید در نخستین اجرای برنامه، فایل پایگاه داده چگونه ایجاد می‌شود و اگر فایل آسیب دیده یا قابل دسترس نبود، چه رفتاری انتظار می‌رود.

۴. طراحی جدول بیماران با ساختار قابل توسعه

در یک سیستم مدیریت کلینیک، جدول بیماران یکی از بخش‌های اصلی پایگاه داده است. بهتر است برای آن شناسه مشخص، نام، نام خانوادگی، شماره تماس و زمان ایجاد رکورد در نظر بگیرید و برای فیلدهای ضروری محدودیت‌های مناسبی تعریف کنید. نوع داده هر ستون باید با ماهیت اطلاعات سازگار باشد؛ برای مثال، شماره تلفن معمولاً بهتر است به‌صورت متن ذخیره شود، زیرا ممکن است با صفر شروع شود و عملیات حسابی روی آن معنا ندارد. همچنین باید از همان ابتدا درباره یکتایی شناسه‌ها، امکان خالی بودن فیلدها و نحوه ثبت زمان‌ها تصمیم بگیرید. این تصمیم‌ها بعدها روی اعتبارسنجی فرم‌ها، جست‌وجوی بیماران و ارتباط جدول‌ها با یکدیگر اثر می‌گذارند.

نمونه مهاجرت اولیه SQLite:

CREATE TABLE patients (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name TEXT NOT NULL,
    last_name TEXT NOT NULL,
    mobile TEXT,
    created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

این ساختار نقطه شروع مناسبی است، اما در پروژه واقعی باید قواعد شماره تماس، قالب تاریخ و سیاست حذف یا بایگانی بیماران نیز مشخص شوند.

۵. استفاده از Migration به‌جای تغییر دستی پایگاه داده

وقتی برنامه توسعه پیدا می‌کند، ساختار پایگاه داده نیز تغییر خواهد کرد. ممکن است ابتدا فقط نام و شماره تماس بیمار را ذخیره کنید و بعداً فیلدهایی مانند تاریخ تولد، نشانی یا وضعیت پرونده به جدول اضافه شوند. اگر تغییرات را فقط به‌صورت دستی روی فایل SQLite اعمال کنید، احتمال دارد نسخه‌های مختلف برنامه ساختارهای ناسازگاری داشته باشند. مهاجرت‌های پایگاه داده یا Migration این تغییرات را به‌صورت نسخه‌بندی‌شده ثبت می‌کنند و امکان اعمال کنترل‌شده آن‌ها را فراهم می‌سازند. در SQLx می‌توانید فایل‌های SQL مربوط به مهاجرت را در پوشه‌ای مانند migrations قرار دهید و هنگام راه‌اندازی برنامه، مهاجرت‌های موردنیاز را اجرا کنید. البته پیش از اجرای مهاجرت روی اطلاعات واقعی کاربران، باید از داده‌ها نسخه پشتیبان تهیه کنید و سازگاری تغییرات را بررسی کنید.

۶. تعریف مدل Patient در Rust

پس از ایجاد جدول، بهتر است ساختاری در Rust تعریف کنید که شکل داده‌های بیمار را مشخص کند. این ساختار می‌تواند با کمک serde::Serialize به داده‌ای تبدیل شود که از طریق فرمان Tauri به React بازگردانده می‌شود. نکته مهم این است که نام و نوع فیلدهای ساختار باید با خروجی پرس‌وجوی SQL سازگار باشند؛ در غیر این صورت ممکن است هنگام تبدیل رکورد به ساختار Rust خطا رخ دهد. برای نمونه، اگر id در SQLite عدد صحیح است، مدل نیز باید نوع سازگار با مقدار بازگشتی را انتخاب کند. همچنین اگر تاریخ‌ها در پایگاه داده به‌صورت متن ذخیره می‌شوند، باید قالب آن‌ها در کل برنامه یکسان باشد تا مقایسه، مرتب‌سازی و نمایش اطلاعات دچار ابهام نشود.

نمونه ساده مدل:

use serde::Serialize;

#[derive(Debug, Serialize)]
pub struct Patient {
    pub id: i64,
    pub first_name: String,
    pub last_name: String,
    pub mobile: Option<String>,
    pub created_at: String,
}

در این مثال، شماره تماس می‌تواند مقدار None داشته باشد؛ این انتخاب با امکان خالی بودن ستون mobile در جدول هماهنگ است.

۷. اجرای پرس‌وجوها و مدیریت خطا

در یک برنامه واقعی، اجرای پرس‌وجوی پایگاه داده نباید بدون مدیریت خطا انجام شود. برای مثال، اگر جدول وجود نداشته باشد، فایل پایگاه داده باز نشود یا اتصال قطع شود، برنامه باید خطا را به‌شکل قابل پیش‌بینی مدیریت کند. با SQLx می‌توانید از پرس‌وجوهای پارامتری استفاده کنید تا مقادیر ورودی به‌صورت امن به دستور SQL منتقل شوند. این روش از ساختن رشته SQL با الحاق مستقیم ورودی کاربر بهتر است و خطر تزریق SQL را کاهش می‌دهد. در لایه React نیز باید خطاهای بازگشتی مدیریت شوند و پیام مناسبی به کاربر نمایش داده شود، اما جزئیات فنی حساس نباید بدون ضرورت در رابط عمومی افشا شوند.

برای نمونه، الگوی پرس‌وجوی پارامتری می‌تواند به شکل زیر باشد:

let patient = sqlx::query_as::<_, Patient>(
    "SELECT id, first_name, last_name, mobile, created_at
     FROM patients
     WHERE id = ?"
)
.bind(patient_id)
.fetch_optional(&pool)
.await?;

این نمونه به وجود مدل مناسب و اتصال معتبر pool نیاز دارد و باید در تابع ناهمگام و با مدیریت خطای سازگار با پروژه استفاده شود.

جلوگیری از ثبت نوبت‌های تکراری

در سیستم نوبت‌دهی، صرفاً نمایش نوبت‌های آزاد در رابط کاربری برای جلوگیری از رزرو تکراری کافی نیست. ممکن است دو اپراتور تقریباً هم‌زمان یک نوبت را انتخاب کنند و هر دو پیش از به‌روزرسانی صفحه تصور کنند که نوبت آزاد است. به همین دلیل، محدودیت‌های پایگاه داده و تراکنش‌ها باید بخشی از طراحی باشند. برای مثال، اگر هر تخت در هر بازه زمانی فقط یک نوبت می‌تواند داشته باشد، باید قاعده یکتایی یا محدودیت مناسب متناسب با مدل زمان‌بندی تعریف شود. همچنین عملیات بررسی ظرفیت و ثبت نوبت باید به‌گونه‌ای طراحی شود که رقابت میان درخواست‌ها موجب ثبت ناسازگار نشود. این موضوع نشان می‌دهد که صحت داده‌ها نباید فقط به اعتبارسنجی سمت React وابسته باشد.

چگونه یک برنامه Tauri را برای استفاده واقعی آماده کنیم؟

ساخت برنامه در محیط توسعه به این معنا نیست که نرم‌افزار برای انتشار عمومی آماده است. در زمان توسعه، ممکن است ابزارهای اضافی روی رایانه شما نصب باشند، داده‌ها در مسیرهای موقت ذخیره شوند و خطاها فقط در ترمینال نمایش داده شوند؛ اما کاربر نهایی معمولاً به این امکانات دسترسی ندارد. یک برنامه دسکتاپ حرفه‌ای باید بتواند بدون نیاز به محیط توسعه اجرا شود، داده‌های خود را به‌درستی مدیریت کند و در برابر خطاهای قابل پیش‌بینی رفتار مشخصی داشته باشد. همچنین باید دسترسی به قابلیت‌های بومی، اطلاعات حساس و عملیات پایگاه داده به‌شکل اصولی کنترل شود. بنابراین، مرحله آماده‌سازی انتشار شامل بررسی امنیت، آزمون، بهینه‌سازی، بسته‌بندی و طراحی روش به‌روزرسانی است.

۱. محدود کردن دسترسی‌های برنامه با Capabilities

یکی از ویژگی‌های امنیتی مهم Tauri 2، امکان تعریف دسترسی‌های مشخص برای بخش‌های مختلف برنامه است. به‌جای اینکه همه قابلیت‌های افزونه‌ها را بدون محدودیت فعال کنید، باید تعیین کنید هر پنجره به کدام عملیات نیاز دارد. برای مثال، صفحه مدیریت بیماران ممکن است به فرمان‌های مربوط به خواندن و ثبت بیمار نیاز داشته باشد، اما لزوماً نباید اجازه اجرای عملیات غیرمرتبط با مدیریت فایل یا تنظیمات حساس سیستم را داشته باشد. تعریف دسترسی‌های محدود، سطح خطر ناشی از خطاهای احتمالی در رابط کاربری را کاهش می‌دهد. البته این سازوکار جایگزین اعتبارسنجی ورودی‌ها و کنترل مجوزهای تجاری در بخش Rust یا سرور نیست؛ هر لایه باید مسئولیت امنیتی مشخصی داشته باشد.

۲. محافظت از اطلاعات حساس کاربران

اگر برنامه شما اطلاعات شخصی، مالی یا درمانی ذخیره می‌کند، باید پیش از انتشار درباره نحوه محافظت از این داده‌ها تصمیم بگیرید. ذخیره اطلاعات در SQLite به‌خودی‌خود به معنای رمزگذاری فایل پایگاه داده نیست و هر فردی که به فایل دسترسی داشته باشد ممکن است بتواند محتوای آن را بررسی کند. بسته به سطح حساسیت اطلاعات، می‌توانید از کنترل دسترسی سیستم‌عامل، رمزگذاری مناسب، مدیریت امن کلیدها و سیاست‌های پشتیبان‌گیری استفاده کنید. کلیدهای محرمانه را نباید در کد React یا فایل‌های JavaScript بسته‌بندی‌شده قرار دهید، زیرا این اطلاعات می‌توانند استخراج شوند. همچنین در نرم‌افزارهای پزشکی باید دسترسی کاربران به پرونده‌ها و ثبت رویدادهای حساس مطابق الزامات واقعی پروژه طراحی شود.

۳. مدیریت خطا و جلوگیری از توقف ناگهانی

در محیط توسعه، دیدن خطا در ترمینال برای برنامه‌نویس مفید است، اما کاربر نهایی به پیام قابل فهم نیاز دارد. برای نمونه، اگر فایل پایگاه داده باز نشود، برنامه نباید فقط یک پیام فنی طولانی نمایش دهد یا بدون توضیح بسته شود. بهتر است خطا در لایه Rust ثبت و دسته‌بندی شود و رابط کاربری پیام مناسبی مانند «امکان بارگذاری اطلاعات وجود ندارد؛ دوباره تلاش کنید» نشان دهد. البته ثبت گزارش‌ها باید به‌گونه‌ای باشد که اطلاعات محرمانه کاربران یا محتوای حساس پایگاه داده بی‌دلیل در فایل‌های گزارش ذخیره نشود. برای خطاهای قابل بازیابی، مانند قطع موقت ارتباط با سرور، می‌توان امکان تلاش مجدد را فراهم کرد؛ اما خطاهای ساختاری پایگاه داده نیازمند بررسی دقیق‌تر هستند.

۴. بهینه‌سازی زمان اجرای برنامه

سرعت یک برنامه دسکتاپ فقط به زبان برنامه‌نویسی آن وابسته نیست. تعداد کامپوننت‌های React، حجم فایل‌های JavaScript، نحوه دریافت اطلاعات و تعداد پرس‌وجوهای پایگاه داده نیز می‌توانند روی تجربه کاربر اثر بگذارند. برای مثال، اگر فهرست هزاران بیمار را بدون صفحه‌بندی دریافت کنید و تمام ردیف‌ها را هم‌زمان نمایش دهید، رابط کاربری ممکن است کند شود. استفاده از صفحه‌بندی، فیلتر سمت پایگاه داده و دریافت فقط ستون‌های موردنیاز می‌تواند هزینه پردازش و انتقال داده را کاهش دهد. همچنین بهتر است قبل از بهینه‌سازی‌های پیچیده، زمان بارگذاری و عملیات مهم را اندازه‌گیری کنید تا تغییرات بر اساس شواهد انجام شوند، نه حدس.

۵. کاهش حجم بسته نهایی

Tauri به دلیل استفاده از WebView سیستم‌عامل می‌تواند در بسیاری از سناریوها بسته کم‌حجم‌تری نسبت به معماری‌هایی داشته باشد که مرورگر کامل را همراه برنامه توزیع می‌کنند. بااین‌حال، اندازه خروجی نهایی به کتابخانه‌های استفاده‌شده، منابع گرافیکی، فونت‌ها، فایل‌های داده و روش بسته‌بندی وابسته است. برای کاهش حجم، ابتدا وابستگی‌های غیرضروری را حذف کنید و مطمئن شوید فایل‌های آزمایشی یا منابعی که در نسخه نهایی استفاده نمی‌شوند، وارد بسته نشده‌اند. تصاویر بزرگ و فایل‌های تکراری نیز می‌توانند حجم برنامه را افزایش دهند. پس از هر تغییر، خروجی واقعی را بررسی کنید؛ کوچک‌تر شدن فایل‌های JavaScript الزاماً به همان میزان حجم نصب‌کننده را کاهش نمی‌دهد.

۶. آماده‌سازی نسخه نصب‌شدنی برای ویندوز

برای انتشار برنامه روی ویندوز، باید نوع بسته نصب را متناسب با نیاز کاربران انتخاب کنید. Tauri امکان تولید بسته‌هایی مانند MSI و در برخی پیکربندی‌ها نصب‌کننده‌های دیگر را فراهم می‌کند. پیش از ساخت نهایی، نام برنامه، شناسه، نسخه، آیکون و تنظیمات پنجره را در پیکربندی پروژه بررسی کنید. سپس با فرمان ساخت Tauri خروجی را تولید کرده و آن را روی یک رایانه آزمایشی اجرا کنید که محیط توسعه شما روی آن نصب نیست. این آزمون اهمیت زیادی دارد؛ زیرا ممکن است برنامه در رایانه توسعه‌دهنده به فایل یا مؤلفه‌ای وابسته باشد که در سیستم مقصد وجود ندارد. همچنین باید مطمئن شوید داده‌های کاربر در مسیر مناسب ذخیره می‌شوند و حذف یا نصب مجدد برنامه به‌صورت ناخواسته موجب از دست رفتن اطلاعات نمی‌شود.

۷. امضای دیجیتال و اعتماد کاربران

در زمان توزیع نرم‌افزار ویندوزی، امضای دیجیتال می‌تواند به شناسایی ناشر و بررسی دست‌کاری نشدن فایل‌های امضاشده کمک کند. این کار به‌خصوص زمانی اهمیت دارد که برنامه را از طریق وب‌سایت خود در اختیار کاربران قرار می‌دهید. البته امضای دیجیتال به‌تنهایی تضمین نمی‌کند که برنامه فاقد آسیب‌پذیری است یا همه هشدارهای امنیتی ویندوز از بین می‌روند. باید گواهی مناسب تهیه کنید، فرایند امضای فایل‌های قابل توزیع را تنظیم کنید و از محافظت درست کلید خصوصی مطمئن شوید. اگر نرم‌افزار به‌صورت تجاری عرضه می‌شود، بهتر است فرایند ساخت و امضای نسخه نهایی قابل تکرار باشد تا احتمال انتشار تصادفی فایل اشتباه کاهش یابد.

۸. طراحی به‌روزرسانی و پشتیبان‌گیری

پس از انتشار نسخه اول، کار توسعه تمام نمی‌شود. ممکن است خطاهای جدید شناسایی شوند، قابلیت‌های تازه اضافه شوند یا ساختار پایگاه داده تغییر کند؛ بنابراین باید برای به‌روزرسانی برنامه و حفظ داده‌های کاربران برنامه مشخصی داشته باشید. اگر از قابلیت به‌روزرسانی Tauri استفاده می‌کنید، تنظیمات مربوط به منبع به‌روزرسانی، امضا و اعتبارسنجی نسخه‌ها باید مطابق مستندات رسمی انجام شوند. در کنار آن، تغییرات ساختار SQLite باید از طریق مهاجرت‌های کنترل‌شده اجرا شوند و پیش از تغییرات پرخطر از اطلاعات نسخه پشتیبان تهیه شود. برای مثال، اگر نسخه جدید برنامه یک ستون ضروری اضافه می‌کند، باید بررسی کنید که اطلاعات ثبت‌شده در نسخه قبلی همچنان قابل استفاده باشند. انتشار تدریجی، آزمون روی نسخه‌های قبلی و داشتن روش بازیابی می‌تواند خطر از دست رفتن اطلاعات را کاهش دهد.

۹. آزمون نهایی پیش از انتشار عمومی

پیش از تحویل برنامه به کاربران، سناریوهای واقعی استفاده را آزمایش کنید. برای نمونه، در نرم‌افزار مدیریت کلینیک باید ثبت بیمار، ویرایش اطلاعات، جست‌وجو، ثبت نوبت، جلوگیری از نوبت تکراری و بازیابی اطلاعات پس از راه‌اندازی مجدد بررسی شوند. همچنین باید رفتار برنامه هنگام بسته شدن ناگهانی، نبود فایل پایگاه داده یا وارد کردن داده نامعتبر را آزمایش کنید. آزمون رابط کاربری نیز باید شامل نمایش صحیح زبان فارسی، جهت راست‌به‌چپ، فونت‌ها و اندازه‌های مختلف پنجره باشد. در نهایت، نصب‌کننده را روی یک محیط پاک اجرا کنید و بررسی کنید که کاربر بدون نصب ابزارهای توسعه بتواند برنامه را نصب و راه‌اندازی کند.

آماده‌سازی نسخه نهایی Tauri مجموعه‌ای از اقدامات مرتبط با امنیت، عملکرد، بسته‌بندی و نگهداری است. محدود کردن مجوزها، اعتبارسنجی داده‌ها، مدیریت خطا و حفاظت از پایگاه داده باید از ابتدا در معماری برنامه لحاظ شوند. پس از آن، با آزمون روی محیطی مستقل، بررسی وابستگی‌ها و طراحی روش به‌روزرسانی می‌توانید احتمال بروز مشکلات پس از انتشار را کاهش دهید. یک برنامه دسکتاپ حرفه‌ای فقط برنامه‌ای نیست که بدون خطا اجرا شود؛ باید اطلاعات کاربران را به‌درستی نگهداری کند، در شرایط غیرمنتظره رفتار قابل پیش‌بینی داشته باشد و امکان توسعه و نگهداری بلندمدت آن فراهم باشد.

نتیجه‌گیری: آیا Tauri انتخاب مناسبی برای پروژه شماست؟

راه‌اندازی Tauri زمانی ارزشمند است که بخواهید از مهارت‌های توسعه وب برای ساخت یک نرم‌افزار دسکتاپ واقعی استفاده کنید. با ترکیب React و TypeScript می‌توانید رابط کاربری مدرن بسازید و با Rust به قابلیت‌های بومی سیستم‌عامل دسترسی پیدا کنید. استفاده از WebView سیستم‌عامل نیز در بسیاری از پروژه‌ها امکان ساخت بسته‌ای سبک‌تر از برنامه‌های مبتنی بر Chromium همراه را فراهم می‌کند؛ هرچند اندازه نهایی به ساختار برنامه و وابستگی‌های آن بستگی دارد.

برای شروع، ترتیب درست کار اهمیت زیادی دارد: ابتدا محیط Node.js و Rust را آماده کنید، سپس پروژه React را بسازید، Tauri را به آن اضافه کنید و اجرای برنامه دسکتاپ را آزمایش کنید. پس از آن، طراحی رابط کاربری، ارتباط با فرمان‌های Rust، اتصال SQLite و ساخت نسخه قابل نصب را به‌ترتیب پیش ببرید. این روش باعث می‌شود اگر خطایی رخ داد، محدوده بررسی مشخص باشد و مجبور نشوید همه بخش‌های برنامه را هم‌زمان تغییر دهید.

اگر هدف شما ساخت یک نرم‌افزار مدیریت کلینیک یا سیستم نوبت‌دهی ویندوزی است، ترکیب Tauri 2، React، TypeScript، Tailwind CSS و SQLite می‌تواند نقطه شروع مناسبی باشد. بااین‌حال، اگر برنامه به دسترسی هم‌زمان چند رایانه به اطلاعات مشترک نیاز دارد، باید معماری سرور و پایگاه داده مرکزی را نیز در نظر بگیرید. انتخاب درست معماری از همان ابتدا، از بازنویسی پرهزینه در آینده جلوگیری می‌کند.

کلیدواژه ها

راه‌اندازی Tauri, آموزش Tauri, آموزش Tauri 2, Tauri چیست, نصب Tauri در ویندوز, ساخت برنامه دسکتاپ با React, آموزش Rust, React و Rust, Tauri و React, ساخت فایل EXE با Tauri, Tauri SQLite, اتصال SQLite به Tauri, Tailwind CSS در Tauri, برنامه نویسی دسکتاپ با Tauri, مقایسه Tauri و Electron

پرسش و پاسخ

1 . آیا برای استفاده از Tauri باید زبان Rust را بلد باشیم؟
برای ساخت رابط کاربری با React، آشنایی با Rust از ابتدا ضروری نیست. اما اگر بخواهید فرمان‌های بومی، عملیات پایگاه داده با SQLx یا قابلیت‌های اختصاصی سیستم‌عامل را پیاده‌سازی کنید، یادگیری اصول Rust بسیار مفید خواهد بود. در پروژه‌های حرفه‌ای بهتر است با مالکیت داده‌ها، مدیریت خطا، ساختار ماژول‌ها و برنامه‌نویسی ناهمگام در Rust آشنا شوید.

2 . آیا می‌توان با Tauri یک فایل EXE برای ویندوز ساخت؟
بله. با اجرای فرمان npm run tauri build در پروژه‌ای که اسکریپت مربوطه را دارد، می‌توانید برنامه را کامپایل و بسته‌بندی کنید. نوع و محل خروجی به تنظیمات پروژه وابسته است و ممکن است علاوه بر فایل اجرایی، بسته نصب نیز تولید شود. پیش از توزیع باید وابستگی‌های محیط اجرا و نیازمندی‌های نصب روی رایانه مقصد را بررسی کنید.

3 . برای ساخت نرم‌افزار دسکتاپ، Tauri بهتر است یا Electron؟
پاسخ به نیاز پروژه بستگی دارد. Tauri برای برنامه‌هایی که به رابط وب و بخش بومی مبتنی بر Rust نیاز دارند، گزینه مناسبی است و معمولاً امکان بسته‌بندی کم‌حجم‌تری فراهم می‌کند. Electron نیز اکوسیستم گسترده‌ای دارد و در پروژه‌هایی که به قابلیت‌ها و کتابخانه‌های Node.js وابسته‌اند، می‌تواند انتخاب ساده‌تری باشد.

4 . آیا می‌توان از SQLite در برنامه Tauri استفاده کرد؟
بله. می‌توانید از افزونه SQL رسمی Tauri یا کتابخانه‌هایی مانند SQLx در بخش Rust استفاده کنید. در هر دو روش، باید مسیر پایگاه داده، مجوزها، مدیریت خطا و پشتیبان‌گیری را درست طراحی کنید. همچنین SQLite محلی به‌خودی‌خود راهکار همگام‌سازی اطلاعات میان چند رایانه نیست.

5 . آیا می‌توان از React Router و Tailwind CSS در Tauri استفاده کرد؟
بله. Tauri به فریم‌ورک رابط کاربری خاصی محدود نیست و می‌توانید React Router و Tailwind CSS را مانند یک پروژه وب به کار بگیرید. برای برنامه‌های دسکتاپ فارسی، تنظیم جهت راست‌به‌چپ، مدیریت مسیرهای داخلی و سازگاری رابط با اندازه پنجره اهمیت دارد. اگر از HashRouter استفاده کنید، مسیرهای داخلی برنامه بدون نیاز به پیکربندی مسیرهای سرور وب مدیریت می‌شوند.

دیدگاه ها

برای ارسال دیدگاه وارد حساب کاربری خود شوید.