SharePoint Online 门户导航解决方案

每个门户项目都需要实现导航解决方案。 根据项目要求,导航解决方案可能会选择仅使用开箱即用导航组件、仅使用自定义导航组件,或结合使用这两者。

本文介绍如何在 SharePoint Online 中构建一个性能良好的导航系统。

注意

尽管本指南主要针对的是 SharePoint Online,但大多数内容也同样适用于本地 SharePoint 环境中托管的门户。

不应执行的操作

以下列表包含在设计导航解决方案时应执行的关键事项。

禁止事项:

  • 当门户的网站集具有复杂结构(多级网站和/或独有权限)时,使用开箱即用的结构化网站导航。
  • 使用自定义导航解决方案,它在页面加载后即为所有自定义导航控件请求所有导航节点,甚至对于初始折叠/隐藏的控件也是如此。
  • 使用不缓存其接收的导航节点的自定义导航解决方案。
  • 使用面向传统列表 (SOAP) Web 服务的自定义导航解决方案;对于其他问题,向其传递一些格式不正确的 CAML 查询。
  • 通过按名称或 ID(例如 var termStores = taxSession.get_termStores();var termStore = termStores.getByName("Taxonomy_Dmxzz8tIBzk8wNVKQpJ+xA==");)进行引用来获取术语库,建议的指导是获取默认关键字或网站集术语库(例如 var termStore = taxSession.getDefaultSiteCollectionTermStore();var termStore = taxSession.DefaultKeywordsTermStore())。

自定义导航解决方案的基本原理

门户架构师决定采用自定义导航解决方案的原因有很多。 大多数原因与以下事实有关,那就是现代门户设计本质上是响应性的,且通常包括功能丰富的导航系统;因此,尝试将建议的设计映射到 SharePoint 最终会失败,因为开箱即用的服务器端导航控件无法配置为满足所建议设计的一个或多个要求。 具体示例如下。

开箱即用的控件:

  • 及其管理 UX 不支持响应式 UI 设计。
  • 不显示所需的行为(例如浮出控件/悬停、多栏下拉菜单、富媒体,延迟加载等)。
  • 不支持所需的导航层次结构属性(例如标题、分组、深度、链接限制等)。
  • 不支持所需的导航链接属性(例如缩略图、图像链接、发布开始/结束、重点)。
  • 不可用或不再可用(例如页脚、痕迹)。
  • 不与自定义/旧版导航数据存储集成。
  • 管理 UX 在导航控件中不一致,且操作不便。

当这些原因不断累积而成为大问题时,请考虑使用自定义导航解决方案。

使用开箱即用的导航解决方案

你已评估了自定义导航解决方案的基本原理,并且已确定上述原因均不适用。 好消息是,你可将已验证的模式用于开箱即用的导航解决方案。

其核心在于,导航解决方案由一组导航控件组成,这些控件可从导航存储接收数据。 当选择开箱即用的导航解决方案时,托管导航(在本文后续部分介绍)通常是导航存储的首选,因为它提供了更好的网页加载性能。

另一种选择是开箱即用的结构化导航(在本文后续部分介绍),它很容易变得非常消耗资源(特别是复杂的网站集结构),并导致网页负载性能显著降低。

使用自定义导航解决方案

你已评估了自定义导航解决方案的基本原理,并且已确定这些原因皆适用。 好消息是,你可将已验证的模式用于开发自定义导航解决方案。

下图显示了自定义导航解决方案的逻辑体系结构。

自定义导航解决方案逻辑体系结构

以下部分介绍了逻辑体系结构的主要组件。

这是一个驻留在此页面上的自定义客户端 JavaScript 显示控件。

通常,控件在页面加载时查询导航存储,处理导航数据响应并呈现导航组件(演示文稿、信息和行为)。 在实践中,控件应遵循延迟加载模式:仅在必要时执行导航数据请求,并尽可能地将其延迟。

可在设计时将显示控件添加到页面的静态定义中(通过母版页、页面布局或 Web 部件),或者可在运行时将其添加到页面的动态状态(通过 JavaScript 嵌入技术)。

显示控件利用客户端数据访问层(在本文后续部分介绍)来优化页面性能。

显示控件可选择为其导航管理页提供设置链接,该页面提供用于管理导航控件配置的用户界面。

以下是通常在自定义导航解决方案中使用的各类导航控件的通用指南。

典型的导航显示控件

  • 全局导航:实现一个面向门户特定的中央导航配置实体的自定义控件。 将公共缓存用于导航节点。 请考虑使用开箱即用的管理页面。
  • 页脚导航:实现一个面向门户特定的中央导航配置实体的自定义控件。 将公共缓存用于导航节点。 请考虑使用开箱即用的管理页面。
  • 站点地图:实现一个面向门户特定的中央导航配置实体的自定义控件。
  • 当前导航(即左侧):实现一个面向 Web 特定的本地导航配置实体的自定义控件。 将公共缓存用于导航节点。 请考虑使用开箱即用的管理页面。
  • 痕迹避免实现此自定义控件;基于当前 Web 的 URL 构建 Web 对象的父链是一项成本高昂的操作。
  • 有用的链接:实现一个面向 Web 特定的本地导航配置实体的自定义控件。 将公共缓存用于导航节点。 请考虑使用开箱即用的管理页面。
  • 我的链接:实现面向用户特定的专用导航配置实体的自定义控件。 对导航节点使用专用缓存。 提供自定义管理页面。

导航存储保留自定义导航控件的配置。 你可以选择让自定义导航控件使用自定义导航存储或开箱即用的导航存储。

自定义导航存储

(通过搜索进行查询时)最常用的自定义导航存储(自定义 SharePoint 列表)在可扩展性、可管理性和性能之间取得平衡。 可以使用表示导航标题/组和导航链接的自定义内容类型以及定义所需自定义属性(例如,显示顺序)的网站栏来轻松地扩展列表架构。 这些网站栏的已爬网属性可以映射到 SharePoint 搜索中的托管属性。 导航数据可通过熟悉的开箱即用列表管理页面轻松进行管理。 可通过 SharePoint 搜索 REST API 远程访问导航数据。

注意

基于搜索的导航依赖搜索索引。 SharePoint 连续爬网门户内容;不过,在 SharePoint 列表更改体现到搜索索引之前,仍会有一点延迟。

最简单且性能最佳的自定义导航存储是 JavaScript 资源文件(例如,nav.js),它声明了使用 JSON 字符串初始化的组件特定配置变量(例如,footerNav)。 浏览器会自动下载文件并将其缓存以供后续使用。 加载到 JavaScript 运行时环境中后,配置数据就可以使用了。 使用此方法的主要权衡点在于管理用户界面:管理员必须至少要在 JavaScript 文件中手动编辑 JSON 字符串。 需要使用自定义用户界面来从管理员提取存储,并使操作更加友好。

自定义导航存储范围的另一个方面是自定义数据库。 此选项提供了无限灵活性,但也需要进行完全自定义的开发。 此外,数据库、自定义 Web API 和导航管理页面还需要宿主环境。

注意

有关展示了如何实现使用客户端数据访问层的自定义导航存储的实用示例,请参阅 SharePoint PnP 存储库中的客户端数据访问层 (DAL) 示例

开箱即用的导航存储

  • 开箱即用的托管导航 (MMS) 托管导航允许使用 Managed Metadata Service (MMS) 术语集来配置给定网站集的导航节点。 开箱即用的导航显示控件自动使用此数据。 开箱即用的导航管理页面提供易于使用的用户界面,用于管理无限制层次结构(无限深度)内的导航节点。 自定义导航显示控件也可以使用此数据,但必须通过 JSOM 执行此操作,因为暂无 REST API 可用于托管导航。

    注意

    通过托管导航配置和维护全局导航定义是相当繁琐的。 每当创建新网站集时,必须复制网站集及其相关术语集的配置。 另请注意,托管导航未经过安全修整,因此用户看到的链接可能无法访问。

  • 开箱即用的结构化导航(网站) 借助结构化导航,可以使用网站集(及其网站和页面)的原生结构,以及已创作的标题和链接,从而配置给定网站集的导航节点。 开箱即用的导航管理页面提供用户界面,用于管理受限层次结构(有限深度)内的导航节点。 自定义导航显示控件也可以使用此数据,但必须通过 JSOM 执行此操作,因为暂无 REST API 可用于结构化导航。

    注意

    开箱即用的导航显示控件使用数据库查询(即按查询显示的内容)获取导航数据。 它们为每个页面加载执行此操作,这对于复杂的网站集结构来说是非常消耗资源的。 仅建议具有简单网站集结构的小型门户使用结构化导航。 结构化导航始终返回经过安全修整的结果。

  • 开箱即用的搜索索引(搜索) 通过搜索驱动的导航构建合适的搜索查询,从而查询 SharePoint 搜索索引中的站点和页面。 没有特定的开箱即用导航管理页面,因此你需要实现自定义导航显示控件,以便使用通过搜索查询检索到的数据。

    注意

    使用搜索驱动的导航时,请务必缓存已获取的搜索结果,因为并不希望每次加载页面都访问服务器。 在本文后续部分中将介绍客户端数据访问层,这是要与搜索驱动的导航一起使用的模型。 与结构化导航类似,搜索驱动的导航已经过安全修整,因此用户不会看到无法访问的链接。 搜索驱动的导航的缺点在于难以控制返回的导航项的顺序。

导航管理页面提供用户界面,用于以用户友好的方式管理导航控件的配置。 可直接访问该页面,也可以从导航控件上显示的可选链接(例如设置链接)进行访问。 该页面使用适当的导航存储 API 来选择导航存储,以管理导航控件的配置。

你可以选择让自定义导航控件使用自定义导航管理页面或开箱即用的导航管理页面。

在许多情况下,与所选导航存储相关联的开箱即用的默认导航管理页面(例如,SharePoint 列表视图或术语集管理页面)应该足够了。 在默认页面不可用时,则显然必须开发自定义页面。 在确定现有的默认页面是否可接受时,请务必考虑开发自定义管理页面(设计、开发/维护、托管和用户培训)的总成本。

一般来说,只有在默认选项不存在、页面必须支持响应式 UI 或要通过门户的前端用户视图(与后端管理员视图相对)使用页面时才开发自定义管理页面。

导航存储 API 提供一个编程接口,用于以一致且安全的方式管理导航控件的配置。 你可以选择让自定义导航控件使用自定义导航存储 API 或开箱即用的导航存储 API。

若要开发和部署自定义导航存储 API,请遵循以下准则:

  • 使用选定技术堆栈(ASP.Net Web API 2.0、Node.js 等)进行实现。
  • 在可访问 Internet 的环境中托管 API。
  • 使用公用 DNS 进行名称解析。
  • 需要 SSL 并从公共证书颁发机构获取 SSL 证书。
  • 启用匿名访问并使用 Azure AD 保护 API。
  • 实现跨源资源支持 (CORS)。

对于 .Net 客户端环境:

  • 通过 SharePoint 客户端对象模型(CSOM 或 REST)面向 SharePoint API。
  • 通过 REST 面向自定义 Web API。
  • 通过 REST 面向第三方 API(仅在必要时使用 SOAP)。

对于浏览器客户端环境:

  • 通过 SharePoint REST API 面向 SharePoint API(仅在必要时使用 JSOM)。
    • 如果面向不同的网站集,请使用跨域库。
  • 通过 REST 面向自定义 Web API。
    • 使用适用于 JavaScript 和隐式 OAuth 流的 Microsoft 身份验证库。
  • 通过 REST 或 SOAP(如有必要)面向第三方 API。

客户端数据访问层

客户端数据访问层是自定义客户端 JavaScript 框架,适用于所有自定义客户端显示控件,包括自定义导航显示控件。 它支持智能数据加载模式,可提取客户端到服务器请求的详细信息,可提供数据缓存功能,以便最大程度降低客户端到服务器的请求流量,并提高感知页面性能。

有关客户端数据访问层的详细信息,请参阅 SharePoint Online 门户性能指南

另请参阅