public/ some-image.jpg pages/ index.tsx components/ Heading.tsx Logo.tsx Layout.tsx BoxContainer.tsx Footer.tsx问题所在
public/ some-image.jpg pages/ index.tsx components/ layout/ Layout.tsx Heading.tsx Footer.tsx common/ Heading.tsx BoxContainer.tsx问题#1:很难扩展好名字
public/ some-image.jpg pages/ index.tsx components/ Layout/ components/ Heading/ components/ Logo.tsx Menu.tsx Heading.tsx CopyrightIcon.tsx Footer.tsx Layout.tsx BoxContainer.tsx让我们展示Footer.tsx的内容,并使用上面列出的规则作为示例:
// components/Layout/components/Footer.tsx // Can import upwards, except its own parent import { BoxContainer } from '../../BoxContainer.tsx'; // Can import siblings import { CopyrightIcon } from './CopyrightIcon.tsx'; // WRONG: Cannot import sibling's components // import { Menu } from './Heading/components/Menu.tsx'; // WRONG: Cannot import its parent // import { Layout } from '../Layout.tsx'; export const Footer = () => ( <BoxContainer> <CopyrightIcon /> <p>All rights reserved, etc.</p> </BoxContainer> )优点#1:明显的子组件关系
components/ Layout/ components/ Heading/ components/ - Logo.tsx Menu.tsx Heading.tsx + Logo.tsx CopyrightIcon.tsx Footer.tsx Layout.tsx BoxContainer.tsx在上面的例子中,如果Logo.tsx对于更多的组件变得必要,而不仅仅是Menu.tsx,我们可以简单地将其上移一级。对于BoxContainer.tsx来说,它可能没有足够的可重用性(或“通用性”),但在Layout.tsx组件的上下文中它是足够可重用的。
额外的好处:从组件中提取代码到单独的文件中,而无需考虑名称
components/ Layout/ components/ Heading/ components/ Logo.tsx Menu.tsx Heading.tsx CopyrightIcon.tsx + Footer.utils.tsx Footer.tsx Layout.tsx BoxContainer.tsx这样你就不必去想一个很合适的名字,如emailFormatters.ts或非常模糊的东西,如helpers.ts。避免命名带来的认知负担,这些实用程序属于Footer.tsx,可以由Footer.tsx及其内部组件使用(再次向上导入)。
Flat Structure | Component Trees ------------------------------------+--------------------------------------------------- pages/ | pages/ index.tsx | index.tsx shop.tsx | shop.tsx product/ | product/ [slug].tsx | [slug].tsx cart.tsx | cart.tsx checkout.tsx | checkout.tsx about.tsx | about.tsx contact.tsx | contact.tsx login.tsx | login.tsx register.tsx | register.tsx user/ | user/ dashboard.tsx | dashboard.tsx orders.tsx | orders.tsx settings.tsx | settings.tsx | components/ | components/ layout/ | Layout/ Layout.tsx | components/ Header.tsx | Header/ Footer.tsx | components/ Sidebar.tsx | Logo.tsx Breadcrumb.tsx | NavigationMenu.tsx common/ | SearchBar.tsx Button.tsx | UserIcon.tsx Input.tsx | CartIcon.tsx Modal.tsx | Header.tsx Spinner.tsx | Footer/ Alert.tsx | components/ product/ | SocialMediaIcons.tsx ProductCard.tsx | CopyrightInfo.tsx ProductDetails.tsx | Footer.tsx ProductImage.tsx | Layout.tsx ProductTitle.tsx | BoxContainer.tsx ProductPrice.tsx | Button.tsx AddToCartButton.tsx | Input.tsx filters/ | Modal.tsx SearchFilter.tsx | Spinner.tsx SortFilter.tsx | Alert.tsx cart/ | ProductCard/ Cart.tsx | components/ CartItem.tsx | ProductImage.tsx CartSummary.tsx | ProductTitle.tsx checkout/ | ProductPrice.tsx CheckoutForm.tsx | AddToCartButton.tsx PaymentOptions.tsx | ProductCard.tsx OrderSummary.tsx | ProductDetails/ user/ | components/ UserProfile.tsx | ProductSpecifications.tsx UserOrders.tsx | ProductReviews.tsx LoginBox.tsx | ProductReviewForm.tsx RegisterBox.tsx | ProductDetails.tsx about/ | SearchFilter.tsx AboutContent.tsx | SortFilter.tsx contact/ | Cart/ ContactForm.tsx | components/ review/ | CartItemList.tsx ProductReview.tsx | CartItem.tsx ProductReviewForm.tsx | CartSummary.tsx address/ | Cart.tsx ShippingAddress.tsx | CheckoutForm/ BillingAddress.tsx | components/ productInfo/ | PaymentDetails.tsx ProductSpecifications.tsx | BillingAddress.tsx cartInfo/ | ShippingAddress.tsx CartItemList.tsx | CheckoutForm.tsx userDetail/ | PaymentOptions.tsx UserSettings.tsx | OrderSummary.tsx icons/ | UserProfile/ Logo.tsx | components/ SocialMediaIcons.tsx | UserOrders.tsx CartIcon.tsx | UserSettings.tsx UserIcon.tsx | UserProfile.tsx | LoginBox.tsx | RegisterBox.tsx | AboutContent.tsx | ContactForm.tsx这是一个没有任何测试文件、实用程序文件或类似文件的示例。对于组件树结构,您可以在组件目录中添加后缀为的实用程序或测试文件。至于平面结构,你可能需要创建一个单独的 utils 目录来理解已经相当复杂的认知负荷。