React PropTypes vs. Flow


101

PropTypes ve Flow benzer şeyleri kapsar ancak farklı yaklaşımlar kullanır. PropTypes, çalışma zamanı sırasında size uyarılar verebilir ve bu, bir sunucudan vb. Gelen hatalı biçimlendirilmiş yanıtları hızlı bir şekilde bulmanıza yardımcı olabilir. Ancak, Flow gelecek gibi görünüyor ve jenerikler gibi kavramlarla çok esnek bir çözüm. Ayrıca Nuclide tarafından sunulan otomatik tamamlama, Flow için büyük bir artıdır.

Şimdi sorum, yeni bir projeye başlarken gitmenin en iyi yolu hangisi? Veya hem Flow hem de PropTypes kullanmak iyi bir çözüm olabilir mi? Her ikisini de kullanmanın sorunu, çok sayıda yinelenen kod yazmanızdır. Bu yazdığım bir müzik çalar uygulamasına bir örnek:

export const PlaylistPropType = PropTypes.shape({
    next: ItemPropTypes,
    current: ItemPropTypes,
    history: PropTypes.arrayOf(ItemPropTypes).isRequired
});

export type Playlist = {
    next: Item,
    current: Item,
    history: Array<Item>
};

Her iki tanım da temelde aynı bilgileri içerir ve veri türü değiştirildiğinde her iki tanımın da güncellenmesi gerekir.

Tür bildirimlerini PropTypes'e dönüştürmek için bu babel eklentisini buldum, bu bir çözüm olabilir.


1
Eğer Akış başlamak istiyorsanız bu yazı deneyin: robinwieruch.de/the-soundcloud-client-in-react-redux-flow
Robin Wieruch

1
Deneyimlere göre, soruda bahsedilen eklentiyi kullanmak çok da iyi bir fikir değil. Tüm bileşen türlerini desteklemez, v0.39 itibarıyla React Native ile tamamen kırılmıştır ve genellikle çok kırılgandır. Deponun sahibi bu konulara oldukça hızlı yanıt verirdi, ancak görünüşe göre ilgisini kaybetti ve artık onu sürdürmek için güvenilemez.
Tomty

Flow ve tcomb kullanarak statik ve çalışma zamanı türü denetimi için Babel eklentisi aracılığıyla tcomb'u deneyin .
comerc

Yanıtlar:


81

Bu soruyu sorduktan bir yıl sonra, bu sorunla ilgili deneyimlerime dair bir güncelleme yapmak istedim.

Flow çok geliştikçe kod tabanımı onunla yazmaya başladım ve yeni PropType tanımları eklemedim. Şimdiye kadar, bunun iyi bir yol olduğunu düşünüyorum, çünkü yukarıda da belirtildiği gibi, sadece props yazmanıza değil, kodunuzun diğer kısımlarını da yazmanıza izin veriyor. Bu, örneğin, kullanıcı tarafından değiştirilebilen, eyalette sahne donanımınızın bir kopyasına sahip olduğunuzda, gerçekten kullanışlıdır. Ayrıca, IDE'lerde otomatik tamamlama harika bir kazançtır.

Bir veya diğer yöndeki otomatik dönüştürücüler gerçekten kalkmadı. Bu nedenle, yeni projeler için, şimdi gerçekten PropTypes üzerinden Flow kullanmanızı tavsiye ederim (yazmayı iki kez yapmak istemiyorsanız).


hangi IDE'yi kullanıyorsunuz? Web fırtınası mı?
sergey.tyan

3
Atom'u ide-flowtype eklentisiyle kullanıyorum.
danielbuechele

childContextTypes kullanırken hala propTypes'e ihtiyacınız var - stackoverflow.com/questions/42395113/…
Shyam

3
yeni bağlam API'si nedeniyle alt bağlamları işlerken artık propTypes kullanmaya gerek yoktur: reactjs.org/docs/context.html
SteveB

35

Her ikisinin de çok geniş tip kontrol alanına ait olması dışında, ikisi arasında pek benzerlik yoktur.

Flow, dilin bir üst kümesini kullanan ve tüm kodunuza tür ek açıklamaları eklemenize olanak tanıyan statik bir analiz aracıdır . ve derleme zamanında tüm bir hata sınıfını yakalamanıza .

PropTypes, React'e eklenmiş temel bir tür denetleyicidir. Belirli bir bileşene aktarılan sahne türlerinden başka hiçbir şeyi kontrol edemez.

Tüm projeniz için daha esnek yazım denetimi istiyorsanız, Flow / TypeScript uygun seçeneklerdir. Bileşenlere yalnızca açıklamalı türleri geçirdiğiniz sürece, PropTypes'e ihtiyacınız olmayacak.

Sadece pervane türlerini kontrol etmek istiyorsanız, kod tabanınızın geri kalanını fazla karmaşık hale getirmeyin ve daha basit seçeneği tercih edin.


11
Evet, nasıl çalıştıkları açısından çok farklılar. Ancak kullanım amacının çok benzer olduğunu düşünüyorum. Ancak dikkat çektiğiniz bir şey iyi bir nokta: Flow, kod tabanınızın daha fazlasını kapsayalım, oysa PropTypes'i kullanırken sahne donanımı ile sınırlısınız.
danielbuechele

2
Eğer kullanım amacı sadece çok benzer , sadece pervane tipleri kontrol etmek Akışı kullanın. Biri temelde bir dil, diğeri ise zar zor bir kütüphane.
Dan Prince

@DanPrince ile tamamen katılıyorum. Ve bunun, sunucudan hatalı biçimlendirilmiş yanıtları PropTypes ile kontrol etmenin iyi bir fikir olduğunu düşünmüyorum. Bunun için manuel kontrollerinizin olması ve sadece konsola bir uyarı atmak yerine kullanıcı arayüzünüzün doğru şekilde yanıt vermesi (örneğin bir uyarı mesajı görüntüler) daha iyidir.
Yan Takushevich

6
@YanTakushevich İkisini de yapmanız gerekiyor. PropTypes üretim sırasında yine de devre dışı bırakılmalıdır, bu nedenle kullanıcılarınızın iyi bir deneyim yaşadığından emin olmak için her zaman manuel kontrollere ihtiyacınız vardır. Bununla birlikte PropTypes, geliştirme sırasında çalışma zamanı uyarıları için çok yararlı olabilir. Hiçbir şeyi unutmadığınızdan emin olmak için güzel bir güvenlik ağı.
ndbroadbent

27

Burada cevapsız nokta olduğunu düşünüyoruz Akış bir olan statik denetleyicisi ise PropTypes bir olan çalışma zamanı denetleyicisi , araçlar

  • Akış , kodlama sırasında yukarı akıştaki hataları yakalayabilir: Teorik olarak bilmeyeceğiniz bazı hataları gözden kaçırabilir (örneğin, projenizde akışı yeterince uygulamadıysanız veya derin iç içe nesneler olması durumunda)
  • PropTypes onları test sırasında yakalar, böylece asla kaçırmaz

1
işte özel bir babel eklentisi zaten npmjs.com/package/babel-plugin-flow-react-proptypes
amankkg

15

Yalnızca Flow kullanarak sahne türlerini bildirmeyi deneyin. Dize yerine sayı gibi yanlış bir tür belirtin. Bunun, Akışa duyarlı düzenleyicinizdeki bileşeni kullanan kodda işaretleneceğini göreceksiniz. Ancak bu, herhangi bir testin başarısız olmasına neden olmaz ve uygulamanız çalışmaya devam eder.

Şimdi yanlış bir türle React PropTypes kullanımını ekleyin. Bu, uygulama çalıştırıldığında testlerin başarısız olmasına ve tarayıcı konsolunda işaretlenmesine neden OLACAKTIR.

Buna dayanarak, Flow kullanılsa bile PropTypes'in de belirtilmesi gerektiği görülmektedir.


Testlerin nasıl yapıldığına bağlıdır, eğer jest'in anlık görüntü testini kullanırsanız, testler geçersiz özellik değerleriyle başarısız olacaktır.
Alexandre Borela

3
IDE'nizdeki hatanın avantajı, testleri çalıştırmadan hemen önce görmenizdir.
Tom Fenech

Kemer ve jartiyer yaklaşımı için artı 1.
David A. Gray
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.