用途:整理 Drupal Views 的构建与性能优化经验,并判断何时该用 View、自定义控制器或 JSON:API。资料基于大型 Drupal 11 生产代码库(59 个视图、约 250 个显示)验证,强调以冷渲染的真实 SQL 查询数衡量,而非本地耗时。
主要能力与要点: 缓存插件按新鲜度选择 Tag、Time 或 None;Time 在标签失效基础上加 TTL,不能阻止标签频繁失效。暴露过滤器会引入 url.query_args 缓存上下文,每个过滤/排序/分页组合都是独立缓存条目,应减少暴露项。完整分页器每次渲染执行单独 COUNT 查询,可用 some 或 mini 分页器规避。行插件中 fields 最省,entity:<type> 会加载完整实体。关系会加 JOIN,且实体基表关系会通过 Sql::loadEntities() 预加载完整关联实体;required 只决定 JOIN 类型,不能阻止预加载,需移除关系并设置 defaults.relationships=false。避免意外的 DISTINCT/GROUP BY,保留渲染缓存元数据,rest_export/data_export 可免费提供列表端点,视图配置应逐个导出。
使用方式:用 drush 查看配置与真实 SQL,例如 ddev drush ev '$v=\Drupal\views\Views::getView("ID");$v->setDisplay("DISP");$v->build();print (string)$v->build_info["query"];'。可用 execute() 与完整渲染分阶段计数、getEntityTableInfo() 探针定位预加载。修复需同时移除关系并覆盖 defaults.relationships=false,且模板改用批量投影;若过滤器/排序/参数引用该关系,需改写为非实体表并验证结果集一致。
适用场景:成熟 Drupal 站点的列表、排行榜、事件、个人资料等视图优化与审计。限制:部分结论依赖具体版本与实测,未提供通用安装命令或收费信息。