注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
以下是关于 Contour 的一些常见问题。 有关一般信息,请参阅 Slate 文档。
--
在许多方面,Slate 是开发人员可以使用的最复杂的 Foundry 工具。Slate 将构建单页 Web 应用程序的工具打包成一个易于接近的包,但内置的限制很少,而是允许在实现不同模式时具有高度的自由。这种灵活性是一项强大的功能,允许在 Slate 中构建各种应用程序、仪表盘和工作流工具,但这也意味着很容易实现导致性能缓慢或混乱的反模式,以及非确定性应用程序行为。
解决这些类型实现问题中最复杂的问题根本原因需要在 Slate 开发最佳实践的背景下以及 Web 应用程序开发的一般原则下对应用程序逻辑进行逆向工程。
我们将在下面分解这些问题,以指出我们发现反模式出现的地方,并建议改进的实践或指导解决方案。我们将从 Web 技术的相关问题开始:
虽然这些知识并不是 Slate 专有的,但误解这些基础知识是许多关于 Slate 应用程序性能、设计和样式问题的根源,因为它们实际上是自定义构建的 Web 应用程序。
W3Schools ↗ 以及许多其他来源提供了这些主题的基本教程。
熟悉 SQL 以及 Postgres 数据库如何构建和执行查询也是有帮助的,因为大多数应用程序通过针对 Postgate 实例的查询来检索其数据,该实例从 Foundry 数据集同步数据以供应用程序访问。
关于查询开发、错误、性能的许多问题并非 Slate 特有,可以通过常见的搜索查询(通常是 Postgres + [问题]
形式)来回答。
然而,Slate 在解析和提供 Postgres 生成的错误信息方面并不特别友好,我们建议您查看下文中这些问题的常见原因和解决方法,并参考 Postgres 性能和调优 指南以获取更详细的信息。
在 Slate 中构建复杂应用程序可能需要一些时间来适应,许多反模式可能源于将其他应用程序开发概念“强加”到 Slate 上,而不是在 Slate 提供的框架内工作。通常,对于实现给定功能的“正确”模式是隐含的,这些模式最好地与这些基本的 Slate 概念相结合。
这种复杂性的大部分内容都在 了解依赖关系 中进行了介绍,其中包括对 Slate 核心组件(依赖关系图、事件框架、微件、查询、函数等)的讨论、常见模式(以及常见反模式)以及设计和实现的最佳实践。
我们建议开发人员和支持工程师熟悉此文档,因为许多常见问题可以通过已经深入解释的内容来回答。在许多情况下,回答问题的最佳方法不是尝试解决特定实例 - 例如,通过打开应用程序并尝试对用户的开发决策进行逆向工程 - 而是了解用户遇到的失败的一般类别,并引导他们到以下任何内容中的相关讨论:
对于一些最常见的案例,此 FAQ 文档是简要解释和有用参考材料的捷径。
与查询相关的问题有很多种,找出根本原因可以指向许多解决策略。在某些情况下,问题会出现明确的错误消息,但在其他情况下,可能没有错误消息或失败的条件可能是非确定性的(即有时发生,有时不发生)。下面的故障排除步骤介绍了一些常见的根本原因和相关的解决策略。
要进行故障排除,请执行以下步骤:
有时查询与同步网络请求的一般使用模式相悖:
对于这个常规类别的问题,请参阅 优化索引和架构设计 文档,并考虑应用程序应结构化为这样,以便返回给浏览器的数据是其最终形式,而不是需要在 JavaScript 函数中进行大量操作。
有时问题与 Postgres 如何解释和响应请求有关:
这些类型的问题通常可以通过搜索 Postgres + [错误信息]
或 Postgres + [期望查询]
来回答。对于所有与查询性能故障排除或调查相关的问题,请参考 Postgres 查询性能和调优 指南。
有时问题与 Slate 如何以及何时根据开发人员的配置执行查询有关:
20s
变红,您可以确定失败是因为 Slate 已超时查询。{{#if}}
语句或函数逻辑保护,以防止 null
值或其他边缘情况。事件疯狂
的注释是相关的。当查询超时时,主要有两个因素在起作用:
作为应用程序开发人员,了解这些因素以及它们如何影响您的查询是必要的。它们既不是 Slate 也不是 Foundry 特有的,因此您可以通过搜索 Postgres SQL 查询性能
来取得进展,并找到一般的最佳实践以及 Postgres 查询性能和调优 指南中的提示。
要进行故障排除,请执行以下步骤:
根据应用程序开发人员常见问题,一些可能有帮助的建议:
数据规模:限制您同步到 Postgres 的数据集规模。例如,如果您只需要一年的数据,不要同步一个所有时间的数据集然后在查询中筛选。
数据规模:减少表中的列数。例如,如果您在查询中仅选择了几个列,请在同步表之前在变换中删除它们以避免开销。
数据规模:尽量少返回行。如果您正在显示原始行,请使用 OFFSET 和 PAGING 来检索更多行,而不是在响应任何查询时返回超过几百行。
查询优化:尽量避免代价高昂的 SQL 命令。常见的罪魁祸首是 COALESCE、DISTINCT、任何在不“完整”列(例如某些值为 null
)上进行的 JOIN 或 WHERE 子句筛选涉及前导通配符(%
)或复杂匹配表达式。
查询优化:将工作推向上游。这包括数据清理(去除空值、格式化日期、映射显示值)和指标计算(月度总计、桶内平均值等)应尽可能地推入变换层。如果您需要允许用户通过筛选自定义这些,您仍然可以“预聚合”跨几个维度的指标,然后进行一个更简单的查询来对仅满足这些条件的几行进行求和/平均等。
查询优化:使用 EXPLAIN ANALYZE
获取查询计划并了解 Postgres 如何解释您的查询。这将帮助识别瓶颈,并帮助您进一步针对性地进行优化。这里 ↗ 是一个关于读取和理解结果的有用入门。
查询优化:查看 在 Postgres 中优化查询。
在 Postgres 中,列名被假定为小写。由于 Foundry 允许列名具有灵活的大小写和空格,因此在表被索引到 Postres 时,表会用 "
(双引号)字符包裹以保留大小写。
这意味着如果列具有大写字符,您也需要在 SQL 查询中用双引号包裹引用。
您可以在 StackOverflow ↗ 上阅读有关此行为的更多信息。
要进行故障排除,请执行以下步骤:
处理不当的列标识符的查询通常会出现类似这样的错误:
ERROR: 列 mixedcasecolumn 不存在
HINT: 也许您想引用的是列 "Mixed Case Column"
此错误提示表示在查询中所引用的列名与数据库中实际存在的列名大小写不匹配或拼写错误。SQL 通常对列名的大小写不敏感,但在某些数据库系统中,如果列名被用双引号括起来,则大小写会被严格区分。在这种情况下,检查列名的拼写和大小写是否正确。 在这些情况下,最佳实践是更新相关数据集以使用符合Postgres默认值的列标识符,通常为小写字符,并用下划线替换空格。否则,只需确保标识符正确封装在双引号中。
更高级的用户在构建复杂应用程序时,会将数据写回Foundry数据集,他们将使用Phonograph服务。确保Phonograph参考应用程序在您的Foundry实例中可用。
大多数常见问题在此处都有解答,并提供了示例查询和微件模式。此外,可以在如何:写回到Foundry查看参考示例中的大部分内容。
要进行故障排除,请执行以下步骤:
仔细阅读文档,因为大多数常见问题都已涵盖,尽管这是一个深奥且复杂的功能。如有特定问题或疑问,请与Palantir支持团队联系。
在某种边缘配置情况下,您可能会观察到引用一个或多个文本区域
微件的数据输出查询发送了仅包含部分文本的Phonograph请求。例如,如果用户输入长文本如This is a test message for writeback
并快速按下提交
按钮以触发数据输出查询,可能只包括This is a te
。
根本原因是文本区域微件使用了0.5秒的去抖动延迟,以防止依赖图在每次键入时重新评估。这种延迟意味着如果且仅当:
要进行故障排除,请执行以下步骤:
最简单的解决方案是调整用户体验,使其在输入长文本后的0.5秒内无法使用提交选项。例如,在提交查询之前添加确认对话框,或者简单地重新排列表单元素,以便在文本区域微件后还有其他字段需要填写。
其他解决方案包括将文本区域微件替换为文本输入
微件,该微件不包括去抖动延迟。还可以在提交按钮按下和查询执行之间使用Toast微件作为延迟缓冲,以确保有足够的时间来包含完整文本。
Slate中的函数是从应用程序其余部分的沙箱中执行的基本JavaScript。它们纯粹是用户生成的代码,因此与函数相关的大多数问题根本上是误解或未能正确实现所需功能的JavaScript问题。
要进行故障排除,请执行以下步骤:
调试的基本步骤是简化函数直到其以预期方式运行,然后逐步增加复杂性,直到意外行为返回。在这一点上,您已确定需要进一步研究以了解实现所需行为的正确方法。
调试的另一个工具是Chrome DevTools调试器 ↗。还可以考虑相关部分使用DevTool进行调试 用debugger;
语句在您的函数中添加“断点”。
然后,在打开Chrome DevTools面板的情况下,单击函数窗口中的测试
按钮。函数执行将在断点处暂停,您可以继续逐步执行函数代码并查看变量的值。
函数与事件框架的交互方式不直观,因为在正常使用中它们不是被调用,而是当它们与输入不一致并且其输出被渲染为JSON以供下游依赖项使用时由依赖图执行。
要进行故障排除,请执行以下步骤:
如果函数表现异常,请仔细检查您是否了解它们在依赖图和事件框架中的位置 /documentation/product/slate/application-functionality#best-practices-and-common-patterns-for-javascript-functions
。
很少需要使用事件调用[f_myFunction].run
操作的模式。尝试依赖此模式的应用程序应被重构以使用依赖图的正常解析。与其直接触发函数,不如通过触发查询或设置引用变量的值来更新上游依赖项。
地图微件支持正确定义的geojson
地图特征的渲染,如点和几何。这些可以动态生成或从数据库中检索,但是格式特定,如果是手动创建或通过新算法创建,则可能难以实现。
要进行故障排除,请执行以下步骤:
查看GeoJSON在地图微件中的应用
参考示例。尝试在您的Foundry实例中搜索它,如果不可用,请提交问题。
[x]
?Slate中的所有样式最终都转换为CSS。您可以使用Chrome Inspector工具(右键单击 > 在任何元素上检查)检查应用程序的任何元素,以查看应用于该元素的类并了解文档层次结构。
要进行故障排除,请执行以下步骤:
查看文档部分样式,以更深入地了解样式在Slate中如何定义、应用和渲染。
在某些配置中,如果您尝试将微件配置为“动态”宽度和高度,则在页面加载时您会发现微件在一个小框中呈现。触发[w_myWidget.resize]
操作会导致微件按预期大小呈现。
这种行为是由于CSS指定各种微件元素的宽度和高度为百分比 - 通常为100% - 与一个或多个父容器上的Flex
属性之间的冲突。在这些冲突中,Slate无法在渲染时确定包围微件的元素的正确尺寸,因此微件被呈现得太小。
要进行故障排除,请执行以下步骤:
实现响应式微件尺寸的适当模式是仅在父容器和子微件上使用Flex
配置设置。不要通过CSS手动设置其他宽度
或高度
属性。为了解决问题,从根子微件开始并向上遍历所有父微件,删除任何位置或尺寸的CSS规则。
您可以使用边距
和填充
属性来内嵌或对齐子微件。如果您熟悉Flexbox CSS规则,可以使用Chrome Inspector来识别要定位的元素和类,并提供覆盖或额外的Flexbox规则以实现确切的预期行为。
Slate优化用于快速应用程序开发。基础框架对设计和样式的配置限制很少。因此,Slate无法以适合打印媒体或导出的方式通用呈现所有应用程序。应用程序开发人员需要在每个应用程序的基础上投入时间以支持打印。
要进行故障排除,请执行以下步骤:
第一个也是最好的选择是考虑为什么需要或请求打印您的应用程序。您的用户是否只是需要一种方式来保存他们创建的视图并在以后参考或在演示中使用?
在这种情况下,请考虑使用(或向用户强调使用)内置的获取可共享链接功能。在“查看”模式下,它在操作菜单下。此链接创建一个唯一的URL,具有一个ID,每当链接被加载时,都会将所有页面微件返回到生成链接时的状态。这意味着,例如,一组输入微件将默认设置为用户配置的输入并输入查询等。
如果您确实必须打印或导出,则需要定义额外的媒体CSS样式以帮助您的应用程序适当呈现。
首先,您需要在全局样式中至少添加以下内容:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13
@media print { @page { size: A4; // 设置页面尺寸为A4 } html, body , .ws-root-container.ws-sandbox { height: 600mm !important; // 强制将高度设置为600毫米 } sl-app-view-actions { display: none !important; // 打印时隐藏该元素 } }
打印响应式应用程序或任何具有复杂样式或设计的应用程序将非常困难。在这些情况下,可以考虑创建一个“打印视图”作为单独的应用程序,通过URL参数接收必要的输入,并生成一个简化视图以优化打印。这样会增加开发成本和维护负担,但会带来令人满意的效果。
与所有Web应用程序一样,Slate使用最终用户计算机中的浏览器资源来执行JavaScript代码并渲染由HTML定义的文档模型(DOM)以及CSS中指定的样式。这些资源中的一部分是固定的,它们是使用Slate框架的开销。然而,在性能不佳的情况下,根本原因通常是应用程序超载的一种形式,即在开发应用程序过程中定义的配置向浏览器要求过多资源,无论是渲染应用程序、执行JavaScript,还是仅仅在内存中存储许多大数据量查询的结果。
在某些情况下,单个函数或查询可能是原因。在这种情况下,您可以使用应用程序的依赖项选项卡中的性能指标查看各种查询和函数的节点时间
。此指标表示页面加载时解决特定节点所花费的时间,有助于识别可能导致应用程序瓶颈的候选者。
一般来说,一个最佳实践是倾向于轻量、界限明确的单一服务应用程序,并通过深度链接将它们“集群”成大型工作流或应用程序。