问题标签 [sanity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
reactjs - Next.js:减少数据获取并在页面之间共享数据
我正在寻找在 Next.js 应用程序中更好地获取数据的解决方案。在这个问题中,我不只是在寻找解决方案,而是在寻找多种选择,以便我们了解利弊。
我遇到的问题
现在我有几个页面都包含一个显示 som 静态内容的组件和一个具有从 API 获取的一些动态内容的组件。每个页面都做一个fetch()
自己getInitialProps()
的页面数据,还有页脚数据,这对所有页面都是一样的。
这当然有效,但是有很多重复的数据获取。页脚数据将始终为所有页面显示并且始终相同。它也很少在 API 中更改,因此无需重新验证数据。
我正在寻找的答案
我不只是想解决这个问题,我也在寻找一个概述,以便为未来的项目学习一些新的实践。我喜欢编写“显而易见”的代码,所以不要寻找过于 hacky 的解决方案,例如写入window
对象等。首选具有较少依赖性的简单解决方案。目标是一个快速的网站。减少网络使用/API 调用并不那么重要。
到目前为止我的想法
这是我想出的可能的解决方案,从简单/明显到更复杂。
- 在 Footer 组件(客户端)内部进行 fetch
- 在所有 /pages 上获取 getInitialProps(服务器端和客户端)
- 使用 HOC 在 _app.js 中进行 fetch 并连接到它
getInitialProps()
并将其添加到 props 中,因此所有页面都可以使用数据 - 使用 zeit/swr 和数据预取来缓存数据
- 使用 redux 存储全局状态
所有这些“工作”,但其中大多数将不必要地重新获取数据,和/或增加一点复杂性。这是我所看到的优点/缺点(数字与上面相同):
- 简单的!获取代码只在一个地方,它位于使用它的地方。页面加载后获取数据,因此内容“跳转”到查看。一直在重新获取数据。
- 简单的!数据是在服务器上获取的,因此在呈现页面之前内容是可用的。为每一页重新获取数据。我们必须记住为它们的每个页面获取相同的页脚数据
getInitialProps()
。 - 我们可以在一个地方进行提取并将其添加到所有页面道具中,因此页脚数据自动适用于所有页面的道具。对于某些人来说,要轻松理解正在发生的事情可能有点复杂,因为它需要更多地了解 Next.js/React 的工作原理。仍然重新获取所有页面的数据。我们现在
fetch()
彼此接连进行两次调用(首先在 _app.js 中加载页脚内容,然后在每个页面中获取自定义内容),因此速度更慢。 - 有点简单。我们甚至可以在加载 JS 之前使用预取来加载数据到缓存。第一个页面加载后,我们将快速获取数据。可以直接在页脚组件中获取代码。预
rel="preload"
取技术不适用于所有类型的提取(例如 Sanity 的客户端使用 groq)。为了没有在初始页面加载后加载数据的“跳跃”内容,我们应该提供useSWR()
仍然initialData
需要我们在其中获取数据的getInitialProps()
内容,但仅在服务器端执行此操作就足够了。可以使用新的getServerSideProps()
. - 我们可以加载一次数据(?)并在整个应用程序中使用它。快速且更少/无重新获取。添加外部依赖。更复杂的是你必须学习 redux,甚至只加载一个共享数据对象。
当前解决方案,使用要点 2 中描述的解决方案。
希望对此有更多的了解。我缺少明显的东西?
next.js - 理智和 NextJS,帖子未显示在 index.js 上
我按照教程进行操作,到了最后一部分,您将博客文章放在页面上,页面结束时只有一个 H1 标记,没有任何文章,有人能看一下代码并告诉我原因吗它可能不起作用?
reactjs - Sanity PatchEvent 函数对它们的作用不是很清楚
我正在使用理智并试图弄清楚set
, unset
,insert
函数的作用。类本身也有方法PatchEvent
,我似乎也找不到任何文档。
例如,我可以看到set
在示例中采用了一个参数。但是通过对代码的更多研究,set
实际上需要两个参数,一个是 the path
,另一个是value
. 目前还不清楚 path 是如何工作的以及它究竟做了什么。
由于我正在尝试更新数组中的对象,因此看起来这是我应该做的事情,因为这是在 default 中所做的ArrayInput
。我试图让它工作,但没有错误,也没有发生更新。这就是我所拥有的:
PatchEvent.from(key ? set(key, [idx, '_key']) : unset())
最重要的是,我可以看到直接在PatchEvent
,和. 我或多或少都想要一些关于所有这些的好的文档,否则我还不如坚持使用 HTTP Api 并自行更新/管理自定义组件的所有内容。prefixAll
prepend
append
reactjs - Lunr - gatsby-plugin-lunr - 我可以在构建时更改数据/索引吗?
我有一个需要搜索组件的 Gatsy-Sanity 项目。为此,我想使用gatsby-plugin-lunr。我遇到了一个问题,我的节点是多语言的。例如,我的一个字段的构造如下:
(简而言之,此解析器如下所示。如果键_type
以 'locale*' 开头,则仅返回键 en 或 nl 的值。这是由 var 传递的)
我可以制作一个拆分/剥离数据的解析器。我在从搜索索引运行搜索查询的组件内部进行了这种工作(尚未成功)。但这意味着它会在每次搜索时解析它。有没有办法在gatsby-node.js
使用 lunr 插件构建时做到这一点?我也需要这个,因为我需要在结果的 slug/path 上添加一个语言前缀。
sanity - Sanity.io 便携式文本富文本编辑器中的文本/图像对齐
在 sanity.io 的富文本编辑器(便携式文本)中,是否可以选择将文本(以及图像)与中心对齐?在文档中找不到任何内容
sanity - 始终解析 groq 查询中的某些字段引用
我们有某些类型的字段指向我们想要解析的引用。有没有办法搜索这些字段,无论它们在树的深处,并在其上应用“->”?我们为这些字段添加了前缀“msg_”。
一个示例结构可能看起来像这样,但也可以更深地隐藏在另一个“子”数组中:
所以我们想要所有以 "msg_" 的硬引用开头的字段。
谢谢!
reactjs - 使用(嵌套)道具值来引用另一个道具
我正在尝试使用嵌套的道具值,然后使用该值动态获取另一个道具。这适用于浅层(第一级)道具,但当道具嵌套时它会失败。
作品(返回“我的帖子标题):
不起作用(返回未定义,期望“类别标题”):
javascript - 使用 VS Code 调试 Sanity exec
我正在使用 Sanity (sanity.io headless CMS) 并使用 CLI 进行一些数据迁移。
我如何(或者,是否有可能)如何附加 vscode 调试器并在迁移脚本中的断点处停止。我正在运行以下 cli 迁移脚本:sanity exec migrate.js --with-user-token
. 我想在 migrate.js 中的断点处停止?
我已经管理了使用 node 运行的调试控制台应用程序,但不知道在使用sanity exec ..
. 单步执行代码是查找错误和学习的好方法。
backup - Sanity.io 备份和恢复(或自动保存文档 ID)
问题 #1:是否可以从 Sanity.io 的备份中恢复已删除的项目?
据我了解,恢复备份是通过从数据集的历史中导出所有文档并导入来完成的。
- 恢复- 有一种方法可以做到:https ://www.sanity.io/docs/importing-data 。
- 导出- 有两种导出数据的方法:
已删除项目的 ID 不会出现在当前存在的数据中(因为它们已被删除,呃),没有它们,我无法获取历史文档。
此外,还有一个问题部分说:
明白了
当前访问控制意味着如果您今天能够访问该文档,您将能够访问该文档的所有先前版本。
问题 #2:如果由于缺少文档 ID 而无法从备份中恢复已删除的项目 - 有没有办法自动保存所有文档 ID(每小时或每当发生更改时)?
我想如果有一种机制也可以保存最后一次看到ID的时间,你也可以或多或少地知道它的删除时间......