diff --git a/docs/frontend/05-angular.md b/docs/frontend/05-angular.md new file mode 100644 index 00000000..82cfcacc --- /dev/null +++ b/docs/frontend/05-angular.md @@ -0,0 +1,591 @@ +--- +title: Angular +description: انگولار، جایی که بایندینگ‌ها بیشتر از ستاره‌های آسمون می‌درخشن +tags: [ Angular,NodeJs ] +--- + +# Angular + +## Web Frameworks + +یک فریمورک وب مجموعه‌ای از ابزارها، کتابخانه‌ها و الگوهای آماده است که برای توسعه سریع‌تر و کارآمدتر برنامه‌های وب +استفاده می‌شود. این فریمورک‌ها ساختار و چارچوبی مشخص فراهم می‌کنند که به توسعه‌دهندگان کمک می‌کند تا کدهای خود را به‌طور +سازمان‌یافته بنویسند، وظایف رایج مانند مسیریابی، مدیریت وضعیت، و تعامل با سرور را ساده کنند و همچنین از ابزارهای +بهینه‌سازی و تست برای بهبود کیفیت و عملکرد برنامه‌ها بهره‌مند شوند. +استفاده از فریمورک‌های وب مانند +React +و +Angular +به دلیل فراهم کردن ساختار و الگوی مشخص، افزایش بهره‌وری و سرعت توسعه، وجود جامعه‌ی کاربری بزرگ و پشتیبانی، و بهینه‌سازی +عملکرد کد توصیه می‌شود. این فریمورک‌ها مدیریت پروژه‌های بزرگ‌تر و پیچیده‌تر را آسان‌تر کرده و ابزارهای مناسبی برای تست و +نگهداری کد فراهم می‌کنند. در مقابل، جاوااسکریپت خام برای پروژه‌های کوچک مناسب‌تر است و در پروژه‌های بزرگ به سرعت پیچیده +می‌شود. + +## چرا Angular + +از این فریمورک استفاده می‌کنیم چون ساختار ماژولار و قابلیت‌های داخلی جامعی دارد که توسعه برنامه‌های پیچیده را ساده و +سریع می‌کند. همچنین، این فریمورک +قابلیت تست‌پذیری بالا و عملکرد بهینه‌ای ارائه می‌دهد که کیفیت و پایداری برنامه‌ها را تضمین می‌کند. + +## مقدمه‌ای بر Angular + +[Angular](https://angular.io/) یک فریمورک و پلتفرم برای ساخت برنامه‌های تک‌صفحه‌ای +(SPA +یا +Single Page Application) +با +استفاده از +HTML +و +TypeScript +است. این فریمورک توسط گوگل توسعه داده شده و نگهداری می‌شود و ابزارها و معماری محکمی را برای +ساخت برنامه‌های قابل گسترش ارائه می‌دهد. + +### ویژگی‌ها و مزایای کلیدی Angular + +- **TypeScript** + Angular + با + TypeScript + نوشته شده است که یک + SuperSet + بر + JavaScript + است و ویژگی‌های زیادی از جمله تایپ استاتیک را به زبان اضافه می‌کند. + +- **Templating** + Angular + از یک سیستم طراحی + template + پیشرفته استفاده می‌کند که به شما این امکان را می‌دهد تا بتوانید به راحتی داده‌های پویا را به + template + متصل کنید. + +- **Component / Directive** + با استفاده از دایرکتیوها و کامپوننت‌ها می‌توانید رفتارها و نماهایی با قابلیت استفاده مجدد ایجاد کنید. + +**** + +# مرور کلی بر Angular + +Angular +از مفاهیم و ابزارهای متعددی تشکیل شده که به توسعه‌دهندگان کمک می‌کند تا برنامه‌های وب پیچیده را به روشی ماژولار و +ساختاریافته توسعه دهند. در اینجا برخی از مفاهیم کلیدی و اجزای اصلی +Angular +آورده شده است: + +- **ماژول‌ها (Modules)** + هر برنامه + Angular + از یک یا چند ماژول تشکیل شده است. ماژول‌ها به سازماندهی کد و مدیریت وابستگی‌ها کمک می‌کنند. + +- **کامپوننت‌ها (Components)** + کامپوننت‌ها بلوک‌های ساختمانی اصلی یک برنامه + Angular + هستند. هر کامپوننت شامل یک کلاس + TypeScript، + یک قالب + HTML + و یک فایل + CSS + است. + +- **دایرکتیوها (Directives)** + دایرکتیوها به شما امکان می‌دهند تا رفتارهای خاصی را به المان‌های انگولار اضافه کنید. + +- **سرویس‌ها (Services)** + سرویس‌ها برای مدیریت منطق و تبادل داده‌ها بین کامپوننت‌ها استفاده می‌شوند. + +- **تزریغ وابستگی (Dependency Injection)** + تزریغ وابستگی یک + Design Pattern + است که در + Angular + برای مدیریت وابستگی‌ها استفاده می‌شود. + +- **روتر (Router)** + روتر به شما امکان می‌دهد تا بین نماهای مختلف در برنامه جابه‌جا شوید. + +### پیش‌نیازها + +پیش از هر چیزی برای یادگیری انگولار شما باید با ابزار +npm +(Node Package Manager) +آشنا شوید. +این ابزار، برای مدیریت بسته‌های پروژه شماست، +شما می‌توانید از ابزار‌های دیگری همچون +yarn،pnpm +برای مدیریت بسته‌ها استفاده کنید. + +- [نصب node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs) +- [همه چیز درباره node.js](https://www.freecodecamp.org/news/what-is-npm-a-node-package-manager-tutorial-for-beginners/) +- [پکیچ منیجر های دیگر](https://romanglushach.medium.com/comparing-npm-yarn-and-pnpm-package-managers-which-one-is-right-for-your-distributed-project-to-4d7de2f0db8e) + +بعد از آشنایی با پکیج منیجرها نیاز است شما با نحوه ساخت و راه‌اندازی یک پروژه انگولار و سپس ساختار آن آشنا شوید. + +- [نصب و راه‌اندازی Angular](https://v17.angular.io/guide/setup-local) +- [ساختار پروژه](https://dev.to/tomwebwalker/angular-starting-files-explanation-for-beginners-15cp) +- [فایل angular.json](https://dev.to/tomwebwalker/angularjson-structure-for-beginners-what-we-can-set-27f3) + +# مفاهیم اساسی Angular + +## Components + +کامپوننت‌ها بلوک‌های ساختمانی اصلی برنامه‌های +Angular +هستند. هر کامپوننت شامل یک کلاس +TypeScript، +یک قالب +HTML +و یک فایل +سبک +CSS +است. کامپوننت‌ها به شما امکان می‌دهند تا بخش‌های مختلف برنامه را به صورت مجزا توسعه داده و مدیریت کنید. + +برای ساخت کامپوننت از +`@Component` +استفاده می‌کنیم. در این +decorator +مشخصه +`selector` +مشخص می‌کند که این کامپوننت با چه +تگی در HTML استفاده خواهد شد، +`template` +قالب HTML کامپوننت را تعریف می‌کند، و +`styles` +استایل‌های CSS مربوط به کامپوننت +را مشخص می‌کند. + +### مثال از یک کامپوننت ساده + +در این مثال، یک کامپوننت ساده به نام +`HelloWorldComponent` +ایجاد می‌کنیم که یک پیام +“Hello, World!” +را نمایش می‌دهد. +برای ایجاد یک کامپوننت جدید با استفاده از +Angular CLI، +دستور زیر را در ترمینال اجرا کنید: + +```sh +ng generate component hello-world +``` + +یا به صورت مختصر: + +```sh +ng g c hello-world +``` + +این دستور در هر دایرکتوری اجرا شود به صورت خودکار دایرکتوری جدید شامل فایل +HTML، CSS، TypeScript +و فایل تست تشکیل +می‌دهد. (برای نام گذاری +componentها +از قرارداد +`name.component.ts` +و برای تست از +`name.component.spec.ts` +استفاده +می‌شود) + +فایل +`hello-world.component.ts` +به این صورت خواهد بود: + +```typescript +import {Component} from '@angular/core'; + +@Component({ + selector: 'app-hello-world', + template: '

Hello, World!

', + styles: ['h1 { color: blue; }'] +}) +export class HelloWorldComponent { +} +``` + +در این مثال: + +- `selector` + مشخص می‌کند که این کامپوننت با استفاده از تگ + `` + در HTML استفاده خواهد شد. +- `template` + قالب HTML کامپوننت را تعریف می‌کند. +- `styles` + استایل‌های CSS مربوط به کامپوننت را تعریف می‌کند. + +برای استفاده از این کامپوننت در برنامه، می‌توانید تگ +`` +را به قالب +`app.component.html` +اضافه کنید: + +```html + + +``` + +حال با اجرای مجدد پروژه، کامپوننت ساخته شده نمایش داده می‌شود. + +برای مطالعه بیشتر به [مستندات رسمی](https://angular.dev/api/core/Component#viewProviders) انگولار مراجعه کنید. + +## Dependency injection + +Dependency Injection +یا تزریق وابستگی‌ها یک تکنیک است که یک شئ وابستگی‌های شئ دیگر را تامین (تزریق) می‌کند. که این +فرآیند توسط انگولار انجام می‌شود + +- [آشنایی با تزریق وابستگی در انگولار](https://www.youtube.com/watch?v=G8zXugcYd7o&list=PLX7eV3JL9sfmJ6AaZj9eDlAKrJrEul4Vz) + +## Services + +سرویس‌ها +(Services) +در انگولار یکی از اصول اصلی و مهم این فریم‌ورک هستند که برای مدیریت منطق و داده‌های اپلیکیشن استفاده +می‌شوند. سرویس‌ها به طور معمول برای انجام کارهایی مثل درخواست‌های +HTTP، +ذخیره و بازیابی داده‌ها، و به اشتراک‌گذاری +داده‌ها بین کامپوننت‌ها به کار می‌روند. این مفهوم به منظور تفکیک منطق کسب و کار از رابط کاربری +(UI) +به کار گرفته می‌شود. + +### تعریف سرویس + +برای ایجاد یک سرویس در انگولار، ابتدا باید یک کلاس ایجاد کرده و سپس این کلاس را با استفاده از دکوراتور +`@Injectable` +تزریق‌پذیر +(injectable) +کنید. به عنوان مثال، یک سرویس ساده برای مدیریت کاربران را در نظر بگیرید: + +```typescript +import {Injectable} from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class UserService { + private users = ['Alice', 'Bob', 'Charlie']; + + constructor() { + } + + getUsers() { + return this.users; + } + + addUser(user: string) { + this.users.push(user); + } +} +``` + +### استفاده از سرویس در کامپوننت + +برای استفاده از این سرویس در یک کامپوننت، باید آن را در +constructor +کامپوننت تزریق +(inject) +کنید: + +```typescript +import {Component, OnInit} from '@angular/core'; +import {UserService} from './user.service'; + +@Component({ + selector: 'app-user', + template: ` +
+
    +
  • {{ user }}
  • +
+ + +
+ `, +}) +export class UserComponent implements OnInit { + users: string[] = []; + newUser: string = ''; + + constructor(private userService: UserService) { + } + + ngOnInit() { + this.users = this.userService.getUsers(); + } + + addUser() { + this.userService.addUser(this.newUser); + this.newUser = ''; + } +} +``` + +### توضیح: + +1. **ایجاد سرویس**: یک کلاس با نام + `UserService` + ایجاد می‌شود و از دکوراتور + `@Injectable` + استفاده می‌کند تا انگولار + بفهمد این کلاس قابل تزریق است. +2. **متدهای سرویس**: این سرویس دو متد + `getUsers` + و + `addUser` + دارد که به ترتیب کاربران را بازیابی و اضافه می‌کنند. +3. **تزریق سرویس در کامپوننت**: در کلاس + `UserComponent` + سرویس + `UserService` + در + constructor + تزریق می‌شود. +4. **استفاده از سرویس**: در متد + `ngOnInit`، + متد + `getUsers` + سرویس فراخوانی می‌شود تا لیست کاربران دریافت شود. همچنین، + متد + `addUser` + برای افزودن کاربر جدید به لیست استفاده می‌شود. + +## pipe + +پایپ +(Pipe) +در +Angular +یک ویژگی است که برای تبدیل داده‌ها قبل از نمایش در قالب نهایی استفاده می‌شود. این کاربرد اصلی آن +است که اطلاعات را به یک فرمت مشخص یا به صورتی خاصی نمایش دهد، مثلا تبدیل یک تاریخ به فرمت خاص، نمایش مقادیر اعشاری به +تعداد معین اعشار، تبدیل متن به حروف بزرگ یا کوچک و غیره. + +برای استفاده از پایپ در +Angular، +ابتدا باید پایپ مورد نظر را ایجاد کنید یا از پایپ‌های تعریف شده پیش فرض استفاده کنید. +سپس آن را در قالب مورد نظرتان به صورت خاصی اعمال می‌کنید. + +**مثال:** + +اگر بخواهیم یک زمان را به فرمت داده شده تبدیل کنیم، از پایپ +`DatePipe` +استفاده می‌کنیم: + +```html +

تاریخ امروز: {{ today | date:'hh:mm:ss' }}

+``` + +در این مثال، +`today` +یک متغیر در کامپوننت +Angular +است که تاریخ فعلی را نگهداری می‌کند. +`date` +یک پایپ است که تاریخ را به +فرمت +"hh:mm:ss" +تبدیل می‌کند و نمایش می‌دهد. + +پایپ‌ها در +Angular +به طور گسترده‌ای برای فراهم کردن قابلیت‌های فرمت‌بندی و تغییر شکل داده‌ها استفاده می‌شوند و می‌توانند +به آسانی سفارشی‌سازی شوند یا از پایپ‌های پیش‌فرض +Angular +استفاده شود. + +برای مثال پایپ زیر با توجه به ژانر ورودی لیست کتاب هارا فیلتر می‌کند. +```ts +import {Pipe, PipeTransform} from '@angular/core'; +import {Book} from './book.model'; + +@Pipe({ + name: 'genreFilter', +}) +export class GenreFilterPipe implements PipeTransform { + transform(books: Book[], genre: string): Book[] { + if (!genre) { + return books; + } + return books.filter(book => book.genre === genre); + } +} +``` + +در این پایپ،‌ متد +transform +لیست کتاب ها و ژانر را به عنوان ورودی دریافت کرده و لیست فیلتر شده شامل کتاب هایی که تنها در ژانر ورودی هستند برمی‌گرداند. + +## Decorators + +پیش از آنکه به توضیح بخش‌های اصلی +Angular +بپردازیم، بهتر است با مفهوم اساسی +Decorator +که به طور گسترده از آن در تعاریف +مختلف +Angular +استفاده می‌شود، آشنا شویم. + +decorator +ها در +Angular +یک نوع خاص از توابع هستند که به شما امکان می‌دهند تا به کلاس‌ها، متدها، ویژگی‌ها یا پارامترها +متادیتا اضافه کنید و رفتار آنها را +Override +کنید. +Decorator +ها در +TypeScript +به طور گسترده‌ای برای تعریف ویژگی‌ها و +رفتارهای اجزای مختلف +Angular +استفاده می‌شوند. این توابع توسط +`@` +فراخوانی می‌شوند و ورودی‌های خود را دریافت می‌کنند و +تغییرات لازم را بر روی هدف خود اعمال می‌کنند. + +### Angular Decorators + +دیکوریتورهای اصلی Angular عبارتند از: + +- **@NgModule**: + برای تعریف ماژول‌های + Angular + استفاده می‌شود. +- **@Component**: + برای تعریف کامپوننت‌ها استفاده می‌شود. +- **@Directive**: + برای تعریف دستورالعمل‌ها استفاده می‌شود. +- **@Pipe**: + برای تعریف لوله‌ها (فیلترها) استفاده می‌شود. +- **@Injectable**: + برای تعریف سرویس‌ها استفاده می‌شود. + +هر کدام از این دیکوریتورها وظایف خاصی دارند و به شما کمک می‌کنند تا ویژگی‌های خاصی را به اجزای برنامه اضافه کنید. + +- [decorator های پر استفاده در انگولار](https://medium.com/@madhavmahesh/list-of-all-decorators-available-in-angular-71bdf4ad6976) + +## Angular Modules + +انگولار یک فریم‌ورک ماژولار است. ماژولاریتی خاصیتی است که میزان جداپذیری اجزا درون یک سیستم را اندازه‌گیری می‌کند، به +طوری که این اجزا می‌توانند به عنوان یک واحد مستقل عمل کنند و بدون وابستگی به یکدیگر کار کنند. در انگولار، ماژول یک واحد +است که کامپوننت‌ها، پایپ‌ها، دایرکتیوها و سرویس‌ها را گروه‌بندی می‌کند. یک برنامه انگولار می‌تواند شامل چندین ماژول +باشد. در هر برنامه انگولار حداقل یک ماژول وجود دارد. +NgModule +پیش‌فرض +AppModule +است و در فایل +app.module.ts +قرار دارد. +وقتی برنامه را اجرا می‌کنید، این ماژول اجرا می‌شود. شما همچنین می‌توانید عملکردها را از یک ماژول به ماژول دیگر +import +و +export +کنید. + +- [مطالعه درباره ماژول‌ها در انگولار](https://medium.com/ngconf/an-introduction-to-ngmodules-6061241e75e1) +- [نحوه استفاده از NgModule](https://youtube.com/watch?v=oqZ4-ULwfbc) + +## Templates and Data Binding + +### Interpolation + +در +Angular، +Interpolation +به معنی نشان دادن داده‌های کامپوننت در قالب کامپوننت است. این کار با استفاده از +`{{ }}` +انجام +می‌شود. + +```html +

{{ title }}

+``` + +در این مثال، +`title` +یک +property +از کامپوننت است که مقدار آن در قالب نمایش داده می‌شود. لازم به ذکر است هر تغییر در +مقدار +`title` +به طور خودکار توسط +Angular +تشخیص داده شده و در نتیجه قالب به صورت خودکار بروز می‌شود. (البته این در صورتی +است که در +Change Detection +تغییری انجام نشده باشد که در بخش‌های آینده از آن صحبت خواهیم کرد) + +### Property Binding + +در Angular، +می‌توانید +Propertyهای +کامپوننت را به عناصر قالب متصل کنید. این کار با استفاده از +`[ ]` +انجام می‌شود. + +```html + +``` + +در این مثال، `imageUrl` یک property از کامپوننت است که به ویژگی `src` عنصر `` متصل می‌شود. + +### Event Binding + +#### مفهوم Event + +در جاوااسکریپت، مفهوم "رویداد" +(Event) +به هر اتفاق یا کنشی که در مرورگر رخ می‌دهد اطلاق می‌شود. این رویدادها می‌توانند توسط کاربر (مثل کلیک کردن، فشردن کلید، +حرکت ماوس) یا توسط مرورگر (مثل بارگذاری صفحه، تغییر اندازه صفحه) رخ دهند. + +در +Angular، +می‌توانید +eventها +را در template مدیریت کنید و به متدهارا به event ها متصل کنید. این کار با استفاده از +`( )` +انجام +می‌شود. + +```html + + +``` + +در این مثال، وقتی کاربر بر روی دکمه کلیک می‌کند، متد +`handleClick()` +کامپوننت فراخوانی می‌شود. + +### Two Way Binding + +[Two Way Binding](https://angular.dev/guide/templates/two-way-binding) +به منظور اشتراک داده بین کامپوننت‌های انگولاری استفاده می‌شود، به صورتی که تغییر مقدار داده‌ها به صورت همزمان هم در +کامپوننت پدر و هم فرزند انجام می‌شود. + +- [Demystifying Angular Two Way Binding](https://www.youtube.com/watch?v=vkmwbZV-ob8) + +### angular routing + +‌ابزار قدرتمند انگولار برای جابه‌جایی بین صفحات مختلف استفاده می‌شود. + +- [مستندات روتینگ انگولار](https://angular.dev/guide/routing/common-router-tasks) + +## تثبیت دانش + +برای تثبیت مطالبی که تا اینجا آموختید ، پیشنهاد می‌شود که پروژه ` Book Collection Manager ` را انجام دهد. + +این پروژه شامل مدیریت یک مجموعه کتاب شخصی است که کاربران می‌توانند کتاب‌های خود را اضافه، مشاهده، ویرایش و حذف کنند. هر +کتاب دارای عنوان، نویسنده، تاریخ انتشار و ژانر است. در این پروژه، از مفاهیم و تکنولوژی‌های Angular از جمله کامپوننت‌ها، +سرویس‌ها و پایپ‌ها استفاده خواهد شد. + +این پروژه به شما این امکان را می‌دهد تا تجربه عملی کسب کنید در: + +ایجاد و مدیریت کامپوننت‌ها و ارتباط آنها با یکدیگر. +استفاده از سرویس‌ها برای مدیریت داده‌ها و انجام عملیات CRUD (ایجاد، خواندن، به روزرسانی، حذف). +اعمال پایپ‌ها برای فرمت‌بندی و فیلتر کردن داده‌ها. +این پروژه می‌تواند فرصتی عالی باشد تا مهارت‌های یادگرفته شده را در یک محیط عملی تثبیت کنید و آمادگی خود را برای +پروژه‌های واقعی و بزرگ‌تر افزایش دهید. \ No newline at end of file diff --git a/docs/frontend/phase01-sandbox.md b/docs/frontend/phase01-sandbox.md deleted file mode 100644 index 91f55dc8..00000000 --- a/docs/frontend/phase01-sandbox.md +++ /dev/null @@ -1,446 +0,0 @@ ---- -title: Sandbox -description: When I was a kid, my mom used to just throw me into a pile of broken glass! -tags: [Sandbox] ---- - -:::info این فاز، یکی از فازهای `Sandbox` است. - -به فازهایی `Sandbox` می‌گوییم که به طور مستقیم به پروژه مربوط نمی‌شوند -و در کارگاهی که برای آن‌ها برگزار می‌شود، مدرس در یک محیط ایزوله به تدریس می‌پردازد. -البته این به آن معنا نیست که در این فازها نکات کم‌اهمیتی گفته می‌شود؛ -بلکه در آن‌ها نکات مهمی تعبیه شده که در فازهای دیگر قابل بیان نبودند. - -::: - -## مقدمه - -در این فاز قصد داریم قبل از شروع پروژه با برخی نکات ساده اما مهم آشنا شویم -که در ادامۀ کار به کمک ما خواهند آمد. - -- چرا برای تعریف متغیر می‌توان از سه عبارت `var` و `let` و `const` استفاده کرد؟ -- تفاوت Function با Arrow Function چیست؟ -- مفهوم و کاربرد `this` چیست؟ -- صفت `type` در تگ `script` چیست؟ -- چطور می‌توان از کدی که دیگران نوشته‌اند استفاده کرد؟ -- برای افزایش خوانایی کد چه کارهایی می‌توان انجام داد؟ - ---- - -## یادگیری - -### متغیرها - -قبل از سال 2015 میلادی، برای تعریف متغیر در JavaScript تنها می‌توانستیم از `var` استفاده کنیم. -اما با معرفی ES6 عبارت‌های `let` و `const` نیز به این زبان اضافه شدند که در اینجا توضیحات مختصری در مورد هر کدام ارائه می‌کنیم. - -#### var - -زمانی که یک متغیر را با عبارت `var` تعریف می‌کنید، -آن متغیر در Global Scope یا نزدیک‌ترین Function Scope تعریف می‌شود. - -به عنون مثال خروجی کد زیر: - -```javascript -function defineAndPrintName() { - if (true) { - var name = 'Bijan'; - console.log(`inner scope -> name: ${name}`); - } - - console.log(`outer scope -> name: ${name}`); -} - -defineAndPrintName(); -``` - -به شکل زیر خواهد بود: - -```text -inner scope -> name: Bijan -outer scope -> name: Bijan -``` - -چرا که متغیر `name` داخل اسکوپِ تابعِ `defineAndPrintName` قرار می‌گیرد. - -لازم به ذکر است که Scopeها در JavaScript با آکلاد مشخص می‌شوند -بنابراین نیازی به `if (true)` نداریم. - -#### let - -برخلاف `var`، زمانی که از `let` برای تعریف یک متغیر استفاده کنیم، -آن متغیر در Scope فعلی محدود می‌شود. - -به‌عنوان مثال خروجی کد زیر: - -```javascript -function defineAndPrintName() { - { - let name = 'Bijan'; - console.log(`inner scope -> name: ${name}`); - } - - console.log(`outer scope -> name: ${name}`); -} - -defineAndPrintName(); -``` - -به شکل زیر خواهد بود: - -```text -inner scope -> name: Bijan -ReferenceError: name is not defined -``` - -#### const - -`const` -دقیقاً مانند `let` عمل می‌کند با این تفاوت که فقط یک بار می‌توان آن را مقداردهی کرد. -زمانی که احتیاج داشته باشیم مقداری را ذخیره کنیم که هیچ‌وقت نباید تغییر کند، -استفاده از `const` باعث جلوگیری از خطاهای احتمالی می‌شود؛ -همچنین زمانی که شخص دیگری کد را می‌خواند، -با دیدن `const` مطمئن می‌شود که مقدار آن تغییر نخواهد کرد. -ما پیشنهاد می‌کنیم همیشه به صورت پیش‌فرض برای تعریف متغیرها از `const` استفاده کنید -و تنها در صورت نیاز به `let` مراجعه کنید. - -برای آشنایی بیشتر با این مفاهیم می‌توانید از لینک‌های زیر استفاده کنید: - -- [var vs let vs const in JavaScript](https://ui.dev/var-let-const/) -- [Medium - Difference Between Var, Let and Const in ES6](https://medium.com/infancyit/difference-between-var-let-and-const-in-es6-16a08d74b8b2) -- [freeCodeCamp - Var, Let, and Const – What's the Difference?](https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/) - ---- - -### Regular Function vs Arrow Function - -در JavaScript به دو شکل می‌توان یک تابع را تعریف کرد: - -```javascript -function sayHello(name) { - console.log(`hello, ${name}!`); -} - -// or - -const sayHello = (name) => { - console.log(`hello, ${name}!`); -}; -``` - -که به نوع اول Regular Function و به نوع دوم Arrow Function گفته می‌شود. -در اینجا به تفاوت این دو روش می‌پردازدیم. - -#### this - -زمانی که از Regular Function استفاده می‌کنیم مقدار `this` با توجه به مکانی که تابع از آنجا صدا زده می‌شود، متفاوت است. -اما اگر از Arrow Function استفاده کنیم، این مقدار همواره برابر با شیئی است که تابع در آن تعریف شده. - -```javascript -const regularFunctionWrapper = { - whatIsThis: function () { - console.log(this); // regularFunctionWrapper - }, -}; - -const arrowFunctionWrapper = { - whatIsThis: () => { - console.log(this); // globalThis - }, -}; - -regularFunctionWrapper.whatIsThis(); -arrowFunctionWrapper.whatIsThis(); -``` - -#### Constructor - -قبل از اینکه کلاس‌ها به JavaScript بیایند، از Regular Function به‌عنوان Constructor استفاده می‌شد: - -```javascript -function Circle(radius) { - this.radius = radius; - - this.printArea = function () { - console.log('area', Math.PI * Math.pow(this.radius, 2)); - }; -} - -const small = new Circle(10); -const large = new Circle(100); - -small.printArea(); -large.printArea(); -``` - -#### arguments & args - -در Regular Function یک کلیدواژه به نام arguments وجود دارد که درواقع آرایه‌ای از پارامترهای ورودی می‌باشد؛ -در Arrow Function هم می‌توانیم به این پارامترها دسترسی داشته باشیم اما باید صراحتاً در ورودی‌های تابع به آن اشاره کنیم: - -```javascript -function regularFunctionSum() { - let result = 0; - - for (const n of arguments) { - if (!isNaN(n)) result += n; - } - - return result; -} - -const arrowFunctionSum = (...args) => { - let result = 0; - - for (const n of args) { - if (!isNaN(n)) result += n; - } - - return result; -}; - -console.log('Regular Function', regularFunctionSum(4, 8, 15, 16, 23, 42)); // 108 -console.log('Arrow Function', arrowFunctionSum(4, 8, 15, 16, 23, 42)); // 108 -``` - -#### return - -در Arrow Function اگر بدنۀ تابع فقط شامل یک Expression باشد، می‌توان آن را بدونِ استفاده از آکلاد و return نوشت: - -```javascript -const rand = (min, max) => Math.floor(Math.random() * (max - min) + min); - -console.log(rand(4, 42)); -``` - -برای آشنایی بیشتر با این مفاهیم می‌توانید از لینک‌های زیر استفاده کنید: - -- [5 Differences Between Arrow and Regular Functions](https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/) -- [freeCodeCamp - When (and why) you should use ES6 arrow functions — and when you shouldn’t](https://www.freecodecamp.org/news/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26/) - ---- - -### Modules - -#### type - -یکی از صفاتی که می‌توان به تگ `script` اضافه کرد، `type` است؛ -این صفت همان‌طور که از اسمش پیداست، مشخص می‌کند که مرورگر چگونه با کد شما برخورد کند. -مقادیر متنوعی را می‌توان برای `type` در نظر گرفت اما در اینجا فقط به `module` اشاره می‌کنیم. - -```html - -``` - -#### مزایا - -یکی از بزرگ‌ترین مزایای استفاده از `module` این است که می‌توانید کد خود را به چند فایل تقسیم کنید -و هر فایل را برای کار خاصی در نظر بگیرید. -به‌عنوان مثال فرض کنید بخواهیم دو کلاس با نام‌های `Circle` و `Square` داشته باشیم، -اشیائی با آن‌ها بسازیم و در نهایت محیط و مساحت هر کدام را محاسبه کنیم؛ -از سه راه می‌توانیم به هدف خود برسیم: - -1. قرار دادن تمام کدها در یک فایل -1. قرار دادن کد هر قسمت در یک فایل جدا و استفاده از سه تگ `script` در HTML -1. قرار دادن کد هر قسمت در یک فایل جدا و استفاده از `module` - -واضح است که روش اول خوانایی کد را به‌شدت پایین می‌آورد -و اگر در آینده بخواهیم توسعه‌ای انجام دهیم، باید در میان حجم انبوهی از کدها به دنبال قسمت مورد نظر بگردیم. - -روش دوم بهتر است اما مشکلی که وجود دارد این است که -همیشه باید به ترتیبِ کدها توجه کنیم. -به‌عنوان مثال اگر بخواهیم از کد `Square` داخل `main` استفاده کنیم، -باید حتماً تگ مربوط به `Square`، قبل از تگ مربوط به `main` باشد. - -اما روش سوم هیچ‌کدام از معایب دو روش دیگر را ندارد. -به راحتی می‌توان هر زمان که به یک کد احتیاج داشتیم، آن را `import` کنیم -و فقط یک تگ `script` در HTML قرار می‌دهیم. - -برای روشن‌تر شدن موضوع، در ادامه کد روش سوم را می‌بینیم: - -```html title="index.html" - -``` - -```javascript title="main.js" -import {Circle} from './circle.js'; -import {Square} from './square.js'; - -const main = () => { - const circle = new Circle(10); - const square = new Square(10); - - console.log(circle.toString()); - console.log(square.toString()); -}; - -main(); -``` - -```javascript title="circle.js" -class Circle { - #radius; - - constructor(radius) { - this.#radius = Number.parseInt(radius) || 0; - } - - calculatePerimeter() { - return 2 * Math.PI * this.#radius; - } - - calculateArea() { - return Math.PI * this.#radius * this.#radius; - } - - toString() { - return `(Circle) perimeter: ${this.calculatePerimeter()}; area: ${this.calculateArea()}`; - } -} - -export {Circle}; -``` - -```javascript title="square.js" -class Square { - #side; - - constructor(side) { - this.#side = Number.parseInt(side) || 0; - } - - calculatePerimeter() { - return 4 * this.#side; - } - - calculateArea() { - return this.#side * this.#side; - } - - toString() { - return `(Square) perimeter: ${this.calculatePerimeter()}; area: ${this.calculateArea()}`; - } -} - -export {Square}; -``` - -#### import & export - -همان‌طور که در کد قسمت قبل مشاهده کردید، -برای آنکه بتوانیم به یک موجودیت (متغیر، تابع، کلاس و ...) در قسمت‌های دیگر پروژه دسترسی داشته باشیم، -باید از کلیدواژه‌های `import` و `export` استفاده کنیم. - -در قسمت قبل، یک Object را `export` کردیم که تنها شامل یک عنصر با کلید `Circle` یا `Square` بود؛ -بنابراین زمانی که بخواهیم فایل را `import` کنیم، دقیقاً همان Object را به همان شکل در دسترس خواهیم داشت. -همچنین این امکان را داریم که یک موجودیت را به‌عنوان شیء پیش‌فرض `export` کنیم -یا اسامی اشیاء را هنگام `import` عوض کنیم. - -برای آشنایی بیشتر با این مفاهیم می‌توانید از لینک‌های زیر استفاده کنید: - -- [MDN - export](https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export/) -- [MDN - import](https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/import/) - ---- - -### Node.js & npm - -با استفاده از `import` می‌توانید کتابخانه‌هایی را که دیگران توسعه داده‌اند، به کد خود اضافه کنید. -برای این کار مرسوم‌ترین روش استفاده از یک Package Manager است که معروف‌ترینِ آن‌ها npm می‌باشد. - -#### Setup - -برای استفاده از npm باید ابتدا با مراجعه به -[این لینک](https://nodejs.org/)، -Node.js را نصب کنید. - -Node.js -یک Runtime Environment است که به ما این امکان را می‌دهد که بتوانیم کد JavaScript را بدونِ نیاز به مرورگر اجرا کنیم. -از Node.js معمولاً برای برنامه‌نویسی سمت سرور استفاده می‌شود که ما در این دوره به آن نمی‌پردازیم -و صرفاً از npm استفاده خواهیم کرد. - -#### Package Installation - -برای پیداکردن پکیج‌های مختلف می‌توانید به -[سایت npm](https://www.npmjs.com/) -مراجعه کنید. - -برای نصب پکیج‌ها، کافی است دستوری مشابه دستور زیر را در ترمینال بنویسید: - -```shell -npm i package-name -``` - -همچنین در صورتی که پکیج مورد نظر صرفاً توسط توسعه‌دهندگان مورد استفاده قرار می‌گیرد -و برای خروجی گرفتن از پروژه احتیاجی به آن نیست، -می‌توانید از پارامتر `D` هنگام نصب استفاده کنید: - -```shell -npm i -D package-name -``` - -با این کار، زمانی که بخواهید پروژه را بر روی Production ببرید، -پکیج‌های غیرضروری نصب نخواهند شد و فرآیند Deploy سریع‌تر انجام می‌شود. - -#### Prettier - -یکی از پکیج‌های بسیار محبوب Prettier است. -Prettier -به شما کمک می‌کند تا قواعدی را برای فرمت‌کردن کد تعریف کنید. -باید دقت داشته باشید که Prettier یک فرمترِ Opinionated است؛ -به این معنا که توسعه‌دهندگان آن، با توجه به Conventionهای موجود و سلیقۀ خود، قواعد را تنظیم کرده‌اند؛ -با این حال می‌توانید برخی از این قواعد را تغییر دهید. - -برای تغییر قواعد کافی است یک فایل با نام `prettierrc.` را به پروژه اضافه کنید. -ما پیشنهاد می‌کنیم از تنظیمات زیر برای پروژه‌های خود استفاده کنید: - -```json -{ - "printWidth": 120, - "tabWidth": 4, - "semi": true, - "singleQuote": true, - "trailingComma": "es5", - "bracketSpacing": false, - "arrowParens": "always", - "endOfLine": "auto", - "overrides": [ - { - "files": ["*.css", "*.scss"], - "options": { - "singleQuote": false - } - } - ] -} -``` - -همچنین اگر نمی‌خواهید Prettier در برخی از فایل‌ها تغییر ایجاد کند، -می‌توانید یک فایل با نام `prettierignore.` به پروژه اضافه کنید. -این فایل دقیقاً مشابه با `gitignore.` است و ما پیشنهاد می‌کنیم محتوای `gitignore.` را داخل این فایل نیز اضافه کنید. - -برای آشنایی بیشتر با Prettier می‌توانید از لینک زیر استفاده کنید: - -- [Prettier Docs](https://prettier.io/docs/en/index.html) - -#### ESLint - -Prettier -تنها ظاهر کدهای شما را زیبا می‌کند؛ -اما اکثر اوقات، مخصوصاً زمانی که به صورت تیمی بر روی یک پروژه کار می‌کنید، -احتیاج دارید قواعدی برای تمیزی کد وضع کنید؛ -ESLint -یک پکیج استاندارد است که به شما این امکان را می‌دهد. - -برای وضع قوانین کافی است یک فایل با نام `eslintrc.` را به پروژه اضافه کنید. -ما پیشنهاد می‌کنیم از قواعد پیش‌فرض ESLint استفاده کنید: - -```json -{ - "extends": "eslint:recommended" -} -``` - -برای آشنایی بیشتر با این قواعد می‌توانید از لینک زیر استفاده کنید: - -- [ESLint Rules](https://eslint.org/docs/latest/rules/) diff --git a/docs/frontend/phase02-pilot.md b/docs/frontend/phase02-pilot.md deleted file mode 100644 index a8800ca5..00000000 --- a/docs/frontend/phase02-pilot.md +++ /dev/null @@ -1,470 +0,0 @@ ---- -title: Pilot -description: The One Where it All Began ---- - -## مقدمه - -در این فاز برای شروع پروژه، Angular را معرفی می‌کنیم، -به برخی نکات مهم در HTML می‌پردازیم -و در نهایت چند منبع برای یادگیری flexbox و grid معرفی می‌کنیم. - -- تفاوت کتابخانه و فریمورک چیست؟ -- چرا به سراغ Angular می‌رویم؟ -- چگونه با Angular یک پروژه بسازیم؟ -- چرا از تگ‌های معنایی استفاده می‌کنیم؟ -- در استفاده از عکس‌ها چه نکاتی را باید رعایت کنیم؟ - ---- - -## یادگیری - -### Angular - -#### تفاوت کتابخانه و فریمورک - -کتابخانه مجموعه‌ای از ابزارها را در اختیار ما قرار می‌دهد -تا بتوانیم پروژه را راحت‌تر توسعه دهیم. -معروف‌ترین کتابخانه‌ای که در فرانت‌اند وجود دارد، React است. -React -شامل پکیج‌های زیادی است که تعدادی از آن‌ها توسط Facebook توسعه داده می‌شوند -و باقی آن‌ها توسط اشخاص حقیقی و حقوقی دیگر. - -اما در مقابل، Framework یا چارچوب، همان‌طور که از اسمش پیداست، -علاوه بر ابزارهای مورد نیاز، شامل قواعد و دستورالعمل‌هایی برای کدنویسی است. -این قواعد از بدیهی‌ترین مسائل مانند زبان مورد استفاده تا پیچیده‌ترین مسائل مانند Performance را شامل می‌شود. -بزرگ‌ترین فریمورکی که در فرانت‌اند وجود دارد، Angular است. -Angular -توسط شرکت Google توسعه داده می‌شود. -در ابتدا AngularJS نام داشت اما بعد از تغییرات اساسی و اضافه‌شدن Typescript، -از نسخه 2 به بعد، به Angular تغییر نام داد. -در زمان نوشتن این مطلب، جدیدترین نسخه آن، Angular 14 است -و به طور منظم هر 6 ماه یک بار، نسخۀ جدید آن منتشر می‌شود. - -خوشبختانه کدهای بنیادین React و Angular و همچنین اکثر کتابخانه‌ها و فریمورک‌های JavaScript، -به صورت Open-Source در اختیار عموم قرار دارند. - -#### چرا Angular؟ - -برای سایت‌های کوچک مانند فروشگاه‌های آنلاین، تماشای فیلم و سریال، اشتراک‌گذاری آهنگ و پروژه‌های دانشجویی، -قطعاً نیازی به Angular حس نمی‌شود. -این پروژه‌ها، همان‌طور که مرسوم است، اکثراً با کتابخانه‌هایی مانند React توسعه داده می‌شوند -و بدونِ آنکه توسعه‌دهنده کمبودی احساس کند، به نتیجۀ دلخواه خود می‌رسد. - -اما زمانی که در مورد یک پروژه صنعتی بسیار بزرگ صحبت می‌کنیم، -مخصوصاً اگر ده‌ها بلکه صدها توسعه‌دهنده مشغول کار بر روی آن باشند، -قطعاً به یک چارچوب، مجموعه‌ای از قواعد و دستورالعمل‌ها، احتیاج پیدا خواهیم کرد. - -این چارچوب می‌تواند توسط تیم فنی ایجاد شود و همراه با React یا به طور کلی هر کتابخانه‌ای مورد استفاده قرار گیرد؛ -ولی قطعاً Overhead زیادی خواهد داشت و ممکن است به اندازۀ یک فریمورک، محکم و قابل اطمینان نباشد. -استفاده از فریمورکی مانند Angular که بارها و بارها توسط هزاران توسعه‌دهنده مورد ارزیابی قرار گرفته، -باگ‌های احتمالی آن کشف و ثبت شده، -درخواست‌ها و فیچرهای جدید در آن پیاده‌سازی شده، -قطعاً بار سنگینی را از دوش توسعه‌دهنده برمی‌دارد و هزینه‌های غیرضروری تیم را کاهش می‌دهد. - -#### نصب و راه‌اندازی - -Angular -یک Command-line Interface یا CLI دارد که با استفاده از آن می‌توانید پروژۀ خود را مدیریت کنید؛ -بنابراین قبل از هر کاری، ابتدا باید با دستور زیر ان را نصب کنیم: - -```shell -npm i -g @angular/cli@12.2.17 -``` - -با استفاده از پارامتر `g` مشخص می‌کنیم که می‌خواهیم CLI در اسکوپِ Global نصب شود؛ -بنابراین در هرکجا از سیستم می‌توانیم از آن استفاده کنیم. - -همان‌طور که در کد بالا می‌بینید، -ما از نسخه 12.2.17 استفاده می‌کنیم و پیشنهاد می‌کنیم شما هم از همین نسخه استفاده کنید تا در روند آموزش مشکلی پیش نیاید. - -از این پس می‌توانید با استفاده از دستور `ng`، از CLI استفاده کنید. - -#### ساخت پروژه جدید - -با استفاده از دستور زیر می‌توانید یک پروژه جدید ایجاد کنید: - -```shell -ng new my-project-name -``` - -سعی کنید اسمی خلاقانه و همچنین مناسب برای پروژه انتخاب کنید که بیانگر کاربرد آن باشد. -همچنین دقت داشته باشید که اسم انتخابی شما باید حتماً kebab-case باشد. - -#### ESLint & Prettier - -در فاز قبل ESLint را معرفی کردیم؛ -حال می‌خواهیم آن را به پروژه‌ای که ساختیم اضافه کنیم. -برای این کار ابتدا باید پکیج مخصوص Angular را نصب کنیم: - -```shell -ng add @angular-eslint/schematics -``` - -همان‌طور که می‌بینید به جای استفاده از `npm i`، از `ng add` برای نصب پکیج استفاده کردیم. -این قابلیت در بعضی از پکیج‌ها وجود دارد و در صورتی که به این شکل آن‌ها را به پروژه اضافه کنیم، -خودِ Angular ورژن مناسب را پیدا و نصب می‌کند؛ -همچنین در صورتی که احتیاج باشد، علاوه بر نصب پکیج، فایل‌های مربوطه را نیز تغییر می‌دهد. - -حال به نصب Prettier می‌پردازیم: - -```shell -npm i -D prettier eslint-config-prettier eslint-plugin-prettier -``` - -با اجرای دستور بالا، علاوه بر Prettier، تنظیمات مربوط به ESLint هم دانلود می‌شوند و می‌توانیم از آن‌ها در پروژه استفاده کنیم. -علت این کار آن است که تنظیمات ESLint و Prettier باهم تداخل نداشته باشند. - -در ادامه محتوای پیشنهادی فایل‌های تنظیمات مربوط به ESLint و Prettier را می‌بینیم: - -```json title=".eslintrc" -{ - "root": true, - "ignorePatterns": ["projects/**/*"], - "overrides": [ - { - "files": ["*.ts"], - "parserOptions": { - "project": ["tsconfig.json"], - "createDefaultProgram": true - }, - "extends": [ - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates", - "prettier" - ], - "plugins": ["prettier"], - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "app", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": ["app", "icon", "illustration"], - "style": "kebab-case" - } - ], - "@typescript-eslint/explicit-member-accessibility": ["error"], - "@typescript-eslint/explicit-function-return-type": ["error"], - "prettier/prettier": ["error", {"endOfLine": "auto"}] - } - }, - { - "files": ["*.html"], - "extends": ["plugin:@angular-eslint/template/recommended", "prettier"], - "plugins": ["prettier"], - "rules": {"prettier/prettier": ["error", {"endOfLine": "auto"}]} - } - ] -} -``` - -```json title=".prettierrc" -{ - "printWidth": 120, - "tabWidth": 4, - "semi": true, - "singleQuote": true, - "trailingComma": "es5", - "bracketSpacing": false, - "arrowParens": "always", - "endOfLine": "auto", - "overrides": [ - { - "files": ["*.html"], - "options": { - "parser": "html" - } - }, - { - "files": ["*.component.html"], - "options": { - "parser": "angular" - } - }, - { - "files": ["*.css", "*.scss"], - "options": { - "singleQuote": false - } - } - ] -} -``` - -فراموش نکنید محتویات فایل -`gitignore.` -را به فایل -`prettierignore.` -هم اضافه کنید تا از تغییر فایل‌های ناخواسته جلوگیری شود. - -زمانی که یک پروژۀ جدید انگولاری می‌سازید، به صورت خودکار یک فایل با نام -`editorconfig.` -در پوشۀ اصلی پروژه قرار می‌گیرد؛ -کارکرد این فایل مانند ESLint یا Prettier است و می‌توانید قوانینی وضع کنید که تمام اعضای گروه از آن‌ها پیروی کنند. -از آنجایی که ما از ESLint و Prettier استفاده می‌کنیم، دیگر نیازی به این فایل نیست -و برای جلوگیری از تداخل احتمالی باید آن را پاک کنید. - -شما می‌توانید با استفاده از دستور زیر، ایراداتی که ESLint به کدهای شما وارد می‌کند را ببینید: - -```shell -ng lint -``` - -همچنین با استفاده از این دستور می‌توانید به ESLint بگویید که به طور خودکار و هوشمند سعی کند ایرادات را برطرف نماید: - -```shell -ng lint --fix -``` - -#### مطالعه بیشتر - -همان‌طور که احتمالاً حدس می‌زنید، Angular حاوی مباحث بسیار زیادی است که توضیح تک‌تک آن‌ها در قالب آموزش متنی بسیار دشوار است؛ -بنابراین این مباحث در قالب کارگاه ارائه خواهد شد؛ -اما در صورتی که تمایل دارید به منابع بیشتری دسترسی داشته باشید، می‌توانید از لینک‌های زیر استفاده کنید: - -- [Angular Docs](https://angular.io/docs/) -- [Traversy Media - Angular Crash Course](https://www.youtube.com/watch?v=3dHNOWTI7H8) - ---- - -### HTML - -#### تگ‌های معنایی - -در HTML تگ‌هایی وجود دارند که صرفاً برای یک کار خاص طراحی شده‌اند و با دیدن نام آن‌ها می‌توان کاربردشان را متوجه شد. به -این تگ‌ها، **تگ‌های معنایی** گفته می‌شود که لیستی از آن‌ها را به همراه توضیحات مختصری در اینجا مشاهده می‌کنید. - -توصیه می‌کنیم همزمان با خواندن این مطلب، -[صفحۀ دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html) -را نیز مشاهده کنید تا به صورت دیداری و کاربردی با مفاهیم آشنا شوید. - -##### header - -معمولاً در بالاترین بخش صفحه یا المان مورد نظر قرار می‌گیرد و در اکثر مواقع شامل لوگو، `nav` و دکمه‌های -Call-to-Action می‌باشد. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#header) - -##### nav - -شامل لینک‌هایی به قسمت‌های مختلف صفحۀ اصلی یا سایت می‌باشد. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#nav) - -##### main - -شامل محتوای اصلی سایت می‌باشد و در اکثر مواقع بیشترین حجم از صفحه را اشغال می‌کند. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#main) - -##### aside - -شامل محتوایی غیر از محتوای اصلی می‌باشد به طوری که نمی‌توان آن را در `main` قرار داد. به‌عنوان مثال تبلیغات یا لینک -به قسمت‌های مختلف مقاله. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#aside) - -##### footer - -معمولاً در پایین‌ترین بخش صفحه یا المان مورد نظر قرار می‌گیرد و در اکثر مواقع شامل Copyright، توضیحات مختصری در -مورد سایت و شخص یا گروه سازنده می‌باشد. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#footer) - -##### article - -بخشی از محتواست که کاملاً از بخش‌های دیگر مستقل می‌باشد به گونه‌ای که می‌توان آن را به طور جداگانه استفاده یا -منتشر کرد. به‌عنوان مثال می‌توان به مقاله‌ای از یک مجله یا پستی از یک وبلاگ اشاره کرد. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#article) - -##### section - -بخشی از محتوای اصلی سایت را مشخص می‌کند. معمولاً از این تگ برای ایجاد تمایز بینِ قسمت‌های مختلف استفاده می‌شود. -معمولاً در ابتدای هر بخش از `heading` یعنی تگ‌های `h1` تا `h6` استفاده می‌شود. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#results) - -##### details - -شامل بخشی از محتواست که کاربر می‌تواند در صورت نیاز آن را نمایان یا پنهان کند. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#details) - -##### summary - -همیشه داخل المان `details` استفاده می‌شود و باید شامل توضیحاتی دربارۀ آن باشد. - -[مشاهده در صفحه دمو](https://star-academy.github.io/frontend-demos/pages/semantic-tags/index.html#summary) - -البته موارد بالا تنها بخشی از تگ‌های معنایی HTML می‌باشند. برای آشنایی بیشتر با این مفهوم می‌توانید از لینک‌های زیر -استفاده کنید: - -- [MDN - HTML Elements Reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Element) -- [W3Schools - HTML Semantic Elements](https://www.w3schools.com/html/html5_semantic_elements.asp) -- [HTML.com - What On Earth Is Semantic Markup?](https://html.com/semantic-markup/) -- [A Friendly Tutorial For Developing Meaningful Web Pages](https://internetingishard.netlify.app/html-and-css/semantic-html/index.html) -- [freeCodeCamp - Semantic HTML5 Elements Explained](https://www.freecodecamp.org/news/semantic-html5-elements/) - ---- - -#### Text Formatting Tags - -بعضی از تگ‌ها مانند `b` و `i` برای تغییر ظاهر بخشی از متن استفاده می‌شوند که لیست آن‌ها را در اینجا ذکر می‌کنیم: - -##### b & strong - -عبارت مورد نظر را به صورت Bold یا پُررنگ نمایش می‌دهند. - -##### i & em - -عبارت مورد نظر را به صورت Italic یا کج نمایش می‌دهند. - -##### mark - -برای Highlight کردن بخشی از نوشته، استفاده می‌شود. - -##### small - -عبارت مورد نظر را با اندازۀ کوچکتری نسبت به اندازۀ اصلی نمایش می‌دهد. - -##### del - -برای نوشته‌های حذف‌شده استفاده می‌شود به طوری که معمولاً آن‌ها را به صورت خط‌خورده نمایش می‌دهد. - -##### ins - -برای نوشته‌های اضافه‌شده استفاده می‌شود به طوری که معمولاً آن‌ها را با Underline نمایش می‌دهد. - -##### sub - -معمولاً برای نمایش اندیس‌ها در پایینِ عبارت، استفاده می‌شود. - -##### sup - -معمولاً برای نمایش شماره‌های پاورقی در بالای عبارت، استفاده می‌شود. - -اما تمامِ این styleها را با استفاده از CSS نیز می‌توانیم داشته باشیم؛ پس علت وجود این تگ‌ها چیست؟ چرا برای بعضی از -استایل‌ها مانند Bold، دو تگ متفاوت داریم؟ - -کاربرد اصلی این تگ‌ها برای استفادۀ سریع هنگام نوشتن محتوای سایت است. به‌عنوان مثال هر وقت خواستیم یک کلمه را Bold کنیم -به جای اینکه از `span` در HTML و یک کلاس در CSS، می‌توانیم از `b` یا `strong` استفاده کنیم، بدونِ آنکه نیاز باشد -تغییری در کد CSS دهیم. - -از طرفی در صورت نیاز می‌توانید ظاهر این تگ‌ها را مانند هر تگ دیگری تغییر دهید؛ -یعنی مثلاً به جای اینکه یک کلاس به اسم `bold` درست کنید -و هر بار مجبور باشید در HTML از آن استفاده کنید، می‌توانید صرفاً تگ `b` را استعمال کنید و در CSS فرمت دلخواه را -اعمال کنید. - -تگ‌های `b` و `strong` در ظاهر تفاوتی باهم ندارند. اما زمانی که شما از `strong` استفاده کنید، علاوه بر اینکه عبارت مورد نظر به -شکل Bold نمایش داده می‌شود، اگر کاربر از Screen Reader استفاده کند، نرم‌افزار به این موضوع اشاره خواهد کرد. به طور کلی -زمانی که صرفاً بخواهید ظاهر کلمه پُررنگ باشد از `b` و زمانی که بخواهید مفهوم کلمه پُررنگ باشد از `strong` استفاده کنید. -همچنین در مورد تگ‌های `i` و `em`، اگر از `em` استفاده کنید، نرم‌افزار آن عبارت را با استرس بیشتری می‌خواند. - -برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید: - -- [W3Schools - HTML Text Formatting](https://www.w3schools.com/html/html_formatting.asp) - ---- - -### عکس‌ها - -#### alt - -حتما با `alt` در تگ `img` آشنا هستید. حتی شاید زمانی که از آن استفاده نکردید، متوجه هشدار IDE شده باشید. -اما کاربرد این Attribute چیست؟ -زمانی که از عکس استفاده می‌کنیم چرا باید توضیحی برای آن بنویسیم؟ مقدار این Attribute به کاربر نشان داده -نمی‌شود، پس نوشتن آن چه فایده‌ای دارد؟ - -`alt` -در اینجا مخفف عبارت Alternate Text یا متن جایگزین می‌باشد که دو کاربرد مهم برای آن می‌توان در نظر گرفت: - -1. همانطور که از اسم آن مشخص است، جایگزینی برای عکس می‌باشد به طوری که اگر به هر دلیلی امکان نمایش عکس وجود نداشت، - این نوشته به کاربر نشان داده می‌شود تا موضوع عکس را بفهمد. - -2. Screen Readerها متن مورد نظر را می‌خوانند بنابراین کاربرانی که نمی‌توانند عکس را ببینند، متوجهِ موضوع عکس می‌شوند. - -بنابراین استفاده از alt برای عکس‌ها بسیار حائز اهمیت است. اما در موارد زیر بهتر است یک متن خالی را برای آن در نظر -بگیریم: - -- عکس مورد نظر صرفاً برای زیبایی ظاهری و دکوری باشد، به طوری که مفهوم خاصی به محتوا اضافه نکند. -- عکس مورد نظر Caption داشته باشد. - -دقت کنید که در موارد بالا حتماً باید تگ `alt` را استفاده کنید، اما متنی داخل آن ننویسید؛ به‌عنوان مثال: - -```html - -``` - -علت این موضوع این است که اگر `alt` وجود نداشته باشد، Screen Reader نام فایل عکس را به‌عنوان توضیحات آن می‌خواند؛ -اما اگر متن خالی داخل `alt` باشد، عکس به کلی در نظر گرفته نمی‌شود. - -برای آشنایی بیشتر با این مفهوم می‌توانید از لینک زیر استفاده کنید: - -- [Accessibility: Image Alt text best practices](https://support.siteimprove.com/hc/en-gb/articles/115000013031-Accessibility-Image-Alt-text-best-practices) - -#### Performance - -ما تقریباً در تمام سایت‌ها از عکس استفاده می‌کنیم؛ بنابراین همیشه باید به مبحث Performance توجه داشته باشیم، چرا که در -غیر این صورت تجربۀ بدی در انتظار کاربران ما خواهد بود. - -یکی از بهترین راه‌ها برای افزایش Performance، استفاده از عکس‌های باکیفیت و در عینِ حال کم‌حجم است. برای این موضوع ما -سایت -[Squoosh](https://squoosh.app/) -را که توسط توسعه‌دهندگان Google ساخته شده، به شما پیشنهاد می‌کنیم. استفاده از آن بسیار آسان است، صرفاً کافی است عکس خود -را آپلود و عکس کم‌حجم شده را دریافت کنید. همچنین این سایت قابلیت تبدیل به انواع فرمت‌ها و استفاده از الگوریتم‌های -گوناگون را دارد. - -در صورت امکان پیشنهاد می‌کنیم حتماً از فرمت svg استفاده کنید. -این فرمت برخلاف فرمت‌هایی مثل png و jpeg، به صورت Vector یا برداری می‌باشد، -به طوری که شما می‌توانید بدونِ افت کیفیت، به هر اندازه آن را کوچک یا بزرگ کنید. -فرمت svg همواره از باقی فرمت‌ها کم‌حجم‌تر است اما در عوض، جزئیات کمتری را می‌توانید در آن جای دهید. -بنابراین بهترین استفاده از svg در لوگوها، Illustrationها و آیکن‌هاست. - -برای دانلود فایل‌های svg حرفه‌ای می‌توانید از لینک‌های زیر استفاده کنید: - -- [freepik](https://www.freepik.com/home) -- [flaticon](https://www.flaticon.com/) -- [unDraw](https://undraw.co/) -- [Icons8](https://icons8.com/) - ---- - -### Flexbox & Grid - -می‌توان گفت Flexbox و Grid جزء بهترین قابلیت‌هایی هستند که در طی چند سال گذشته به CSS اضافه شده‌اند؛ -اما متاسفانه خیلی از افراد در استفاده از آن‌ها دچار مشکل می‌شوند و نحوۀ کارکرد آن‌ها را به خوبی درک نمی‌کنند. -بنابراین در این قسمت به معرفی چند منبع برای رفع ابهامات احتمالی می‌پردازیم. - -برای آشنایی بیشتر با Flexbox می‌توانید از لینک زیر استفاده کنید: - -- [CSS Tricks - A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -- [Game - Flexbox Froggy](https://flexboxfroggy.com/) -- [Kevin Powell - Do you understand how Flexbox does what it does?](https://www.youtube.com/watch?v=9e-lWQdO-DA) -- [Kevin Powell - Flexbox is more complicated than you thought](https://www.youtube.com/watch?v=fm3dSg4cxRI) - -برای آشنایی بیشتر با Grid می‌توانید از لینک زیر استفاده کنید: - -- [CSS Tricks - A Complete Guide to Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) -- [Game - Grid Garden](https://codepip.com/games/grid-garden/) -- [Grid by Example](https://gridbyexample.com/) -- [Kevin Powell - The EASIEST way to get started with CSS GRID](https://www.youtube.com/watch?v=_lEkD8IGkwo) -- [Traversy Media - CSS Grid Layout Crash Course](https://www.youtube.com/watch?v=jV8B24rSN5o) -- [W3Schools - CSS Grid Layout Module](https://www.w3schools.com/css/css_grid.asp) - ---- - -## پروژه - -در این دوره قصد داریم یک فروشگاه آنلاین مانند Steam یا Epic برای خرید بازی بسازیم. -در این فاز شما باید با توجه به موارد آموزش داده شده، یک Landing Page برای سایت خود بسازید. -می‌توانید از نرم‌افزارهای مشابه ایده بگیرید اما اینکه چه قابلیت‌هایی در سایت شما وجود داشته باشد، کاملاً بستگی به خودتان دارد. -در صورتی که پیاده‌سازی قابلیتی ضروری باشد، در مستندات به آن اشاره خواهیم کرد. diff --git a/docs/frontend/phase07-ci-cd.md b/docs/frontend/phase07-ci-cd.md deleted file mode 100644 index 4e6ebc54..00000000 --- a/docs/frontend/phase07-ci-cd.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -title: CI/CD -description: Where is the pipe that was holding the door open? ---- - -## مقدمه - -زمانی که بر روی یک پروژۀ شخصی کار می‌کنیم، -معمولاً به ندرت احتیاج داریم آن را تست یا مستقر کنیم. -اما زمانی که پروژه به صورت تیمی توسعه داده شود، -نیاز است به طور مداوم تست‌های مختلف اجرا و فرآیند استقرار به‌طور خودکار انجام شود. -برای حل این مشکل می‌توانیم از روش‌های Continuous Integration و Continuous Deployment استفاده کنیم. - -- چگونه می‌توان تست‌ها را به‌طور خودکار اجرا کرد؟ -- چگونه می‌تواند فرآیندی جهت استقرار پروژه تنظیم کرد؟ -- چگونه می‌توان گزارشی از تمیزی کدهای جدید بدست آورد؟ - ---- - -## یادگیری - -### تعریف - -برای آشنایی بیشتر با این مفهوم می‌توانید از لینک‌های زیر استفاده کنید: - -- [Medium - What is CI/CD?](https://medium.com/tilicholabs/what-is-ci-cd-c7c047b80e6b) -- [Medium - The Journey to CI/CD](https://medium.com/driven-by-code/the-journey-to-ci-cd-b1872927c36b) -- [Medium - What's the Point of CI Anyway?](https://medium.com/swlh/whats-the-point-of-ci-anyway-ac3f9eaa244c) - ---- - -### GitHub Actions - -یکی از ابزارهای CI/CD معروف، GitHub Actions است -که به کمک آن، می‌توانیم یک Pipeline شامل عملیات Build، اجرای Testها، استقرار پروژه -و دیگر عملیاتی که در دستهٔ CI/CD قرار می‌گیرد را به Repository خود اضافه کنیم. - -#### Setup - -یک پوشه با نام `github.` در پوشۀ اصلی پروژه بسازید -و یک پوشه با نام `workflows` به آن اضافه کنید. -حال یک فایل که به پسوند `yml` ختم می‌شود را درون پوشۀ `workflows` قرار دهید؛ -به‌طور مثال ما از نام `deploy.yml` استفاده می‌کنیم. - -برای آنکه نام Workflow را مشخص کنید، کافی است محتوای زیر را به فایل خود اضافه نمایید: - -```yaml -name: Deployment Workflow -``` - -#### Conditions - -ممکن است بخواهید فقط زمانی Workflow اجرا شود که بر روی یک Branch خاص عملیات Push را انجام می‌دهید؛ -در این صورت محتوای زیر را به فایل خود اضافه نمایید: - -```yaml -on: - push: - branches: - - main -``` - -اما اگر می‌خواهید بر روی تمام Branchها این اتفاق بیفتد؛ -از محتوای زیر استفاده کنید: - -```yaml -on: - push: -``` - -همچنین می‌توانید شرایط دیگری را برای اجرا شدن Workflow در نظر بگیرید؛ -به‌عنوان مثال ایجاد یک Pull Request جدید یا عوض‌شدن وضعیت Issueها. - -#### Test - -هر Workflow می‌تواند شامل چند Job باشد که به‌صورت موازی یا متوالی انجام می‌شوند. - -برای تعریف کار Test می‌توانید از محتوای زیر استفاده کنید: - -```yml -jobs: - test: - name: Test - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v1 - with: - node-version: '16.x' - - - name: Install Dependencies - run: npm ci - - - name: ESLint - run: npm run eslint:check - - - name: Stylelint - if: success() - run: npm run stylelint:check - - - name: Prettier - if: success() - run: npm run prettier:check - - - name: Angular - if: success() - run: npm run test:ci -``` - -در اینجا ابتدا نامی برای Job در نظر می‌گیریم تا بتوانیم آن را از سایر Jobها تشخیص دهیم؛ -در خط بعد سیستم‌عاملی که Job بر روی آن اجرا می‌شود را مشخص کنیم؛ -سپس مراحل کار را تعریف می‌کنیم که هر کدام را در ادامه به‌صورت مختصر توضیح می‌دهیم. - -##### Checkout - -همان‌طور که شما برای انجام هر کاری احتیاج دارید ابتدا بر روی Branch مورد نظر عملیات Checkout را انجام دهید، -زمانی که از GitHub Actions استفاده می‌کنیم هم باید این عملیات انجام شود. - -##### Setup Node - -در این مرحله Node.js بر روی سیستم عامل نصب می‌شود. -شما می‌توانید یک نسخۀ خاص از Node.js را که مطمئنید با پروژۀ شما سازگار است نصب کنید. - -##### Install Dependencies - -با اجرای دستور `npm ci` در ترمینال به نصب Dependencyها می‌پردازیم. - -##### ESLint - -با اجرای دستور `npm run eslint:check` از پاس‌شدن تست‌های ESLint اطمینان حاصل می‌کنیم. - -##### Stylelint - -با اجرای دستور `npm run stylelint:check` از پاس‌شدن تست‌های Stylelint اطمینان حاصل می‌کنیم. - -##### Prettier - -با اجرای دستور `npm run prettier:check` از پاس‌شدن تست‌های Prettier اطمینان حاصل می‌کنیم. - -##### Angular - -با اجرای دستور `npm run test:ci` از پاس‌شدن تست‌های Angular اطمینان حاصل می‌کنیم. - -##### Scripts - -این Scriptها را باید به فایل `package.json` اضافه نمایید: - -```json -{ - "name": "...", - "version": "...", - "scripts": { - "eslint:check": "ng lint", - "eslint:fix": "ng lint --fix", - "stylelint:check": "stylelint \"**/*.scss\"", - "stylelint:fix": "stylelint \"**/*.scss\" --fix", - "prettier:check": "prettier . --check", - "prettier:fix": "prettier . --write", - "test:ci": "ng test --browsers=ChromeHeadless --watch=false" - } -} -``` - -همچنین برای راحتی کار شما، نسخۀ `fix:` را برای هر Script قرار داده‌ایم -تا با استفاده از آن بتوانید خطاهای احتمالی را به‌صورت خودکار رفع کنید. - -#### Build - -برای تعریف کار Build می‌توانید از محتوای زیر استفاده کنید: - -```yml -jobs: - test: ... - build: - name: Build - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v1 - with: - node-version: '16.x' - - - name: Install Dependencies - run: npm ci - - - name: Build - run: npm run build:prod - - - name: 404.html Hack - if: success() - run: cp dist/my-project-name/index.html dist/my-project-name/404.html - - - name: Upload Build - if: success() - uses: actions/upload-artifact@v1 - with: - name: deploy_dist - path: dist -``` - -با اجرای دستور `npm run build:prod` از پروژه Build تهیه می‌کنیم. - -این Script را باید به فایل `package.json` اضافه نمایید: - -```json -{ - "name": "...", - "version": "...", - "scripts": { - "build:prod": "ng build --base-href=/my-project-name/" - } -} -``` - -:::caution - -به جای `my-project-name` باید نام پروژۀ خود را قرار دهید. - -::: - -##### 404.html Hack - -زمانی که از GitHub Pages برای استقرار سایت استفاده می‌کنیم، -اگر به‌صورت دستی آدرس یکی از صفحات را در مرورگر وارد کنیم، -صفحۀ 404 نمایش داده می‌شود و از Routing خودِ Angular استفاده نمی‌کند. -برای حل این مشکل یک کپی از `index.html` می‌گیریم و نام آن را `404` می‌گذاریم. - -##### Upload Build - -تنها در صورتی که نتیجۀ Build موفقیت‌آمیز بود، -آن را به طور موقت با نام `deploy_dist` ذخیره می‌کنیم تا در ادامه بتوانیم از آن استفاده کنیم. - -#### Deploy - -برای تعریف کار Deploy می‌توانید از محتوای زیر استفاده کنید: - -```yaml -jobs: - test: ... - build: ... - deploy: - name: Deploy - runs-on: ubuntu-latest - needs: - - test - - build - steps: - - name: Checkout - uses: actions/checkout@v1 - - - name: Download Build - uses: actions/download-artifact@v1 - with: - name: deploy_dist - - - name: Deploy to GitHub Pages - uses: JamesIves/github-pages-deploy-action@releases/v3 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: deploy_dist/my-project-name -``` - -:::caution - -به جای `my-project-name` باید نام پروژۀ خود را قرار دهید. - -::: - -##### Download Build - -پوشه‌ای که در مرحلۀ قبل ذخیره کرده بودیم را در اینجا دانلود می‌کنیم. - -##### Deploy to GitHub Pages - -محتویات پوشه را داخل برنچ `gh-pages` قرار می‌دهیم که GitHub بتواند از آن استفاده کند. - -#### Monitor - -از این پس، بعد از آنکه بر روی Branch مورد نظر عملیات Push انجام دهید، -در صفحۀ Actions پروژۀ خود می‌توانید اجرا آن را مرحله به مرحله زیر نظر بگیرید -و در صورتی که خطایی رخ دهد از آن باخبر شوید. - ---- - -## پروژه - -با توجه به مطالبی که در این فاز یاد گرفتید، -فرآیند CI/CD را برای پروژۀ خود فراهم کنید.