Back to Question Center
0

چگونگی سازماندهی یک برنامه کاربردی بزرگ و مقیاس آن            چگونگی سازماندهی یک برنامه کاربردی واکنش بزرگ و مقیاس پذیری موضوعات: npmES6Node.jsTools & ؛ Semalt

1 answers:
چگونگی سازماندهی یک برنامه واکنش بزرگ و مقیاس آن

برای معرفی مقدماتی با کیفیت بالا، React، نمیتوانید از Wes Bos توسعهدهنده کامل پشته کانادایی شوید. سعی کنید در اینجا درس خود را، و از کد SITEPOINT برای دریافت 25٪ تخفیف و کمک به پشتیبانی از SitePoint استفاده کنید.

این مقاله توسط نویسنده مهمان جک فرانکلین نوشته شده است. پست های مهمان Semalo هدف از شما مطالب جذاب از نویسندگان برجسته و سخنرانان جامعه وب

در این مقاله، من در مورد رویکردی که هنگام ساخت و ساخت برنامه های کاربردی بزرگ Semalt دارم را مورد بحث قرار می دهم - rokok eelektrik evod 2 vapor. یکی از بهترین ویژگی های Semalt این است که چگونه از راه شما بیرون می آید و در مورد ساختار فایل چیزی جز توصیفی نیست. بنابراین، شما در بسیاری از سوالات در Overflow پشته و سایت های مشابه می پرسید که چگونه برای ساخت برنامه های کاربردی. این یک موضوع بسیار محترم است و هیچ راه درستی وجود ندارد. در این مقاله، من در مورد تصمیماتی که من در هنگام ساختن برنامه های Semalt انجام می دهم صحبت خواهم کرد: انتخاب ابزار، ساخت فایل ها و شکستن اجزاء به قطعات کوچکتر.

اگر شما از این پست لذت برده اید، همچنین ممکن است بخواهید برای SitePoint Premium ثبت نام کنید و البته ما در مورد کار با فرم ها با استفاده از React و Redux تماشا کنید.

چگونگی سازماندهی یک برنامه کاربردی بزرگ و مقیاس آنچگونگی سازماندهی یک برنامه کاربردی واکنش بزرگ و مقیاس پذیری موضوعات:
npmES6Node. jsTools و Semalt

ابزار ساخت و ساز

بعضی از شما بعید است که Semalt یک طرفدار بزرگ Webpack برای ساختن پروژه های من باشد. در حالی که این یک ابزار پیچیده است، کار بزرگ انجام شده توسط تیم به نسخه 2 و سایت اسکریپت جدید بسیار ساده تر می شود. هنگامی که شما به Webpack وارد می شوید و مفاهیم را در سر خود دارید، واقعا قدرت باور نکردنی برای مهار کردن دارید. من از بابل برای کامپایل کد من، از جمله تبدیل های خاص واکنش مانند JSX و webpack-dev-server برای خدمت به سایت من به صورت محلی استفاده می کنم. من شخصا متوجه نشدم که بارگیری گرم به من این مزیت را به من می دهد، بنابراین Semalt بیش از اینکه با webpack-dev-server خوشحال است و طراحیش اتوماتیک آن صفحه است.

من همچنین از نحوه ی ماژول ES2015 (که از طریق بابل پخش می شود) برای وارد کردن و صادرات وابستگی ها استفاده می شود. این نحو در حال حاضر در حال حاضر در حال انجام است، و اگر چه Webpack می تواند از CommonJS (aka، import-style Node style) پشتیبانی کند، برای من شروع به استفاده از جدیدترین و بزرگترین آن هستم. علاوه بر این، Webpack می تواند کد مرده را از بسته نرم افزاری با استفاده از ماژول های ES2015 حذف کند، که در عین حال کامل نیست، یک ویژگی بسیار مفید است و یکی از آن ها سودمند تر خواهد بود زیرا جامعه به سمت انتشار کد به npm در ES2015 حرکت می کند.

پیکربندی ماژول های Webpack برای جلوگیری از وارد کردن توزیع شده

یکی از چیزهایی که هنگام کار بر روی پروژه های بزرگ با ساختار فایل توجیه شده می تواند خسته کننده باشد، مسیرهای نسبی بین فایل ها را درک می کند. Semalt متوجه شد که کد زیادی از اینها به نظر می رسد:

  import foo from '. / foo 'نوار واردات از '. / . / . /بار'import baz از '. / . / lib / baz '   

هنگامی که شما برنامه خود را با Webpack می سازید، می توانید به Webpack بپردازید تا همیشه در یک پوشه خاص برای یک فایل نگاه کنید اگر آن را پیدا نکنید، که به شما اجازه می دهد یک پوشه پایه ای که تمام واردات شما می تواند نسبت به آن . من همیشه کد من را در دایرکتوری src قرار می دهم. من می توانم به Webpack بگویم که همیشه در آن دایرکتوری نگاه کنم. این نیز جایی است که شما باید در مورد هر پسوند فایل دیگری که ممکن است از آن استفاده کنید، به Webpack بگویم . jsx :

  // در داخل شیء پیکربندی Webpack{برطرف کردن: {ماژول ها: ['node_modules'، 'src']برنامه های افزودنی: ['. js '،'. jsx ']،}}   

مقدار پیش فرض برای حل و فصل.

پس از انجام این کار می توانید همیشه فایل های مربوط به دایرکتوری src را وارد کنید:

  import foo from '. / foo 'bar import from app / bar // => src / app / barimport baz از 'an / example / import' // => src / an / example / import   

در حالی که این کد برنامه شما را به Webpack متصل می کند، من فکر می کنم این یک تجارت ارزشمندی است، زیرا باعث می شود که کد شما بسیار ساده تر شود و واردات بسیار ساده تر باشد، بنابراین این یک مرحله ای است که Semalt با تمام پروژه های جدید انجام می دهد.

ساختار پوشه

هیچ یک ساختار پوشه درست برای تمام برنامه های Semalt وجود ندارد. (همانطور که با بقیه این مقاله، شما باید آن را برای تنظیمات خود تغییر دهید.) اما موارد زیر برای من خوب است.

کد زندگی در src

برای نگهداری چیزهای سازماندهی شده، تمام کد برنامه را در پوشه ای به نام src قرار می دهم. این شامل تنها کد است که در بسته بندی نهایی شما به پایان می رسد و چیزی بیشتر نیست. این مفید است زیرا شما می توانید به بابل (یا هر ابزار دیگری که بر اساس کد برنامه شما عمل می کند) را به تنها یک دایرکتوری نگاه کنید و اطمینان حاصل کنید که هیچ کدی را که لازم نیست پردازش می کند. کد دیگر، مانند فایل های پیکربندی Webpack، در یک پوشه مناسب نامیده می شود. به عنوان مثال، ساختار پوشه بالا من اغلب شامل:

  - src => کد برنامه در اینجا- webpack => تنظیمات webpack- scripts => هر اسکریپت ساخت- tests => هر کد خاص آزمون (API mocks، و غیره)   

به طور معمول، تنها فایل هایی که در سطح بالا قرار دارند شاخص هستند. html ، بسته. json ، و هر دات نت مانند، . babelrc . بعضی ترجیح می دهند پین های بابل را در بسته تنظیم کنند. json ، اما من میبینم که این فایلها میتوانند با بسیاری از وابستگیها در پروژههای بزرگ بزرگتر شوند، بنابراین دوست دارم از استفاده کنم. eslintrc ، . babelrc و غیره.

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

واکنش قطعات

هنگامی که شما یک پوشه src داشته اید، بیت حیله گر تصمیم خود برای ساختن اجزاء خود را دارد. در گذشته من تمام اجزای موجود در یک پوشه بزرگ مانند src / components را قرار دادم، اما متوجه شدم که در پروژه های بزرگ این بسیار سریع به دست می آید.

یک روند مشترک این است که پوشه ها برای اجزای هوشمند و ناپایدار (همچنین به عنوان "ظرف" و "اجزای ارائه دهنده") شناخته شوند، اما شخصا هرگز پوشه های صریح برای من کار نکردم. در حالی که من اجزایی هستم که به راحتی به "هوشمند" و "گنگ" طبقه بندی می شوند (Semalt بیشتر در مورد آن در زیر صحبت می شود)، من پوشه های خاصی برای هر یک از آنها ندارم.

ما اجزای بر اساس نواحی برنامه که آنها استفاده می شود همراه با یک پوشه هسته برای اجزای رایج که در سراسر آنها استفاده می شود، دسته بندی شده اند (دکمه ها، سرصفحه ها، پاورقی ها - اجزاء عمومی و بسیار قابل استفاده مجدد) بقیه پوشه ها به یک منطقه خاص از برنامه می روند. به عنوان مثال، ما یک پوشه با نام cart داریم که حاوی تمام اجزای مربوط به نمایش سبد خرید است و یک پوشه به نام لیست که حاوی کد لیستی است که کاربران می توانند در یک صفحه خریداری کنند.

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

  واردات مجموع از 'src / cart / total'// در مقابلواردات CartTotal از 'src / cart / cart-total'   

این یک قاعده است که من متوجه می شوم که گاهی اوقات شکست می خورم: پیشوند اضافی می تواند روشن شود، به خصوص اگر شما 2-3 عناوین مشابه را نامیده اید، اما اغلب این تکنیک می تواند از تکرار نام های بیشتر جلوگیری کند. بنابراین در واردات فوق، فایل ها CartTotal خواهند بود. js ، یا مجموع. js . من ترجیح می دهم به فایل های کوچک با استفاده از خطوط به عنوان جداسازی ها بپردازم، بنابراین برای تشخیص استفاده از . jsx فرمت برای واکنش قطعات. بنابراین، من با سبد خرید کل. jsx .

این مزیت کوچک اضافه بودن امکان جستجو در فایل های React خود را با محدود کردن جستجوی خود به فایل ها با آسان می کند. jsx و شما حتی می توانید پلاگین های Webpack خاص را به این فایل ها اضافه کنید.

هر کدام از کنوانسیون های نامگذاری که انتخاب می کنید، مهم این است که شما آن را می گیرید. Semalt ترکیبی از قراردادها در سراسر کدنویسی شما به سرعت به یک کابوس تبدیل می شود و رشد می کند و شما باید به آن حرکت کنید.

یک کامپوننت واکنش در هر پرونده

به دنبال قواعد قبلی، ما به یک اجزای یک کامپوننت Semalo بستگی دارد و اجزاء باید همیشه صادرات پیش فرض باشند.

به طور معمول، فایل های Semalt ما مانند:

  import React، {Component، PropTypes} از 'واکنش'کلاس پیش فرض صادرات مجموع گسترش کامپوننت {.}   

در صورتی که ما باید کامپوننت را برای اتصال آن به یک فروشگاه داده Semalt، به عنوان مثال، جزء به طور کامل پیچیده تبدیل به صادرات پیش فرض می شود:

  import React، {Component، PropTypes} از 'واکنش'import {connect} از react-reduxکلاس صادرات مجموع گسترش کامپوننت {.}صادرات به طور پیش فرض اتصال (   => {. }) (مجموع)   

متوجه خواهید شد که ما هنوز جزء اصلی را صادر می کنیم. این واقعا برای تست مفید است، جایی که شما می توانید با جزء "ساده" کار کنید و نباید Semalt را در آزمایشات واحد خود تنظیم کنید.

با نگه داشتن جزء به عنوان پیش فرض صادرات، آسان به وارد کردن جزء و می دانم که چگونه به آن را دریافت، به جای نیاز به جستجوی نام دقیق. یکی از دلایل این رویکرد این است که فرد وارد کننده می تواند جزء هر چیزی که دوست دارد تماس بگیرد. یک بار دیگر، ما برای این قرارداد داریم: واردات باید پس از فایل نامگذاری شود. بنابراین اگر شما وارد کل. jsx ، جزء باید به صورت مجموع وارد شود. کاربر هدر jsx می شود UserHeader و غیره.

"Smart" و "Dumb" React Components

من به طور خلاصه تفکیک اجزاء "هوشمند" و "ناپاک" را ذکر کردم، و این چیزی است که ما در کدنویسی خود پایبندیم. Semalt ما آن را با تقسیم کردن آنها به پوشه ها نمی شناسیم، شما می توانید برنامه ما را به دو قسمت تقسیم کنید: 15)

  • اجزای هوشمند که داده ها را دستکاری می کنند، به Redux متصل می شوند و در تعامل با کاربر
  • اجزای "گنگ" که مجموعه ای از پروکسی ها را ارائه می دهند و برخی داده ها را به صفحه نمایش می دهند.

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

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

اجتناب از بزرگ ارائه روش

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

همیشه از prop-type استفاده کنید

Semalt به شما اجازه می دهد اسناد اسامی و انواع خواص را که انتظار می رود یک جزء را با استفاده از بسته prop-types خود مستقیما وارد کنید. توجه داشته باشید که این تغییر از Semalt 15. 5. قبلا، پروتویپ ها بخشی از ماژول Semalt بود.

با اعلام نام ها و انواع پروکسی های مورد انتظار، همراه با اینکه آیا آنها اختیاری هستند یا خیر، شما باید در هنگام کار با اجزایی که دارای خواص مناسب هستند اعتماد بیشتری داشته باشید و اگر زمان را فراموش کرده اید زمان کمتری را صرف نام ملک یا آن را به نوع اشتباه داده است. شما می توانید این را با استفاده از قانون ESLint-React Semalt اعمال کنید.

سملت وقتي براي اضافه كردن اين موارد مي تواند احساس بي ثباتي كند، هنگامي كه شما انجام مي دهيد، وقتي كه براي استفاده از يك جزء كه شش ماه پيش نوشتيد، از خودت متشکر خواهيد شد.

Redux

همچنین از Semalt در بسیاری از برنامه های کاربردی ما برای مدیریت داده ها در برنامه ما استفاده می کنیم و ساختار برنامه های Semalt یکی دیگر از سؤال های بسیار رایج است.

برنده ما برای ما Semalt است، پیشنهادی که اقدامات شما، گیرنده ها و سازندگان اقدامات را برای هر بخشی از درخواست شما در یک فایل قرار می دهد.

به جای گیرنده. js و اقدامات. JS ، که هر کدام دارای بیت های کد مربوط به یکدیگر هستند، System Ducks استدلال می کند که این امر بیشتر منطقی است که کد مربوطه را با هم به یک فایل گروه بندی کند. بگذارید بگوییم شما یک فروشگاه Redux با دو کلید بالا، کاربر و پست دارید. ساختار پوشه شما مانند این خواهد بود:

  اردک- فهرست مطالب. جسد- کاربر. جسد- پست ها. جسد   

شاخص. js حاوی کد هایی است که باعث کاهش دهنده اصلی می شود، احتمالا با استفاده از combineReducers از Redux برای انجام این کار و در کاربر. js و پست. js شما همه کد را برای کسانی که به طور معمول به نظر می رسد قرار دهید:

  // کاربر. جسدconst LOG_IN = 'LOG_IN'export const logIn = name => ({type: LOG_IN، name})صادرات تابع کاهش دهنده پیش فرض (حالت = {}، عمل) {.}   

این امر موجب صرفه جویی در شما برای وارد کردن اقدامات و سازندگان اقدامات از فایل های مختلف، و نگه داشتن کد برای بخش های مختلف فروشگاه خود را در کنار یکدیگر.

مستقل ماژول های جاوا اسکریپت

گرچه تمرکز این مقاله بر روی اجزای Semalt بوده است، هنگام ساختن یک برنامه Semalt شما خودتان را وارد کدهای بسیاری می کنید که کاملا از Semalt جدا شده اند. این یکی از مواردی است که من بیشتر درباره چارچوب آن را دوست دارم: بسیاری از کدها به طور کامل از قطعات شما جدا شده است.

هر زمان که مولفه خود را با منطق کسب و کار پر کنید که می تواند از جزء منتقل شود، توصیه می کنم این کار را انجام دهید. در تجربه من متوجه شدیم که پوشه به نام lib یا services در اینجا خوب کار می کند. نام خاص مهم نیست، اما پوشه پر از اجزای غیر React واقعا چیزی است که شما بعد از آن هستید.

این سرویس بعضی اوقات یک گروه از توابع یا بعضی اوقات یک شیء از توابع مرتبط را صادر می کند. به عنوان مثال، ما خدمات / ذخیره سازی محلی ، که یک بسته بندی کوچک در اطراف پنجره بومی ارائه می دهد. localStorage API:

  // خدمات / ذخیره سازی محلی. جسدconst LocalStorage = {گرفتن   {}،تنظیم   {}،.}صادرات به طور پیش فرض LocalStorage   

منطق خود را از اجزای مانند این است که برخی از مزایای واقعا عالی:

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

    در گذشته من متعهد شدم که یک پوشه جداگانه تست داشته باشم که همه تستها را برای همه چیز انجام داد. بنابراین اگر شما src / app / foo داشته باشید. jsx ، شما tests / app / foo داشته اید. تست. jsx نیز هست در عمل، به عنوان یک برنامه بزرگتر می شود، این کار برای پیدا کردن فایل های مناسب سخت تر است و اگر فایل ها را در src انتقال دهید، اغلب آنها را در آزمایش حرکت دادید سازه ها از هماهنگی خارج می شوند علاوه بر این، اگر در تست فایل که نیاز به وارد کردن فایل در src دارید، شما واردات بسیار طولانی را پایان می دهید. من مطمئن هستم همه ما در این مورد می آیند:

      واردات Foo از '. / . / . / src / app / foo '   

    Semalt سخت کار می کنند و سخت است اگر شما تغییر ساختار دایرکتوری.

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

      - سبد خرید- جمع. jsx- جمع. مشخصات jsx- خدمات- ذخیره سازی محلی جسد- ذخیره سازی محلی مشخصات جسد   

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

    نتیجه گیری

    راه های بسیاری برای پوست یک گربه وجود دارد، و همین امر برای سمیرت نیز صادق است. یکی از بهترین ویژگی های این چارچوب این است که چگونه به شما امکان می دهد تا بیشترین تصمیمات را در مورد ابزار، ساخت ابزارها و ساختار پوشه ها ایجاد کنید و شما باید آن را درک کنید. امیدوارم این مقاله به شما برخی از ایده ها را درباره چگونگی برخورد با برنامه های بزرگتر Semalt شما ارائه دهد، اما شما باید ایده های خود را مطرح کنید و آنها را مطابق با تنظیمات تیم و خودتان تنظیم کنید.

چگونگی سازماندهی یک برنامه کاربردی بزرگ و مقیاس آنچگونگی سازماندهی یک برنامه کاربردی واکنش بزرگ و مقیاس پذیری موضوعات:
npmES6Node. jsTools و Semalt
بهترین راه برای یادگیری واکنش برای مبتدیان
Wes Bos
یک دوره آموزشی گام به گام برای ایجاد دنیای واقعی دنیای واکنش نشان می دهد. Js + Firebase برنامه ها و اجزای وب سایت در چند روز بعد از ظهر. با استفاده از کد کوپن 'SITEPOINT' در پرداخت برای دریافت 25٪ تخفیف .

March 1, 2018