API

nsh/web

nsh/web 提供 Web 上应用所在页面的能力:Head,即文档的标题、描述和元数据,供搜索引擎收录、链接预览展示。该模块在所有平台上都可以导入,因此同一个 bundle 可以在所有平台运行:在手机和桌面上,Head 不渲染任何内容。

import { Head } from "nsh/web";
导出 类型 说明
Head (props: HeadProps) => JSX.Element 在挂载期间设置页面的 <head>。

Head 在挂载期间设置页面的 <head>,本身不渲染任何内容。在应用的每个页面中放一个:放在 NavPage 里,它就在该页面显示时描述该页面。

import { NavPage } from "nsh/base";
import { Head } from "nsh/web";

function NotePage(props: { note: Note }) {
  return (
    <NavPage title={props.note.title}>
      <Head
        title={`${props.note.title} · Market Notes`}
        description={props.note.summary}
        canonical={`/notes/${props.note.slug}`}
        meta={[{ property: "og:type", content: "article" }]}
        jsonLd={{ "@context": "https://schema.org", "@type": "Article", headline: props.note.title }}
      />
      …
    </NavPage>
  );
}
属性 类型 说明
title string 文档的标题(<title>);meta 未设置 og:title 时,也作为 Open Graph 标题。
description string 页面的摘要(<meta name="description">);meta 未设置 og:description 时,也作为 Open Graph 描述。
canonical string 页面的规范 URL(<link rel="canonical">):一个 URL,或站点内的路径("/notes/q3"),从站点发布到的目录算起。
lang string 页面的语言(<html lang>):"en"、"zh-CN"。
meta HeadMeta[] 更多 <meta>:每项是 { name, content }("robots"、"twitter:card")或 { property, content }(Open Graph 的 "og:image")。
jsonLd object 结构化数据(schema.org),写成 JSON-LD <script>。

可以同时挂载多个 head:应用自己的,以及栈中每个页面各一个。最后挂载的 head 设置的内容生效,其余内容取自之前挂载的 head,因此位于顶部的页面决定文档标题,它被弹出后,下面的页面重新决定。不再有任何已挂载 head 设置的内容会被移除;没有 head 时,文档原有的标题和语言会恢复。每个属性都是响应式的:读取 signal 的 head 会随之更新。

Web 展示了一个能被搜索引擎收录、每个页面都有自己 URL 的完整站点。