সলিড রাউটারের একটি সম্পূর্ণ গাইড, যা সলিডজেএস-এর অফিসিয়াল ক্লায়েন্ট-সাইড রাউটার। এখানে ইনস্টলেশন, ব্যবহার, উন্নত বৈশিষ্ট্য এবং সেরা অনুশীলন আলোচনা করা হয়েছে।
সলিড রাউটার: সলিডজেএস-এ ক্লায়েন্ট-সাইড নেভিগেশনে দক্ষতা অর্জন
সলিডজেএস, তার অসাধারণ পারফরম্যান্স এবং সরলতার জন্য পরিচিত, আধুনিক ওয়েব অ্যাপ্লিকেশন তৈরির জন্য একটি চমৎকার ভিত্তি প্রদান করে। সত্যিই আকর্ষণীয় এবং ব্যবহারকারী-বান্ধব অভিজ্ঞতা তৈরি করতে, একটি শক্তিশালী ক্লায়েন্ট-সাইড রাউটার অপরিহার্য। এখানেই আসে সলিড রাউটার, সলিডজেএস-এর জন্য অফিসিয়াল এবং প্রস্তাবিত রাউটার, যা ফ্রেমওয়ার্কের রিঅ্যাক্টিভ নীতির সাথে নির্বিঘ্নে সংহত হওয়ার জন্য ডিজাইন করা হয়েছে।
এই বিস্তারিত গাইডটি সলিড রাউটারের জগতে প্রবেশ করাবে, যেখানে বেসিক সেটআপ থেকে শুরু করে জটিল এবং ডাইনামিক সিঙ্গেল-পেজ অ্যাপ্লিকেশন (SPAs) তৈরির উন্নত কৌশল পর্যন্ত সবকিছু আলোচনা করা হবে। আপনি একজন অভিজ্ঞ সলিডজেএস ডেভেলপার হন বা সবে শুরু করছেন, এই নিবন্ধটি আপনাকে ক্লায়েন্ট-সাইড নেভিগেশনে দক্ষতা অর্জনের জন্য প্রয়োজনীয় জ্ঞান এবং দক্ষতা দিয়ে সজ্জিত করবে।
সলিড রাউটার কী?
সলিড রাউটার হলো একটি হালকা ও উচ্চ পারফরম্যান্সের ক্লায়েন্ট-সাইড রাউটার যা বিশেষভাবে সলিডজেএস-এর জন্য ডিজাইন করা হয়েছে। এটি ব্রাউজারের URL-এর পরিবর্তনের উপর ভিত্তি করে UI আপডেট করার জন্য সলিডজেএস-এর রিঅ্যাক্টিভিটি ব্যবহার করে। ভার্চুয়াল DOM ডিফ্রেন্সিং-এর উপর নির্ভরশীল প্রচলিত রাউটারগুলোর বিপরীতে, সলিড রাউটার সরাসরি DOM পরিবর্তন করে, যার ফলে দ্রুত এবং আরও অনুমানযোগ্য পারফরম্যান্স পাওয়া যায়।
সলিড রাউটারের প্রধান বৈশিষ্ট্যগুলো হলো:
- ডিক্লেয়ারেটিভ রাউটিং (Declarative Routing): একটি সহজ এবং স্বজ্ঞাত JSX-ভিত্তিক API ব্যবহার করে আপনার রুটগুলো নির্ধারণ করুন।
- ডাইনামিক রাউটিং (Dynamic Routing): প্যারামিটার সহ রুটগুলো সহজেই পরিচালনা করুন, যা আপনাকে ডাইনামিক এবং ডেটা-চালিত অ্যাপ্লিকেশন তৈরি করতে দেয়।
- নেস্টেড রুট (Nested Routes): নেস্টেড রুট ব্যবহার করে আপনার অ্যাপ্লিকেশনকে যৌক্তিক বিভাগে সংগঠিত করুন।
- লিঙ্ক কম্পোনেন্ট (Link Component):
<A>কম্পোনেন্ট ব্যবহার করে রুটগুলোর মধ্যে নির্বিঘ্নে নেভিগেট করুন, যা স্বয়ংক্রিয়ভাবে URL আপডেট এবং সক্রিয় লিঙ্ক স্টাইলিং পরিচালনা করে। - ডেটা লোডিং (Data Loading): একটি রুট রেন্ডার করার আগে অ্যাসিঙ্ক্রোনাসভাবে ডেটা লোড করুন, যা একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করে।
- ট্রানজিশন (Transitions): ব্যবহারকারীর অভিজ্ঞতা বাড়ানোর জন্য রুটগুলোর মধ্যে দৃষ্টিনন্দন ট্রানজিশন তৈরি করুন।
- ত্রুটি হ্যান্ডলিং (Error Handling): সুন্দরভাবে ত্রুটিগুলো পরিচালনা করুন এবং কাস্টম ত্রুটি পৃষ্ঠা প্রদর্শন করুন।
- হিস্ট্রি এপিআই ইন্টিগ্রেশন (History API Integration): ব্রাউজারের হিস্ট্রি এপিআই-এর সাথে নির্বিঘ্নে সংহত হয়, যা ব্যবহারকারীদের ব্যাক এবং ফরওয়ার্ড বোতাম ব্যবহার করে নেভিগেট করতে দেয়।
সলিড রাউটারের সাথে শুরু করা
ইনস্টলেশন
সলিড রাউটার ইনস্টল করতে, আপনার পছন্দের প্যাকেজ ম্যানেজার ব্যবহার করুন:
npm install @solidjs/router
yarn add @solidjs/router
pnpm add @solidjs/router
বেসিক সেটআপ
সলিড রাউটারের মূল ভিত্তি হলো <Router> এবং <Route> কম্পোনেন্ট। <Router> কম্পোনেন্টটি আপনার অ্যাপ্লিকেশনের রাউটিং সিস্টেমের মূল হিসাবে কাজ করে, যখন <Route> কম্পোনেন্টগুলো URL এবং কম্পোনেন্টের মধ্যে ম্যাপিং নির্ধারণ করে।
এখানে একটি সাধারণ উদাহরণ দেওয়া হলো:
import { Router, Route } from '@solidjs/router';
import Home from './components/Home';
import About from './components/About';
function App() {
return (
<Router>
<Route path="/"> <Home/> </Route>
<Route path="/about"> <About/> </Route>
</Router>
);
}
export default App;
এই উদাহরণে, <Router> কম্পোনেন্টটি পুরো অ্যাপ্লিকেশনকে আবৃত করে। <Route> কম্পোনেন্টগুলো দুটি রুট নির্ধারণ করে: একটি রুট পাথের জন্য ("/") এবং অন্যটি "/about" পাথের জন্য। যখন ব্যবহারকারী এই পাথগুলোর যেকোনো একটিতে নেভিগেট করে, তখন সংশ্লিষ্ট কম্পোনেন্ট (Home বা About) রেন্ডার হবে।
<A> কম্পোনেন্ট
রুটগুলোর মধ্যে নেভিগেট করতে, সলিড রাউটারের দেওয়া <A> কম্পোনেন্টটি ব্যবহার করুন। এই কম্পোনেন্টটি একটি সাধারণ HTML <a> ট্যাগের মতো, কিন্তু এটি স্বয়ংক্রিয়ভাবে URL আপডেট পরিচালনা করে এবং সম্পূর্ণ পৃষ্ঠা পুনরায় লোড হওয়া থেকে বিরত রাখে।
import { A } from '@solidjs/router';
function Navigation() {
return (
<nav>
<A href="/">Home</A>
<A href="/about">About</A>
</nav>
);
}
export default Navigation;
যখন ব্যবহারকারী এই লিঙ্কগুলোর একটিতে ক্লিক করে, তখন সলিড রাউটার ব্রাউজারের URL আপডেট করবে এবং সম্পূর্ণ পৃষ্ঠা রিলোড না করেই সংশ্লিষ্ট কম্পোনেন্ট রেন্ডার করবে।
অ্যাডভান্সড রাউটিং কৌশল
রুট প্যারামিটারসহ ডাইনামিক রাউটিং
সলিড রাউটার ডাইনামিক রাউটিং সমর্থন করে, যা আপনাকে প্যারামিটারসহ রুট তৈরি করতে দেয়। এটি একটি নির্দিষ্ট আইডি বা স্লাগের উপর ভিত্তি করে কন্টেন্ট প্রদর্শনের জন্য দরকারী।
import { Router, Route } from '@solidjs/router';
import UserProfile from './components/UserProfile';
function App() {
return (
<Router>
<Route path="/users/:id"> <UserProfile/> </Route>
</Router>
);
}
export default App;
এই উদাহরণে, পাথের :id অংশটি একটি রুট প্যারামিটার। UserProfile কম্পোনেন্টের মধ্যে id প্যারামিটারের মান অ্যাক্সেস করতে, আপনি useParams হুক ব্যবহার করতে পারেন:
import { useParams } from '@solidjs/router';
import { createResource } from 'solid-js';
function UserProfile() {
const params = useParams();
const [user] = createResource(() => params.id, fetchUser);
return (
<div>
<h1>User Profile</h1>
{user() ? (
<div>
<p>Name: {user().name}</p>
<p>Email: {user().email}</p>
</div>
) : (<p>Loading...</p>)}
</div>
);
}
async function fetchUser(id: string) {
const response = await fetch(`https://api.example.com/users/${id}`);
return response.json();
}
export default UserProfile;
useParams হুকটি রুট প্যারামিটার ধারণকারী একটি অবজেক্ট রিটার্ন করে। এই ক্ষেত্রে, params.id URL থেকে id প্যারামিটারের মান ধারণ করবে। এরপর createResource হুকটি আইডি-এর উপর ভিত্তি করে ব্যবহারকারীর ডেটা আনার জন্য ব্যবহৃত হয়।
আন্তর্জাতিক উদাহরণ: একটি বিশ্বব্যাপী ই-কমার্স প্ল্যাটফর্মের কথা ভাবুন। আপনি পণ্যের আইডি-এর উপর ভিত্তি করে পণ্যের বিবরণ প্রদর্শন করতে ডাইনামিক রাউটিং ব্যবহার করতে পারেন: /products/:productId। এটি আপনাকে প্রতিটি পণ্যের জন্য অনন্য URL তৈরি করতে দেয়, যা ব্যবহারকারীদের জন্য তাদের অবস্থান নির্বিশেষে নির্দিষ্ট আইটেম শেয়ার এবং বুকমার্ক করা সহজ করে তোলে।
নেস্টেড রুট
নেস্টেড রুট আপনাকে আপনার অ্যাপ্লিকেশনকে যৌক্তিক বিভাগে সংগঠিত করতে দেয়। এটি একাধিক স্তরের নেভিগেশন সহ জটিল অ্যাপ্লিকেশনগুলোর জন্য বিশেষভাবে দরকারী।
import { Router, Route } from '@solidjs/router';
import Dashboard from './components/Dashboard';
import Profile from './components/Profile';
import Settings from './components/Settings';
function App() {
return (
<Router>
<Route path="/dashboard">
<Dashboard/>
<Route path="/profile"> <Profile/> </Route>
<Route path="/settings"> <Settings/> </Route>
</Route>
</Router>
);
}
export default App;
এই উদাহরণে, <Dashboard> কম্পোনেন্টটি <Profile> এবং <Settings> কম্পোনেন্টের জন্য একটি কন্টেইনার হিসাবে কাজ করে। <Profile> এবং <Settings> রুটগুলো <Dashboard> রুটের মধ্যে নেস্টেড, যার মানে হলো ব্যবহারকারী যখন "/dashboard" পাথে থাকবে তখনই এগুলো রেন্ডার হবে।
<Dashboard> কম্পোনেন্টের মধ্যে নেস্টেড রুটগুলো রেন্ডার করতে, আপনাকে <Outlet> কম্পোনেন্ট ব্যবহার করতে হবে:
import { Outlet } from '@solidjs/router';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<nav>
<A href="/dashboard/profile">Profile</A>
<A href="/dashboard/settings">Settings</A>
</nav>
<Outlet/>
</div>
);
}
export default Dashboard;
<Outlet> কম্পোনেন্টটি একটি স্থানধারক হিসাবে কাজ করে যেখানে নেস্টেড রুটগুলো রেন্ডার হবে। যখন ব্যবহারকারী "/dashboard/profile"-এ নেভিগেট করবে, তখন <Profile> কম্পোনেন্টটি <Outlet> কম্পোনেন্টের মধ্যে রেন্ডার হবে। একইভাবে, যখন ব্যবহারকারী "/dashboard/settings"-এ নেভিগেট করবে, তখন <Settings> কম্পোনেন্টটি <Outlet> কম্পোনেন্টের মধ্যে রেন্ডার হবে।
createResource দিয়ে ডেটা লোডিং
একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য একটি রুট রেন্ডার করার আগে অ্যাসিঙ্ক্রোনাসভাবে ডেটা লোড করা অত্যন্ত গুরুত্বপূর্ণ। সলিড রাউটার সলিডজেএস-এর createResource হুকের সাথে নির্বিঘ্নে সংহত হয়, যা ডেটা লোডিংকে সহজ করে তোলে।
আমরা আগে UserProfile কম্পোনেন্টে এর একটি উদাহরণ দেখেছি, কিন্তু স্পষ্টতার জন্য এখানে আবার দেওয়া হলো:
import { useParams } from '@solidjs/router';
import { createResource } from 'solid-js';
function UserProfile() {
const params = useParams();
const [user] = createResource(() => params.id, fetchUser);
return (
<div>
<h1>User Profile</h1>
{user() ? (
<div>
<p>Name: {user().name}</p>
<p>Email: {user().email}</p>
</div>
) : (<p>Loading...</p>)}
</div>
);
}
async function fetchUser(id: string) {
const response = await fetch(`https://api.example.com/users/${id}`);
return response.json();
}
export default UserProfile;
createResource হুক দুটি আর্গুমেন্ট নেয়: একটি সিগন্যাল যা ডেটা লোডিং ট্রিগার করে এবং একটি ফাংশন যা ডেটা নিয়ে আসে। এক্ষেত্রে, সিগন্যালটি হলো () => params.id, যার মানে id প্যারামিটার পরিবর্তন হলেই ডেটা আনা হবে। fetchUser ফাংশনটি আইডি-এর উপর ভিত্তি করে একটি API থেকে ব্যবহারকারীর ডেটা নিয়ে আসে।
createResource হুক একটি অ্যারে রিটার্ন করে যাতে রিসোর্স (আনীত ডেটা) এবং ডেটা পুনরায় আনার জন্য একটি ফাংশন থাকে। রিসোর্সটি একটি সিগন্যাল যা ডেটা ধারণ করে। আপনি সিগন্যালটি কল করে (user()) ডেটা অ্যাক্সেস করতে পারেন। যদি ডেটা এখনও লোড হতে থাকে, তবে সিগন্যালটি undefined রিটার্ন করবে। এটি আপনাকে ডেটা আনার সময় একটি লোডিং ইন্ডিকেটর প্রদর্শন করতে দেয়।
ট্রানজিশন
রুটগুলোর মধ্যে ট্রানজিশন যোগ করলে ব্যবহারকারীর অভিজ্ঞতা উল্লেখযোগ্যভাবে উন্নত হতে পারে। যদিও সলিড রাউটারের বিল্ট-ইন ট্রানজিশন সমর্থন নেই, এটি solid-transition-group-এর মতো লাইব্রেরির সাথে ভালোভাবে সংহত হয়ে মসৃণ এবং দৃষ্টিনন্দন ট্রানজিশন অর্জন করে।
প্রথমে, solid-transition-group প্যাকেজটি ইনস্টল করুন:
npm install solid-transition-group
yarn add solid-transition-group
pnpm add solid-transition-group
তারপর, আপনার রুটগুলোকে <TransitionGroup> কম্পোনেন্ট দিয়ে মোড়ান:
import { Router, Route } from '@solidjs/router';
import { TransitionGroup, Transition } from 'solid-transition-group';
import Home from './components/Home';
import About from './components/About';
function App() {
return (
<Router>
<TransitionGroup>
<Route path="/">
<Transition name="fade" duration={300}>
<Home/>
</Transition>
</Route>
<Route path="/about">
<Transition name="fade" duration={300}>
<About/>
</Transition>
</Route>
</TransitionGroup>
</Router>
);
}
export default App;
এই উদাহরণে, প্রতিটি রুট একটি <Transition> কম্পোনেন্ট দিয়ে মোড়ানো আছে। name প্রপটি ট্রানজিশনের জন্য CSS ক্লাস প্রিফিক্স নির্দিষ্ট করে, এবং duration প্রপটি মিলিসেকেন্ডে ট্রানজিশনের সময়কাল নির্দিষ্ট করে।
আপনাকে আপনার স্টাইলশীটে ট্রানজিশনের জন্য সংশ্লিষ্ট CSS ক্লাসগুলো সংজ্ঞায়িত করতে হবে:
.fade-enter {
opacity: 0;
}
.fade-enter-active {
opacity: 1;
transition: opacity 300ms ease-in;
}
.fade-exit {
opacity: 1;
}
.fade-exit-active {
opacity: 0;
transition: opacity 300ms ease-out;
}
এই CSS কোডটি একটি সাধারণ ফেড-ইন/ফেড-আউট ট্রানজিশন সংজ্ঞায়িত করে। যখন একটি রুট প্রবেশ করে, তখন .fade-enter এবং .fade-enter-active ক্লাসগুলো প্রয়োগ করা হয়, যার ফলে কম্পোনেন্টটি ফেড ইন হয়। যখন একটি রুট থেকে প্রস্থান করা হয়, তখন .fade-exit এবং .fade-exit-active ক্লাসগুলো প্রয়োগ করা হয়, যার ফলে কম্পোনেন্টটি ফেড আউট হয়।
ত্রুটি হ্যান্ডলিং
একটি ভালো ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য সুন্দরভাবে ত্রুটিগুলো পরিচালনা করা অপরিহার্য। সলিড রাউটারের বিল্ট-ইন ত্রুটি হ্যান্ডলিং নেই, তবে আপনি একটি গ্লোবাল এরর বাউন্ডারি বা একটি রুট-নির্দিষ্ট এরর হ্যান্ডলার ব্যবহার করে সহজেই এটি প্রয়োগ করতে পারেন।
এখানে একটি গ্লোবাল এরর বাউন্ডারির উদাহরণ দেওয়া হলো:
import { createSignal, Suspense, ErrorBoundary } from 'solid-js';
import { Router, Route } from '@solidjs/router';
import Home from './components/Home';
import About from './components/About';
function App() {
const [error, setError] = createSignal(null);
return (
<ErrorBoundary fallback={<p>Something went wrong: {error()?.message}</p>}>
<Suspense fallback={<p>Loading...</p>}>
<Router>
<Route path="/"> <Home/> </Route>
<Route path="/about"> <About/> </Route>
</Router>
</Suspense>
</ErrorBoundary>
);
}
export default App;
<ErrorBoundary> কম্পোনেন্টটি তার চিলড্রেনদের মধ্যে ঘটে যাওয়া যেকোনো ত্রুটি ধরে ফেলে। fallback প্রপটি নির্দিষ্ট করে যে একটি ত্রুটি ঘটলে কোন কম্পোনেন্ট রেন্ডার করতে হবে। এক্ষেত্রে, এটি ত্রুটির বার্তা সহ একটি প্যারাগ্রাফ রেন্ডার করে।
<Suspense> কম্পোনেন্ট পেন্ডিং প্রমিজগুলো পরিচালনা করে, যা সাধারণত অ্যাসিঙ্ক কম্পোনেন্ট বা ডেটা লোডিং-এর সাথে ব্যবহৃত হয়। প্রমিজগুলো সমাধান না হওয়া পর্যন্ত এটি `fallback` প্রপটি প্রদর্শন করে।
একটি ত্রুটি ট্রিগার করতে, আপনি একটি কম্পোনেন্টের মধ্যে একটি এক্সেপশন থ্রো করতে পারেন:
function Home() {
throw new Error('Failed to load home page');
return <h1>Home</h1>;
}
export default Home;
যখন এই কোডটি চালানো হয়, তখন <ErrorBoundary> কম্পোনেন্টটি ত্রুটিটি ধরবে এবং ফলব্যাক কম্পোনেন্ট রেন্ডার করবে।
আন্তর্জাতিক বিবেচনা: ত্রুটির বার্তা প্রদর্শন করার সময়, আন্তর্জাতিকীকরণ (i18n) বিবেচনা করুন। ব্যবহারকারীর পছন্দের ভাষায় ত্রুটির বার্তা প্রদান করতে একটি অনুবাদ লাইব্রেরি ব্যবহার করুন। উদাহরণস্বরূপ, যদি জাপানের কোনো ব্যবহারকারী একটি ত্রুটির সম্মুখীন হন, তবে তাদের ত্রুটির বার্তাটি ইংরেজিতে নয়, জাপানি ভাষায় দেখতে পাওয়া উচিত।
সলিড রাউটার ব্যবহারের সেরা অনুশীলন
- আপনার রুটগুলো সংগঠিত রাখুন: আপনার অ্যাপ্লিকেশনকে যৌক্তিক বিভাগে সংগঠিত করতে নেস্টেড রুট ব্যবহার করুন। এটি আপনার কোড রক্ষণাবেক্ষণ এবং নেভিগেট করা সহজ করে তুলবে।
- ডাইনামিক কন্টেন্টের জন্য রুট প্যারামিটার ব্যবহার করুন: একটি নির্দিষ্ট আইডি বা স্লাগের উপর ভিত্তি করে কন্টেন্ট প্রদর্শনের জন্য ডাইনামিক URL তৈরি করতে রুট প্যারামিটার ব্যবহার করুন।
- অ্যাসিঙ্ক্রোনাসভাবে ডেটা লোড করুন: একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য একটি রুট রেন্ডার করার আগে অ্যাসিঙ্ক্রোনাসভাবে ডেটা লোড করুন।
- রুটগুলোর মধ্যে ট্রানজিশন যোগ করুন: ব্যবহারকারীর অভিজ্ঞতা বাড়াতে এবং আপনার অ্যাপ্লিকেশনকে আরও পরিশীলিত মনে করতে ট্রানজিশন ব্যবহার করুন।
- সুন্দরভাবে ত্রুটিগুলো পরিচালনা করুন: ব্যবহারকারী-বান্ধব উপায়ে ত্রুটিগুলো ধরতে এবং প্রদর্শন করতে এরর হ্যান্ডলিং প্রয়োগ করুন।
- বর্ণনামূলক রুটের নাম ব্যবহার করুন: এমন রুটের নাম বাছুন যা রুটের বিষয়বস্তুকে সঠিকভাবে প্রতিফলিত করে। এটি আপনার অ্যাপ্লিকেশনের কাঠামো বোঝা সহজ করে তুলবে।
- আপনার রুটগুলো পরীক্ষা করুন: আপনার রুটগুলো সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করতে ইউনিট টেস্ট লিখুন। এটি আপনাকে তাড়াতাড়ি ত্রুটি ধরতে এবং রিগ্রেশন প্রতিরোধ করতে সহায়তা করবে।
উপসংহার
সলিড রাউটার একটি শক্তিশালী এবং নমনীয় ক্লায়েন্ট-সাইড রাউটার যা সলিডজেএস-এর সাথে নির্বিঘ্নে সংহত হয়। এর বৈশিষ্ট্যগুলো আয়ত্ত করে এবং সেরা অনুশীলনগুলো অনুসরণ করে, আপনি জটিল এবং ডাইনামিক সিঙ্গেল-পেজ অ্যাপ্লিকেশন তৈরি করতে পারেন যা একটি মসৃণ এবং আকর্ষণীয় ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। বেসিক সেটআপ থেকে শুরু করে ডাইনামিক রাউটিং, ডেটা লোডিং এবং ট্রানজিশনের মতো উন্নত কৌশল পর্যন্ত, এই গাইডটি আপনাকে সলিডজেএস-এ ক্লায়েন্ট-সাইড নেভিগেশনের জগতে আত্মবিশ্বাসের সাথে নেভিগেট করার জন্য প্রয়োজনীয় জ্ঞান এবং দক্ষতা প্রদান করেছে। সলিড রাউটারের শক্তিকে আলিঙ্গন করুন এবং আপনার সলিডজেএস অ্যাপ্লিকেশনগুলোর সম্পূর্ণ সম্ভাবনা উন্মোচন করুন!
সবচেয়ে আপ-টু-ডেট তথ্য এবং উদাহরণের জন্য অফিসিয়াল সলিড রাউটার ডকুমেন্টেশন দেখতে ভুলবেন না: [সলিড রাউটার ডকুমেন্টেশন লিঙ্ক - প্লেসহোল্ডার]
সলিডজেএস দিয়ে অসাধারণ জিনিস তৈরি করতে থাকুন!