scandipwa / performance
N/A
Requires
- magento/framework: *
- magento/module-catalog: *
- magento/module-catalog-graph-ql: ^100.3
- magento/module-catalog-inventory: *
- magento/module-eav: *
- magento/module-inventory-api: *
- magento/module-inventory-catalog: *
- magento/module-store: *
- magento/module-swatches: *
README
增强产品加载性能。
如何使用
当向产品接口添加新的解析字段时,请确保
- 了解何时可以加载它?如果你可以在集合上加载它,请创建一个处理器,并使用DI将其注册到
CompositeCollectionProcessor
中。 - 如果需要格式化数据,或者不能使用集合请求数据,请使用
DataPostProcessor
。在那里注册处理器,并返回一个产品(键 => 值数组)处理函数(请参阅实现中的示例)。 - 如果数据在集合加载之前无法请求,但在加载后可以附加(使用集合本身) - 请使用
CollectionPostProcessor
,以与DataPostProcessor
相同的方式在那里注册处理器。
相关模块
初始动机
情况一:数据无法与产品集合一起请求(只有加载后才能进行)
- 在集合加载后,检查每个附加信息类别中的模式(使用 $info)中请求的请求字段
- 如果请求了附加信息,则助手一次请求并返回所有产品的信息
- 遍历所有加载的产品,将辅助器的数据应用于每个特定产品
情况二:可以在加载之前请求数据(字段可以在集合加载时解析)
这个由M2(默认)处理 - 我们将只忽略这个。
- 集合处理器遍历集合,将请求的字段添加到集合中
- 如果字段需要额外的工作,则在集合加载后进行格式化
- 如果字段不需要格式化,它将自动输出到结果数据数组中
情况三:数据可以在集合加载之后请求数据,但基于集合数据,而不是产品数组。
潜在问题
a. 代码在每个集合加载的5个地方都进行了复制[需要抽象] b. 数据结构通常不同,检查字段是否被请求很困难
- 可配置变体:
variants/product
- 默认:
products/items
- 购物车,愿望单:
items/product
- 订单:
order_products
已实现的内容
GraphQL模式读取特性 [新]
类名: ScandiPWA\Performance\Model\Resolver\ResolveInfoFieldsTrait
动机: 允许解析GraphQL info,可以从中提取字段。默认返回产品字段数组,可以通过重写getFieldContent
方法更改产品字段的解析。
用于:
ScandiPWA\Performance\Model\Resolver\Products\DataPostProcessor\Images
ScandiPWA\Performance\Model\Resolver\Products\DataPostProcessor\Stocks
ScandiPWA\Performance\Model\Resolver\Products\DataPostProcessor\Attributes
ScandiPWA\CatalogGraphQl\Model\Resolver\ConfigurableVariant
ScandiPWA\CatalogGraphQl\Model\Resolver\Products\Query\Filter
ScandiPWA\WishlistGraphQl\Model\Resolver\WishlistItemsResolver
ScandiPWA\QuoteGraphQl\Model\Resolver\ProductsResolver
集合后处理器 [新]
类名: ScandiPWA\Performance\Model\Resolver\Products\CollectionPostProcessor
动机: 允许对集合进行后处理,用于数据应用在加载集合之上时的场景 - 媒体画廊数据,产品选项数据等。
用于:
ScandiPWA\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product
ScandiPWA\CatalogGraphQl\Model\Variant\Collection
数据后处理器 [新增]
类名: ScandiPWA\Performance\Model\Resolver\Products\DataPostProcessor
动机: 允许对加载的产品集合数据进行后处理。接受产品数组、解析信息,并可以高效处理产品数据。旨在防止产品子字段在循环中请求数据。属性、图像、库存信息从产品移动到这个解析器。
用于:
ScandiPWA\WishlistGraphQl\Model\Resolver\WishlistItemsResolver
ScandiPWA\QuoteGraphQl\Model\Resolver\GetCartForCustomer
ScandiPWA\CatalogGraphQl\Model\Resolver\Products\Query\Filter
ScandiPWA\QuoteGraphQl\Model\Resolver\ProductsResolver
ScandiPWA\CatalogGraphQl\Model\Resolver\ConfigurableVariant
产品数据提供者 [修改]
类名: ScandiPWA\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product
动机: 之前集合后处理器在这里实现(硬编码)。由于它被移动到单独的类中,逻辑不得不从原始位置移除。
用于:
ScandiPWA\QuoteGraphQl\Model\Resolver\ProductsResolver
ScandiPWA\CatalogGraphQl\Model\Resolver\Products\Query\Filter
产品集合处理器 [修改]
类名: Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CompositeCollectionProcessor
动机: M2 实现是好的,只是增加了额外的处理器。
ScandiPWA\CatalogGraphQl\Model\Resolver\Products\DataProvider\Product\CollectionProcessor\ImagesProcessor