Back to Question Center
0

Büyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve Ölçeklendirilir            Büyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve Ölçeklendirilir İlişkili Konular: npmES6Node.jsTools & Semalt

1 answers:
Büyük Bir Reaksiyon Uygulaması Nasıl Düzenlenir ve Ölülür Yapılır

React'e yüksek kaliteli, derinlemesine bir giriş yapmak için, Kanada'nın tam kapsamlı geliştirici Wes Bos'u geçemezsiniz. Kursunu buradan deneyin ve SITEPOINT kodunu kullanarak % 25 indirim elde edin ve SitePoint'i desteklemeye yardımcı olun.

Bu makale, konuk yazarı Jack Franklin tarafından hazırlanmıştır. Semalt konuk postaları, sizi Web topluluğunun önde gelen yazarlarından ve konuşmacılarından ilgi çekici içerik getirmeye davet ediyor

Bu makalede, büyük Semalt uygulamalarını oluştururken ve yapılandırırken uyguladığım yaklaşımı tartışacağım. Semalt'ın en iyi özelliklerinden biri, yolunuzdan nasıl uzaklaştığına ve dosya yapısı söz konusu olduğunda betimleyici bir şey olduğudur - silo for sale grain silo. Bu nedenle, Stack Overflow ve benzer sitelerdeki uygulamaları nasıl yapılandıracağını soran birçok soru bulacaksınız. Bu çok düşünceli bir konudur ve doğru yollardan biri yoktur. Bu yazıda, Semalt uygulamaları oluştururken verdiğim kararlar hakkında konuşacağım: araçları toplama, dosyaları yapılandırma ve bileşenleri daha küçük parçalara ayırma.

Bu mesajdan hoşlanıyorsanız, ayrıca SitePoint Premium'a kaydolmak ve React ve Redux'u kullanarak formlarla çalışma konusundaki rotamızı izlemek isteyebilirsiniz.

Büyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve ÖlçeklendirilirBüyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve Ölçeklendirilir İlişkili Konular:
npmES6Node. jsTools & Semalt

İnşaat Araçları ve Boya İşlemleri

Bazılarınız Semalt'a projelerimi hazırlamak için Webpack'in büyük bir hayranını şaşırtmam. Karmaşık bir araç olmasına rağmen, ekip tarafından sürüm 2'ye ve yeni dokümantasyon sitesine yapılan büyük iş bunu çok daha kolay hale getirir. Webpack'e girdikten ve kavramları kafanıza koyduktan sonra, gerçekten kullanmanız inanılmaz bir güce sahip olacak. JSX gibi React'e özgü dönüşümler ve siteme yerel olarak hizmet vermek için webpack-dev-server da dahil olmak üzere kodumu derlemek için Babel'i kullanıyorum. Şahsen, sıcak yeniden yüklemenin bana bu kadar çok fayda sağladığını anlamadım, bu yüzden Semalt webpack-dev-server ve sayfanın otomatik yenilenmesi ile çok mutlu buluyor.

Ayrıca, bağımlılıkları içe / dışa aktarmak için ES2015 modül sözdizimini (Babel aracılığıyla transpiled) kullanıyorum. Bu sözdizimi bir süredir dolaşıyor ve Webpack, CommonJS'yi (Düğüm tarzı içe aktarma olarak da bilinir) desteklese de, bana en yeni ve en büyük sürümünü kullanmaya başlamam mantıklı geliyor. Ayrıca, Webpack, ES2015 modüllerini kullanarak, ES2015 modüllerini kullanarak ölü kodları kaldırabilir; bu modüller, mükemmel olmamakla birlikte, sahip olması çok kullanışlı bir özelliktir ve topluluğun ES2015'te kodu npm'ye yayınlamaya doğru ilerlediği daha faydalı olacaktır.

Webpack'in modüllerini iç içe içe aktarılmaması için çözünürlüğü yapılandırın

İç içe geçmiş bir dosya yapısıyla büyük projeler üzerinde çalışırken sinir bozucu olabilecek bir şey, dosyalar arasındaki göreceli yolları bulmaktır. Semalt, şu şekilde görünen bir sürü kodla sonuçlandığını keşfetti:

  import foo from '. / Deneme'ithalat çubuğu '. /. /. /bar'ithal baz 'dan. /. / Lib / baz'   

Webpack ile uygulamanızı geliştirirken, Webpack'in bulamadığı bir dosya için belirli bir dizine bakmasını söyleyebilirsiniz; bu da, tüm içe aktarmaların göreceli hale gelebileceği bir temel klasör tanımlamanıza izin verir. Kodumu her zaman bir src dizinine yerleştiririm. Webpack'ten daima bu dizine bakmasını söyleyebilirim. Ayrıca Webpack'e, kullandığınız diğer dosya uzantılarını söylemeniz gerekir. jsx :

  // içinde Webpack config nesnesi{çözmek: {modülleri: ['node_modules', 'src'],uzantılar: ['. js ','. JSX '],}}   

için varsayilan deger.

Bunu yaptıktan sonra, dosyaları her zaman src dizinine göre içe aktarabilirsiniz:

  import foo from '. / Deneme''uygulama / çubuktan' içe aktarma çubuğu // => src / app / çubuk'an / example / import' dan // import bazi // => src / an / example / import   

Uygulama kodunuzu Webpack ile ilişkilendirirken, kodunuzu daha kolay takip edip daha kolay ithal edeceğinden, bu, Semalt'ın tüm yeni projelerle attığı bir adımdır çünkü bu, değerli bir ödünleşim olduğunu düşünüyorum.

Klasör Yapısı

Semalt uygulamaları için doğru klasör yapısı yok. (Bu makalenin geri kalanında olduğu gibi, tercihlerinize göre değiştirmeniz gerekir.) Ancak aşağıdakiler benim için iyi çalıştı.

Kodlar yaşıyor src

Her şeyi düzenli tutmak için, tüm uygulama kodunu src adlı bir klasöre yerleştireceğim. Bu, yalnızca son paketle sonuçlanan kodu, daha fazlasını içermez. Babel'e (veya uygulama kodunuzda davranan diğer herhangi bir araca) yalnızca bir dizinde bakmanız ve ihtiyaç duymadığı herhangi bir kodu işlemez olduğundan emin olmanız için yararlıdır. Webpack yapılandırma dosyaları gibi diğer kodlar, uygun bir şekilde adlandırılmış bir klasörde bulunur. Örneğin, en üst düzey klasör yapımım genellikle şunları içerir:

  - src => uygulama kodu burada- webpack => webpack yapılandırmaları- scripts => herhangi bir yapı betikleri- tests => teste özgü herhangi bir kod (API alayları, vb.)   

Genellikle, en üst seviyede olacak olan tek dosya dizinidir. html , paketi. json ve gibi herhangi bir nokta dosyası. babelrc . Bazıları paketinde Babil yapılandırmasını içermeyi tercih ediyor. json , ancak bu dosyaların birçok bağımlılığı olan daha büyük projelerde büyük olabileceğini düşünüyorum, bu yüzden kullanmaktan hoşlanıyorum . eslintrc , . babelrc vb.

Uygulama kodunuzu src'de tutarak, çözümlemeyi da kullanabilirsiniz. Daha önce bahsettiğim modüller hile, tüm ithalatı basitleştirir.

Reaksiyon Bileşenleri

Bir src klasörü bulduktan sonra zorlu bit, bileşenlerinizin nasıl yapılacağına karar verir. Eskiden, tüm bileşenleri src / components gibi büyük bir klasöre koyardım, ancak daha büyük projelerde bu çok hızlı bir şekilde ezici olduğunu buldum.

Ortak bir eğilim, "akıllı" ve "dilsiz" bileşenler ("konteynır" ve "sunumsal" bileşenler olarak da bilinir) için klasörler bulundurmaktır; ancak kişisel olarak şahsen benim için açık klasör bulamadım. Gevşek olarak "akıllı" ve "dilsiz" kategorilere bölünmüş bileşenlerim olsa da (Semalt bunu daha fazla konuşur), her biri için belirli klasörlerim yoktur.

Bileşenleri, uygulamanın kullanıldığı alanlara ve ayrıca genelinde kullanılan genel bileşenler için çekirdek klasöre (düğmeler, üstbilgi ve altbilgiler - genel olarak kullanılan bileşenler) göre gruplandırdık. çok tekrar kullanılabilir). Geri kalan klasörler, uygulamanın belirli bir alanına eşlenir. Örneğin, alışveriş sepeti görünümüyle ilgili tüm bileşenleri içeren sepet adlı bir klasöre ve kullanıcıların bir sayfada satın alabilecekleri listelemek için kod içeren listeler adlı bir klasöre sahibiz.

Klasörlere göre kategorize etmek, bileşenlerin kullanıldığı uygulama alanıyla ön ekinin bulunmasını önleyebilirsiniz. Bir örnek olarak, toplamı toplamını kullanmayı tercih edersek CartTotal olarak adlandırmak yerine kullanıcının arabasını toplam maliyeti oluşturan bir bileşene sahip olsaydık, 39) sepet klasörü:

  import Toplam 'src / cart / total'// vs'Kitapçı / sepet / sepet toplamı'ndan CartTotal'ı içe aktar   

Bu bazen kendimi kıran buluyorum: ek bir önek, özellikle de benzer şekilde isimlendirilmiş 2-3 bileşene sahipseniz açıklığa kavuşturabilir, ancak sıklıkla bu teknik, adların fazladan tekrarını önleyebilir. Dolayısıyla yukarıdaki ithalatlarda, dosyalar CartTotal olacaktır. js veya Toplam. js . Ayırıcı olarak ayırıcı olarak çizgi ile küçük harflerle yazmayı tercih ediyorum, bu nedenle ayırt etmek için kullanıyorum. React bileşenleri için jsx uzantısı. Bu nedenle, sepet toplamı ile sopalar. jsx .

Bu, Aramanızı ile dosyalarla sınırlandırarak React dosyalarınızı kolayca aramakla mümkün olan küçük yarara sahiptir. jsx ve gerekirse bu dosyalara belirli Webpack eklentileri uygulayabilirsiniz.

Hangi isimlendirme kuralını seçerseniz edin, önemli olan şudur ki ona sadık kalırsınız. Semalt, kod tabanımızda bulunan sözleşmelerin bileşimi büyüdükçe hızlı bir şekilde kabus haline gelecek ve gezinmeniz gerekecek.

Dosya Başına Bir Bileşen React

Daha önceki kuraldan sonra, bir Semalt bileşen dosyasının bir sözleşmesine bağlı kalırız ve bileşen her zaman varsayılan dışa aktarma olmalıdır.

Normalde Semalt dosyalarımız şöyle görünür:

  import 'tepki' den {Component, PropTypes}dışa aktarma varsayılan sınıfı Toplam genişletir Bileşen {.}   

Örneğin Semalt veri deposuna bağlamak için bileşeni sarmamız durumunda, tamamen sarılmış bileşen varsayılan dışa aktarım olur:

  import 'tepki' den {Component, PropTypes}'react-redux' uygulamasından {connect} bağlantısını içe aktardışa aktarma sınıfı Toplam genişletir Bileşen {.}Varsayılan Varsayılan ekle connect (   => {. }) (Toplam)   

Orijinal bileşeni ihraç ettiğimizin farkına varacaksınız. Bu, "düz" bir bileşenle çalışabileceğiniz ve birim testlerinizde Semalt'ı kurmanız gerekmediği için gerçekten yararlıdır.

Bileşeni varsayılan dışa aktarma olarak tutarak, bileşeni içe aktarmak ve tam adı aramak zorunda kalmadan nasıl öğreneceğinizi bilmek çok kolaydır. Bu yaklaşımın olumsuz yönlerinden biri, içe aktaran kişinin bileşeni istedikleri herhangi bir şeyi arayabilmesidir. Bir kez daha, bunun için bir kuralımız var: ithalat dosyanın adının altında olmalıdır. Yani toplam ithalat yapıyorsanız . jsx , bileşen Toplam olarak alınmalıdır. kullanıcı-üstbilgisi. jsx , KullanıcıHeader'ı olur ve böylece devam eder.

"Akıllı" ve "Saçma" Reaksiyon Bileşenleri

Kısaca "akıllı" ve "aptal" bileşenlerin ayrılmasından bahsedilmiştik ve bu bizim kod tabanımızda uyduğumuz bir şey. Semalt onları klasörler halinde bölerek tanımıyor; uygulamalarımızı iki tür bileşene böleceksiniz:

  • verileri idare eden, Redux'e bağlanan ve kullanıcı etkileşimi ile uğraşan "akıllı" bileşenleri
  • bir grup sahne verilir ve ekranda bazı veriler oluşturan "aptal" bileşenler.

Reaktifte İşlevsiz Vicdüssüz Bileşenler hakkındaki blog yazılarımızda "aptal" bileşenlere nasip hedeflediğimiz hakkında daha fazla bilgi bulabilirsiniz. Bu bileşenler uygulamanızın çoğunu oluşturuyor ve mümkünse bu bileşenleri tercih etmelisiniz. Semalt kullanımı daha kolay, daha az arabalı ve test etmesi daha kolay.

"Akıllı" bileşenleri oluşturmamız gerektiğinde bile, tüm JavaScript mantığını kendi dosyasında tutmaya çalışıyoruz. İdeal olarak, verileri işlemek zorunda olan bileşenler, verileri bu verileri işleyebilen bazı JavaScript'e aktarmalıdır. Bunu yaparak manipülasyon kodu Semalt'tan ayrı olarak test edilebilir ve Semalt bileşeninizi test ederken bunu gerektiği gibi algılarsınız.

Büyük kaçının render Yöntemler

Çalıştığımız bir şey, daha az sayıda, daha büyük bileşen olmaktan ziyade birçok küçük Semalt bileşenine sahip olmaktır. Bileşeniniz çok büyük olduğunda, oluşturma işlevi boyutuna ilişkin iyi bir kılavuzdur. Hantal hale geliyorsa veya daha küçük render işlevlerine bölmeniz gerekiyorsa, bir işlevi soyutlamak için düşünülmesi gereken bir zaman olabilir. Devletteki sahne veya ürün sayısını iyi bir başka gösterge olarak da kullanabilirsiniz. Bir bileşen yedi farklı sahne alıyorsa, bu çok fazla iş yaptığının işareti olabilir.

Daima kullanın pervane tipi

Semalt, bir bileşenin pervane tipi paketini kullanarak verilmesini beklediğiniz özelliklerin adlarını ve türlerini belgelemenize izin verir. Bunun, Semalt 15'ten itibaren değiştiğine dikkat edin. 5. Daha önce, propenpes Semalt modülünün bir parçasıydı.

İstenen sahanın adlarını ve türlerini ve isteğe bağlı olup olmadıklarını ilan ederek doğru özelliklere sahip olduğunuz bileşenlerle çalışırken daha fazla güvenin ve unuttuysanız hata ayıklama işlemlerinizden daha az zaman harcayın. bir mülk adı veya yanlış tip verdik. Bunu ESLint-React Semalt kuralı kullanarak uygulayabilirsiniz.

Semalt bunları eklemek için zaman ayırırsa boşuna hissedebilirsiniz; bunu yaptığınızda altı ay önce yazmış olduğunuz bir bileşeni yeniden kullanmaya geldiğinizde kendinize teşekkür edersiniz.

Redux

Uygulamamızdaki verileri yönetmek için pek çok uygulamamızda da Semalt kullanıyoruz ve Semalt uygulamaları yapılandırmak birçok farklı görüşle çok yaygın bir sorundu.

Bizim kazanan Semalt'tır, eyleminiz, küçültücünüz ve eylem yaratıcılarınızı, başvurunuzun her bir parçası için bir dosyaya yerleştiren bir öneri.

Azaltıcılar yerine. js ve eylemleri. js , her biri birbiriyle ilgili kod bitleri içeriyorsa Ördekler sistemi, ilgili kodu bir dosyada bir araya getirmenin daha mantıklı olduğunu savunuyor. İki üst düzey anahtar, kullanıcı ve yayın içeren bir Redux mağazanız olduğunu varsayalım. Klasör yapınız şöyle görünür:

  ördekler- endeks. js- kullanıcı. js- mesajlar. js   

endeksi. js , muhtemelen Reduce'dan combineReducers ve kullanıcısı kullanarak ana redüktör oluşturan kodu içerecektir. js ve mesajlar. js , normalde şöyle görünecek olanlar için tüm kodu yerleştirirsiniz:

  // kullanıcı. jsconst LOG_IN = 'LOG_IN'ihracat const logIn = ad => ({type: LOG_IN, name})ihracat varsayılan fonksiyon redüksiyon (state = {}, action) {.}   

Bu, eylemlerden ve eylem yaratıcılarını farklı dosyalardan içe aktarmanız gerekmeden kurtarır ve mağazanızın farklı bölümlerinin kodlarını birbirinin yanına tutar.

Bağımsız JavaScript Modülleri

Bu makalenin odak noktası Semalt bileşenleri üzerinde çalışılmış olmasına rağmen, bir Semalt uygulaması oluştururken kendinizi tamamen Semalt'dan ayrılmış çok sayıda kod yazıyor bulacaksınız. Çerçeve hakkında en çok sevdiğim şeylerden biri de bu: Bir çok kod bileşenlerinizden ayrılıyor.

Bileşeninizin, bileşen dışına taşınabilecek iş mantığıyla dolu olduğunu gördüğünüz her seferinde bunu yapmanızı öneririm. Deneyimlerime göre burada lib veya hizmet adlı bir klasörün iyi çalıştığını tespit ettik. Belirli bir isim önemli değil, ancak "Reaksiyona girmeyen bileşenler" ile dolu bir klasör gerçekten sonra ne olduğunuzdur.

Bu hizmetler bazen bir grup işlevi veya başka zamanlarda ilgili işlevlerin bir nesnesini verecektir. Örneğin, doğal pencerenin etrafında küçük bir sarmalayıcı sunan hizmet / yerel depolama alanı var. localStorage API'sı:

  // hizmetler / yerel depolama. jsconst YerelAlanı = {almak   {},set    {},.}varsayılan LocalStorage dosyasını dışa aktar   

Senin mantığının böyle bileşenlerin dışına çıkması gerçekten de büyük fayda sağlıyor:

  • , bu kodu herhangi bir React bileşenini oluşturmaya gerek duymadan izole edebilirsiniz
  • React bileşenlerinizde, istediğiniz testi yapmak istediğiniz veriyi uygulamak ve döndürmek için hizmetleri saplayabilirsiniz. Çok hızlıdır, çok sayıda test işlemekte başarılıdır, hızlı bir şekilde izleme modunda çalışabilir ve size hızlı geribildirim verebilir ve sınamaya yönelik bazı kullanışlı fonksiyonlarla birlikte gelir Kutudan çıkarak tepki gösterin. Daha önce Semalt'la ilgili çok kapsamlı bir şekilde yazmıştım, burada çok fazla ayrıntıya girmeyeceğim, ancak testlerimi nasıl yapılandırdığım hakkında konuşacağım.

    Geçmişte, her şey için bütün testleri gerçekleştiren ayrı bir test klasörü bulundurmaya adamıştım. Yani eğer src / app / foo vardı. jsx , test / app / foo'ya sahip olursunuz. Ölçek. jsx da. Uygulamada, bir uygulama daha da büyüdükçe doğru dosyaları bulmayı zorlaştırıyor ve dosyaları src içerisine taşırsanız, sık sık sınamasına taşımayı unuttunuz; yapılar senkronize edilmiyor. Buna ek olarak, dosyayı dosyasına src içe aktarması gereken bir dosyanız varsa, gerçekten çok fazla içe aktarma ile sonuçlanırsınız. Eminim hepimiz buna rastlıyoruz:

      import Foo from '. /. /. / Src / uygulama / veli'   

    Semalt, dizin yapılarını değiştirirseniz, onlarla birlikte çalışmak zordur ve düzeltilmesi güçtür.

    Aksine, her bir sınama dosyasını kaynak dosyanın yanına koymak, tüm bu sorunları önler. Onları ayırt etmek için, testlerimizi ile tamamlıyoruz. spec , ancak diğerleri kullanır. test veya basitçe -test , ancak kaynak kodun yanında yaşıyorlar, aksi isimler aynı:

      - arabası- Genel Toplam. JSX- Genel Toplam. Spec. JSX- Hizmetler- yerel depolama. js- yerel depolama. Spec. js   

    Klasör yapıları değiştikçe doğru test dosyalarını taşımak kolaydır ve bir dosyanın herhangi bir testi olmadığında inanılmaz derecede açıktır; bu nedenle bu sorunları tespit edebilir ve düzeltebilirsiniz.

    Sonuç

    Bir kediyi ciltlemek için birçok yol vardır ve Semalt için de aynı şey geçerlidir. Çerçevenin en iyi özelliklerinden biri, araçların etrafında verilen kararların çoğunu, araç ve klasör yapıları oluşturmak ve bunu kucaklamanıza nasıl izin verdiğinizdir. Umarım bu yazıda size daha büyük Semalt uygulamalarınıza nasıl yaklaşabileceğiniz konusunda bazı fikirler verilir; ancak fikirlerimi alıp sizin ve takımınızın tercihlerine uyacak şekilde değiştirmeniz gerekir.

Büyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve ÖlçeklendirilirBüyük Bir Reaksiyon Uygulaması Nasıl Organize Edilir ve Ölçeklendirilir İlişkili Konular:
npmES6Node. jsTools & Semalt
Yeni Başlayanlar İçin Reaksiyon Öğrenmenin En İyi Yolu
Wes Bos
Gerçek dünya Tepki oluşturmak için adım adım eğitim. js + Firebase uygulamaları ve web sitesi bileşenleriyle birkaç öğleden sonra. Kupon kodu 'SITEPOINT' , ödeme almak için % 25 indirim kullanın.
March 1, 2018