注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。

Slate 常见问题解答

以下是关于 Contour 的一些常见问题。 有关一般信息,请参阅 Slate 文档

--

Slate 调试介绍

在许多方面,Slate 是开发人员可以使用的最复杂的 Foundry 工具。Slate 将构建单页 Web 应用程序的工具打包成一个易于接近的包,但内置的限制很少,而是允许在实现不同模式时具有高度的自由。这种灵活性是一项强大的功能,允许在 Slate 中构建各种应用程序、仪表盘和工作流工具,但这也意味着很容易实现导致性能缓慢或混乱的反模式,以及非确定性应用程序行为。

解决这些类型实现问题中最复杂的问题根本原因需要在 Slate 开发最佳实践的背景下以及 Web 应用程序开发的一般原则下对应用程序逻辑进行逆向工程。

我们将在下面分解这些问题,以指出我们发现反模式出现的地方,并建议改进的实践或指导解决方案。我们将从 Web 技术的相关问题开始:

1. 前端 Web 技术

  • Web 浏览器如何工作。
  • 如何从浏览器发出网络请求并从其他服务接收响应。
  • 浏览器资源如何分配给特定网站的渲染和 JavaScript 执行。
  • HTML 和 CSS 如何协同工作来定义网站的外观。
  • JavaScript 如何编译和执行。

虽然这些知识并不是 Slate 专有的,但误解这些基础知识是许多关于 Slate 应用程序性能、设计和样式问题的根源,因为它们实际上是自定义构建的 Web 应用程序。

W3Schools ↗ 以及许多其他来源提供了这些主题的基本教程。

2. Postgres 和 SQL

熟悉 SQL 以及 Postgres 数据库如何构建和执行查询也是有帮助的,因为大多数应用程序通过针对 Postgate 实例的查询来检索其数据,该实例从 Foundry 数据集同步数据以供应用程序访问。

关于查询开发、错误、性能的许多问题并非 Slate 特有,可以通过常见的搜索查询(通常是 Postgres + [问题] 形式)来回答。

然而,Slate 在解析和提供 Postgres 生成的错误信息方面并不特别友好,我们建议您查看下文中这些问题的常见原因和解决方法,并参考 Postgres 性能和调优 指南以获取更详细的信息。

3. Slate 专有知识

在 Slate 中构建复杂应用程序可能需要一些时间来适应,许多反模式可能源于将其他应用程序开发概念“强加”到 Slate 上,而不是在 Slate 提供的框架内工作。通常,对于实现给定功能的“正确”模式是隐含的,这些模式最好地与这些基本的 Slate 概念相结合。

这种复杂性的大部分内容都在 了解依赖关系 中进行了介绍,其中包括对 Slate 核心组件(依赖关系图、事件框架、微件、查询、函数等)的讨论、常见模式(以及常见反模式)以及设计和实现的最佳实践。

我们建议开发人员和支持工程师熟悉此文档,因为许多常见问题可以通过已经深入解释的内容来回答。在许多情况下,回答问题的最佳方法不是尝试解决特定实例 - 例如,通过打开应用程序并尝试对用户的开发决策进行逆向工程 - 而是了解用户遇到的失败的一般类别,并引导他们到以下任何内容中的相关讨论:

对于一些最常见的案例,此 FAQ 文档是简要解释和有用参考材料的捷径。

返回顶部


查询

查询失败

与查询相关的问题有很多种,找出根本原因可以指向许多解决策略。在某些情况下,问题会出现明确的错误消息,但在其他情况下,可能没有错误消息或失败的条件可能是非确定性的(即有时发生,有时不发生)。下面的故障排除步骤介绍了一些常见的根本原因和相关的解决策略。

要进行故障排除,请执行以下步骤:

有时查询与同步网络请求的一般使用模式相悖:

  • 尝试向浏览器返回过多数据的查询。
    • 查询应返回少于 10,000 行作为大致的经验法则。
      • 有时查询会明确返回一条错误消息,提示“行太多”,但通常情况下,查询会成功,但应用程序的其余部分会非常缓慢。在这些情况下,寻找返回大量行的查询,并尝试减少返回的数量。
    • 如果您尝试显示包含大量行的表格或需要向用户呈现原始行,请使用 LIMITOFFSET 语句来实现分页工作流,无论是使用表微件的内置属性还是使用自定义工作流。
  • 查询过大,以至于仅发出请求就需要很长时间。
    • 查询应小于 5 秒的往返时间。
    • 如果您的查询具有大数据量负载,请考虑将嵌入在查询中的逻辑更多地推入生成数据集的变换层。

对于这个常规类别的问题,请参阅 优化索引和架构设计 文档,并考虑应用程序应结构化为这样,以便返回给浏览器的数据是其最终形式,而不是需要在 JavaScript 函数中进行大量操作。

有时问题与 Postgres 如何解释和响应请求有关:

  • 查询缓慢,因为它们没有得到最佳结构。
  • 查询缓慢,因为数据集未正确索引。
  • 查询语法不正确。

这些类型的问题通常可以通过搜索 Postgres + [错误信息]Postgres + [期望查询] 来回答。对于所有与查询性能故障排除或调查相关的问题,请参考 Postgres 查询性能和调优 指南。

有时问题与 Slate 如何以及何时根据开发人员的配置执行查询有关:

  • 查询在页面加载时非确定性失败。
  • 查询在 20 秒(Slate 超时时间)返回无用的错误。
    • 通过 Slate 查询发出的请求 在 Slate 侧 会在 20 秒时超时,无论请求的服务器端发生了什么。此失败模式的明确诊断是通过在 Google Chrome 网络检查器打开时查看应用程序的 查看 模式刷新页面。这将显示每个查询请求的持续时间,如果您看到一个查询在 20s 变红,您可以确定失败是因为 Slate 已超时查询。
    • 通过提高查询性能来解决此问题:Postgres 查询性能和调优控制查询执行
    • 有关超时的更多信息,请查看下一节 Postgres 查询超时
  • 查询在某些情况下失败(因为 Handlebars 渲染没有很好地保护)。
    • 如果您的查询中有 Handlebars 语句,请确保它们受到 {{#if}} 语句或函数逻辑保护,以防止 null 值或其他边缘情况。
  • 查询在错误的时间执行或未能执行。

返回顶部


Postgres 查询超时

当查询超时时,主要有两个因素在起作用:

  • 数据规模 - 表中有多少行以及查询返回多少行。
  • 查询优化 - 查询的“开销”有多大。

作为应用程序开发人员,了解这些因素以及它们如何影响您的查询是必要的。它们既不是 Slate 也不是 Foundry 特有的,因此您可以通过搜索 Postgres SQL 查询性能 来取得进展,并找到一般的最佳实践以及 Postgres 查询性能和调优 指南中的提示。

要进行故障排除,请执行以下步骤:

根据应用程序开发人员常见问题,一些可能有帮助的建议:

  • 数据规模:限制您同步到 Postgres 的数据集规模。例如,如果您只需要一年的数据,不要同步一个所有时间的数据集然后在查询中筛选。

  • 数据规模:减少表中的列数。例如,如果您在查询中仅选择了几个列,请在同步表之前在变换中删除它们以避免开销。

  • 数据规模:尽量少返回行。如果您正在显示原始行,请使用 OFFSET 和 PAGING 来检索更多行,而不是在响应任何查询时返回超过几百行。

  • 查询优化:尽量避免代价高昂的 SQL 命令。常见的罪魁祸首是 COALESCE、DISTINCT、任何在不“完整”列(例如某些值为 null)上进行的 JOIN 或 WHERE 子句筛选涉及前导通配符(%)或复杂匹配表达式。

  • 查询优化:将工作推向上游。这包括数据清理(去除空值、格式化日期、映射显示值)和指标计算(月度总计、桶内平均值等)应尽可能地推入变换层。如果您需要允许用户通过筛选自定义这些,您仍然可以“预聚合”跨几个维度的指标,然后进行一个更简单的查询来对仅满足这些条件的几行进行求和/平均等。

  • 查询优化:使用 EXPLAIN ANALYZE 获取查询计划并了解 Postgres 如何解释您的查询。这将帮助识别瓶颈,并帮助您进一步针对性地进行优化。这里 ↗ 是一个关于读取和理解结果的有用入门。

  • 查询优化:查看 在 Postgres 中优化查询

返回顶部


无法在我的 Postgres 查询中引用列

在 Postgres 中,列名被假定为小写。由于 Foundry 允许列名具有灵活的大小写和空格,因此在表被索引到 Postres 时,表会用 "(双引号)字符包裹以保留大小写。

这意味着如果列具有大写字符,您也需要在 SQL 查询中用双引号包裹引用。

您可以在 StackOverflow ↗ 上阅读有关此行为的更多信息。

要进行故障排除,请执行以下步骤:

处理不当的列标识符的查询通常会出现类似这样的错误:

ERROR: 列 mixedcasecolumn 不存在
HINT: 也许您想引用的是列 "Mixed Case Column"

此错误提示表示在查询中所引用的列名与数据库中实际存在的列名大小写不匹配或拼写错误。SQL 通常对列名的大小写不敏感,但在某些数据库系统中,如果列名被用双引号括起来,则大小写会被严格区分。在这种情况下,检查列名的拼写和大小写是否正确。 在这些情况下,最佳实践是更新相关数据集以使用符合Postgres默认值的列标识符,通常为小写字符,并用下划线替换空格。否则,只需确保标识符正确封装在双引号中。

Phonograph查询和全局Foundry数据输出

更高级的用户在构建复杂应用程序时,会将数据写回Foundry数据集,他们将使用Phonograph服务。确保Phonograph参考应用程序在您的Foundry实例中可用。

大多数常见问题在此处都有解答,并提供了示例查询和微件模式。此外,可以在如何:写回到Foundry查看参考示例中的大部分内容。

要进行故障排除,请执行以下步骤:

仔细阅读文档,因为大多数常见问题都已涵盖,尽管这是一个深奥且复杂的功能。如有特定问题或疑问,请与Palantir支持团队联系。

返回顶部


Phonograph查询在提交时截断文本

在某种边缘配置情况下,您可能会观察到引用一个或多个文本区域微件的数据输出查询发送了仅包含部分文本的Phonograph请求。例如,如果用户输入长文本如This is a test message for writeback并快速按下提交按钮以触发数据输出查询,可能只包括This is a te

根本原因是文本区域微件使用了0.5秒的去抖动延迟,以防止依赖图在每次键入时重新评估。这种延迟意味着如果且仅当:

  • 文本区域微件是用户填写的最后一个输入,并且,
  • 提交按钮在最后一个字符输入到文本区域后不到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地图特征的渲染,如点和几何。这些可以动态生成或从数据库中检索,但是格式特定,如果是手动创建或通过新算法创建,则可能难以实现。

要进行故障排除,请执行以下步骤:

查看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优化用于快速应用程序开发。基础框架对设计和样式的配置限制很少。因此,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,还是仅仅在内存中存储许多大数据量查询的结果。

在某些情况下,单个函数或查询可能是原因。在这种情况下,您可以使用应用程序的依赖项选项卡中的性能指标查看各种查询和函数的节点时间。此指标表示页面加载时解决特定节点所花费的时间,有助于识别可能导致应用程序瓶颈的候选者。

一般来说,一个最佳实践是倾向于轻量、界限明确的单一服务应用程序,并通过深度链接将它们“集群”成大型工作流或应用程序。

返回顶部