Back to Question Center
0

Jak uspořádat velkou reakci aplikace a učinit ji měřítko            Jak uspořádat aplikaci s velkou reakcí a provést její úpravy v měřítku: npmES6Node.jsTools & Semalt

1 answers:
Jak uspořádat velkou reakci aplikace a učinit ji Scale

Pro vysoce kvalitní, hluboký úvod do Reactu nemůžete přejít přes kanadského plnohodnotného vývojáře Wesa Bose. Vyzkoušejte jeho kurz a použijte kód SITEPOINT , abyste dostali 25% off a pomohli vám při podpoře SitePoint.

Tento článek je hostujícím autorem Jack Franklin. Cílem příspěvků na seminářích je přinést zajímavý obsah předních spisovatelů a řečníků webové komunity

V tomto článku budu diskutovat o přístupu, který jsem učinil při budování a strukturování velkých aplikací Semalt. Jedním z nejlepších vlastností Semaltu je, jak se dostane z vaší cesty a je pouze popisné, pokud jde o strukturu souborů - angebot umzug. Proto naleznete spoustu otázek týkajících se Stack Overflow a podobných stránek, které se ptají, jak strukturovat aplikace. Toto je velmi podložené téma a nikdo není správný. V tomto článku vás budeme hovořit prostřednictvím rozhodnutí, která učiním při vytváření aplikací Semalt: vychystávání nástrojů, strukturování souborů a rozdělení součástí na menší části.

Pokud si tento příspěvek vychutnáte, můžete se také zaregistrovat na webu SitePoint Premium a sledovat náš kurz práce s formuláři pomocí React a Redux.

Jak uspořádat velkou reakci aplikace a učinit ji měřítkoJak uspořádat aplikaci s velkou reakcí a provést její úpravy v měřítku:
npmES6Node. jsTools & Semalt

Sestavení nástrojů a leštění

Někteří z vás nebudou překvapeni, že Semalt obrovský fanoušek Webpack pro stavbu svých projektů. Zatímco je to komplikovaný nástroj, skvělá práce, kterou dává tým do verze 2 a nové stránky dokumentace, je mnohem jednodušší. Jakmile se dostanete do Webpacku a budete mít koncepce v hlavě, máte opravdu neuvěřitelnou sílu, jak to zvládnout. Používám Babel ke zkompilování mého kódu, včetně React-specific transformuje jako JSX a webpack-dev-server slouží místnímu místu pro mé stránky. Osobně jsem zjistil, že nabíjení za tepla mi dává tolik výhod, takže Semalt víc než spokojený s webpack-dev-serverem a jeho automatickým obnovením stránky.

Používám také syntaxi modulu ES2015 (která je překládána přes Babel) pro import a export závislostí. Tato syntaxe je již nějakou dobu a i když Webpack může podporovat CommonJS (aka importy ve stylu Node), je pro mě rozumné začít používat nejnovější a největší. Navíc Webpack dokáže odstranit mrtvý kód ze svazků pomocí modulů ES2015, které, i když ne perfektní, jsou velmi užitečné a mají užitek, když se komunita pohybuje směrem k publikování kódu na npm v ES2015.

Konfigurace rozlišení modulu Webpack , aby se zabránilo vnořeným importům

Jedna věc, která může být frustrující při práci na velkých projektech se vnořenou strukturou souborů, je zjištění relativních cest mezi soubory. Semaltem zjistíte, že skončíte spoustou kódu, který vypadá takto:

     import foo od ". / foo 'import bar z '. /. /. /bar'import baz od '. /. / lib / baz '    

Když vytváříte aplikaci s Webpackem, můžete vědět, že Webpack vždy hledá v konkrétním adresáři souboru, pokud jej nenajde, což umožňuje definovat základní složku, ve které se všechny vaše dovozy mohou stát relativní . Vždy jsem vložil svůj kód do adresáře src . Můžu říct Webpack, aby se vždy podíval do tohoto adresáře. Toto je místo, kde musíte informovat Webpack o všech dalších příponách, které byste mohli používat, například . jsx :

     uvnitř objektu Webpack config{{vyřešit: {moduly: ['node_modules', 'src'],rozšíření: ['. js ','. jsx '],}}}}    

Vyřeší se výchozí hodnota pro .

Jakmile to provedete, můžete vždy importovat soubory týkající se adresáře src :

     import foo od ". / foo 'import bar z 'app / bar' // => src / app / barimport baz od 'an / example / import' // => src / an / example / import    

Zatímco toto spojuje váš kód aplikace s Webpackem, myslím si, že je to užitečné řešení, protože vaše kód je mnohem snazší sledovat a dovoz je mnohem snazší přidávat, takže je to krok Semalt se všemi novými projekty.

Struktura složek

Pro všechny aplikace Semalt neexistuje žádná správná struktura složek. (Stejně jako ve zbytku tohoto článku, měli byste to změnit podle vašich preferencí.) Ale toto je to, co mi fungovalo dobře.

Kód žije v src

Aby se věci udržely, umístím celý kód aplikace do složky s názvem src . Obsahuje pouze kód, který končí ve vašem konečném balíčku a nic víc. To je užitečné, protože můžete říct, že Babel (nebo jakýkoli jiný nástroj, který působí na váš kód aplikace) prostě vypadá v jednom adresáři a ujistěte se, že nespracovává žádný kód, který nepotřebuje. Jiný kód, například konfigurační soubory Webpack, žije ve vhodně pojmenované složce. Struktura složek nejvyšší úrovně obsahuje například:

     - src => kód aplikace zde- webpack => webpack configs- skripty => libovolné skripty sestavení- testy => jakýkoli konkrétní kód testu (výslechy API apod.)    

Jediné soubory, které budou na nejvyšší úrovni, jsou zpravidla index. html , balíček. json a všechny dotfiles, například . babelrc . Někteří dávají přednost tomu, aby byla součástí balíčku . json , ale shledávám, že tyto soubory se mohou dostat na velké projekty s mnoha závislostmi, takže se mi líbí . eslintrc , . babelrc a tak dále.

Uchováním kódu aplikace v src můžete také použít řešení . modul trik jsem zmínil dříve, což zjednodušuje veškerý dovoz.

Reagovat Komponenty

Jakmile máte složku src , choulostivý bit se rozhodne, jak strukturovat vaše komponenty. V minulosti jsem dal všechny komponenty do jedné velké složky, jako například src / components , ale zjistil jsem, že na větších projektech se to velice rychle stává ohromující.

Společným trendem je mít složky pro "inteligentní" a "hloupé" komponenty (známé také jako "kontejnerové" a "prezentační" komponenty), ale osobně jsem nikdy nenašel explicitní složky pro mě. Zatímco mám komponenty, které se volně rozdělují na "inteligentní" a "hloupé" (Semalt mluví více o tom níže), nemám pro ně žádné konkrétní složky.

Sestavili jsme komponenty založené na oblastech aplikace, které se používají, spolu se složkou jádra pro běžné komponenty, které se používají v celém rozsahu (tlačítka, záhlaví, zápatí - velmi opakovaně použitelné). Zbytek složek mapuje konkrétní oblast aplikace. Máme například složku nazvanou košík , která obsahuje všechny součásti týkající se zobrazení nákupního košíku a složku nazvanou výpisy , která obsahuje kód pro výpis, který mohou uživatelé nakupovat na stránce.

Kategorizace do složek také znamená, že se můžete vyhnout předfixování komponent s oblastí aplikace, pro kterou jsou používány. Například, kdybychom měli součást, která by vynakládala celkové náklady na účet uživatele, než aby mu to volala CartTotal , raději bych celkem 39) složka vozíku :

     import Celkem z 'src / cart / total'// vsimport CartTotal z 'src / cart / cart-total'    

Jedná se o pravidlo, které se mi někdy lámá: zvláštní předpona může vyjasnit, zvláště pokud máte 2-3 podobně pojmenované komponenty, ale často se tato technika může vyhnout dalšímu opakování jmen. Takže ve výše uvedeném dovozu by soubory byly CartTotal. js nebo Celkem. js . Mám tendenci upřednostňovat držení malých souborů s pomlčkami jako oddělovačů, takže pro rozlišování používám . jsx pro komponenty React. Proto bych se držel košíku celkem. jsx .

To má malou výhodu, že se budete moci snadno prohledávat pouze soubory React tím, že omezíte vyhledávání na soubory . jsx , a pokud potřebujete, můžete dokonce použít i tyto specifické pluginy Webpack.

Bez ohledu na to, jakou pojmenovanou konvenci vyberete, je důležité, abyste se k ní drželi. Semaltem kombinace konvencí v celé své kódové databázi se rychle stane noční můrou, jak roste, a musíte ji navigovat.

Jedna reaktivní složka na soubor

V návaznosti na předchozí pravidlo se budeme držet konvence jednoho souboru komponenty Semalt a součást by měla být vždy výchozí export.

Normálně naše soubory Semaltu vypadají takto:

     import React, {Component, PropTypes} od 'react'export výchozí třída Total extends Component {.}}    

V případě, že musíme součást zabalit, abychom jej připojili k úložišti dat, například úplně zabalená součást se stává výchozím výstupem:

     import React, {Component, PropTypes} z "react"import {connect} od "react-redux"exportní třída Total extends Component {.}}export default connect (   => {. }) (celkem)    

Všimnete si, že původní komponentu stále exportujeme. To je opravdu užitečné pro testování, kde můžete pracovat s "prostou" komponentou a nemusíte nastavovat Semalt ve vašich jednotkových testech.

Udržováním součásti jako výchozího exportu je snadné importovat součást a vědět, jak se k ní dostat, spíše než hledat přesný název. Jeden nevýhodou tohoto přístupu je to, že osoba, která dováží, může volat součást co se jim líbí. Znovu máme k tomu konvenci: import by měl být pojmenován po souboru. Takže pokud importujete celkem. jsx , součást by měla být importována jako Celkem . záhlaví uživatele. jsx se stává UserHeader a tak dále.

Komponenty "Smart" a "Dumb" React

Stručně jsem se zmínil o oddělení "inteligentních" a "hloupých" složek, a to je něco, s čím se držíme v naší kódové základně. S Semaltem to nerozpoznáme tím, že je rozdělíme do složek, můžete široce rozdělit naši aplikaci na dva typy komponent:

  • "inteligentní" komponenty, které manipulují s daty, připojují se k Reduxu a zabývají se interakcí uživatele
  • "hloupé" komponenty, které dostanou množinu rekvizit a udělají některé údaje na obrazovku.

Více informací o tom, jakým způsobem se zaměřujeme na "hloupé" komponenty ve svém příspěvku na blogu o funkcionalistických bezdomovských složkách v reakci. Tyto komponenty tvoří většinu naší aplikace a vždy byste měli tyto komponenty upřednostňovat, pokud je to možné. Semalt je snadnější pracovat, méně buggy a snadněji testovat.

I když budeme muset vytvářet "inteligentní" komponenty, pokusíme se zachovat veškerou logiku JavaScript ve vlastním souboru. V ideálním případě by komponenty, které mají manipulovat s daty, měly tyto údaje odevzdat JavaScript, který je může manipulovat. Tímto způsobem můžete manipulační kód testovat odděleně od Semalta a můžete ho posmívat, když to potřebujete při testování komponenty Semalt.

Vyvarujte se velkých omítky Metody

Jedna věc, o kterou se snažíme, je mít spoustu malých komponentů Semaltu, spíše než méně, větší součásti. Dobrým návodem pro to, kdy je váš komponent příliš velký, je velikost funkce vykreslení. Pokud je to těžké, nebo je třeba rozdělit do mnoha menších funkcí vykreslování, může to být čas, kdy byste měli vzít v úvahu funkci. Můžete také použít počet rekvizit nebo položek ve stavu jako jiný dobrý indikátor. Pokud součást přijímá sedm různých podpěr, může to znamenat, že to dělá příliš mnoho.

Vždy používejte prop-typ

Semalt umožňuje dokumentovat názvy a typy vlastností, které očekáváte z komponenty, které mají být zadány pomocí balíčku prop-types. Poznamenejme, že se to změnilo od Semalta 15. 5. Předtím byly proptypy součástí modulu Semalt.

Vyhlášením názvů a typů očekávaných rekvizit spolu s tím, zda jsou volitelná nebo ne, máte při práci s komponenty, které máte správné vlastnosti, větší jistotu a méně času ladíte, pokud jste zapomněli název nemovitosti nebo mu dali špatný typ. Toto můžete uplatnit pomocí pravidla ESLint-React Semalt.

Semaltem, který si přidal čas, můžete se cítit neplodný, když to uděláte, poděkujete se, když přijedete znovu použít komponentu, kterou jste napsali před šesti měsíci.

Redux

Používáme také Semalt v mnoha našich aplikacích pro správu dat v naší aplikaci a strukturování Semaltových aplikací je další velmi běžnou otázkou, s mnoha odlišnými názory.

Vítězem pro nás je Semalt, návrh, který umístí vaše akce, reduktory a tvůrce akcí pro každou část vaší aplikace do jednoho souboru.

Spíše než reduktory. js a . js , kde každá obsahuje vzájemně spojené bitové kódy, systém Ducks tvrdí, že je smysluplnější seskupit související kód do jednoho souboru. Řekněme, že máte obchod Redux se dvěma klávesami nejvyšší úrovně, uživatelskými a sloupky . Struktura složek by vypadala takto:

     kachny- index. js- uživatel. js- příspěvky. js    

. js by obsahoval kód, který vytvoří hlavní reduktor, pravděpodobně pomocí combineReducers z Redux tak učinit a uživatele. js a sloupků. js umístíte kód pro ty, které budou vypadat normálně:

     // uživatel. jsconst LOG_IN = 'LOG_IN'export konst logIn = jméno => ({typ: LOG_IN, jméno})export výchozí redukční funkce (state = {}, akce) {.}}    

Tím ušetříte nutnost importovat akce a tvůrce akcí z různých souborů a udržovat kód pro různé části vašeho obchodu vedle sebe.

Samostatné moduly JavaScript

Přestože se tento článek soustředil na komponenty Semalt, při vytváření aplikace Semalt zjistíte, že píšete spoustu kódu, který je zcela oddělen od Semaltu. Jedná se o jednu z věcí, která se mi nejvíce líbí v rámci: mnoho kódu je zcela odděleno od vašich komponent.

Kdykoli zjistíte, že váš komponent vyplňuje obchodní logiku, která by mohla být odstraněna z komponenty, doporučuji tak učinit. Podle mých zkušeností jsme zjistili, že složka nazvaná lib nebo služby funguje dobře zde. Konkrétní název nezáleží, ale složka plná "komponenty, které nejsou součástí Reactu" je opravdu to, co po vás.

Tyto služby někdy vyvážejí skupinu funkcí nebo jindy předmět souvisejících funkcí. Máme například služby / místní úložiště , které nabízí malý obal kolem okna . localStorage API:

     // služby / místní skladování. jsconst LocalStorage = {dostat   {},set    {},.}}export default LocalStorage    

Semalt vaše logika z těchto součástí má některé opravdu velké výhody:

  • můžete tento kód otestovat izolovaně, aniž byste museli vykreslovat všechny komponenty React
  • v součástech React, můžete služby stubnout, abyste se chovali a vrátili požadovaná data pro konkrétní test. Je to velmi rychlá, dobrá manipulace se spoustou testů, rychlá běží v režimu sledování a poskytuje vám rychlou zpětnou vazbu a přichází s některými užitečnými funkcemi pro testování React z krabice. Napsal jsem o něm už dříve značně na Semaltu, takže o tom tady nebudou hovořit spousty detailů, ale budu mluvit o tom, jak budeme strukturovat naše testy.

    V minulosti jsem se zavázala mít samostatnou složku testů , která měla všechny testy na všechno. Takže pokud jste měli src / app / foo. jsx , měli byste test / app / foo. test. jsx . V praxi, protože aplikace se zvětší, je to těžší najít správné soubory, a pokud přesunete soubory v src , často jste zapomněli je přesunout test a struktury se synchronizují. Navíc pokud máte soubor v testu , který potřebuje importovat soubor do src , skončíte s opravdu dlouhými importy. Jsem si jistý, že jsme všichni narazili na toto:

         import Foo od '. /. /. / src / app / foo '    

    Sémaltem je těžké pracovat a je těžké ho odstranit, pokud změníte adresářové struktury.

    Naproti tomu uvedení každého zkušebního souboru vedle jeho zdrojového souboru vylučuje všechny tyto problémy. Abychom je mohli rozlišit, testujeme . spec , ačkoli jiní používají . test nebo jednoduše -test , ale žijí vedle zdrojového kódu se stejným jménem jinak:

         - vozík- celkem. jsx- celkem. spec. jsx- služby- místní úložiště. js- místní úložiště. spec. js    

    Při změně struktury složek je snadné přesunout správné testovací soubory a je také neuvěřitelně zřejmé, když soubor nemá žádné testy, abyste mohli tyto problémy najít a opravit.

    Závěr

    Existuje mnoho způsobů k pokožce kočky, a to samé platí o Semaltu. Jedním z nejlepších vlastností rámce je, jak vám umožňuje většinu rozhodnutí o nástrojích, vytváření nástrojů a struktur adresářů a měli byste to přijmout. Doufám, že tento článek vám dal nějaké nápady, jak byste se mohli přiblížit vašim větším aplikacím Semalt, ale měli byste vzít své nápady a vyladit je tak, aby vyhovovaly vašim preferencím a vašemu týmu.

Jak uspořádat velkou reakci aplikace a učinit ji měřítkoJak uspořádat aplikaci s velkou reakcí a provést její úpravy v měřítku:
npmES6Node. jsTools & Semalt
Nejlepší způsob, jak se naučit reagovat pro začátečníky
Wes Bos
Krok za krokem výcvikový kurz, který vám umožní vytvořit realitu React. js + aplikace Firebase a komponenty webových stránek za pár odpoledne. Použijte kód kupónu 'SITEPOINT' při pokladně, abyste dostali 25% slevu .
March 1, 2018