文档邻国意见
组件
Nexy 导出一小组返回 HTML 字符串的帮助程序。每一个在 .nexy 模板中都有两种使用方式:作为 Jinja 调用,或作为 HTML 样式标记。
两种语法,一种函数
from nexy import Audio{{ Audio("/theme.mp3", controls=True) }} <Audio src="/theme.mp3" controls=True />from nexy import Audio{{ Audio("/theme.mp3", controls=True) }} <Audio src="/theme.mp3" controls=True />两条线产生相同的标记:
<audio preload="metadata" controls><source src="/theme.mp3" type="audio/mp3" /></audio>
编译器将 <Audio ... /> 重写为 {{ Audio(...) }},因此标记形式不是第二个 API:属性是函数的关键字参数。
标签形式规则
| 在标签中 | 成为 |
|---|---|
<Audio src="/a.mp3" /> |
Audio(src="/a.mp3") |
controls=True |
controls=True,一个真正的布尔值 |
width=640 |
width=640,一个数字 |
src="{{ url }}" |
src=(url),在 Jinja 中评估 |
任何其他 value |
"value",一个字符串 |
- 标签必须以大写字母开头,并在 frontmatter 中导入;否则编译器会引发
Missing Import: <Name> used but not declared. - 标签形式是 自闭合。
<Audio src="/a.mp3" />和{{ Audio("/a.mp3") }}是等价的;不支持在辅助标记内写入子项。 - 此处,裸露的 HTML 属性不是布尔值:
controls变为controls="",这是错误的。写controls=True。
图片
from nexy import Image{{ Image("/logo.png", alt="Logo", width=128, height=32) }} <Image src="/logo.png" alt="Logo" width=128 height=32 />
Image(src, alt="", width=None, height=None, loading="lazy", class_name=None, **attrs) 默认情况下使用延迟加载渲染 <img>。
链接
from nexy import Link{{ Link("/about", "About", class_name="nav-link") }}
Link(href, children="", class_name=None, prefetch=True, **attrs) 呈现由客户端路由器处理的 <a data-nexy-link>。使用 prefetch=True,悬停或触摸链接会通过 window.__nexy_prefetch 温暖目标。
音频和视频
from nexy import Audio, Video{{ Audio("/theme.mp3", controls=True) }}{{ Video("/demo.mp4", width=640, height=360, muted=True, sources=["/demo.webm", "/demo.mp4"]) }} <Audio src="/theme.mp3" controls=True /><Video src="/demo.mp4" width=640 height=360 muted=True />
Audio(src, controls=True, autoplay=False, loop=False, muted=False, preload="metadata", class_name=None, sources=None, **attrs) 和 Video(src, width=None, height=None, ...) 渲染原生玩家。 sources 添加 <source> 标签,其中包含从每个扩展派生的 MIME 类型。
自己写的组件
可重用的 .nexy 组件是 src/components/: Python 属性下的文件,上面是 HTML,下面是 HTML。它像任何其他 Python 模块一样导入。
title: prop[str]tone: prop[str] = "neutral"<article class="card card-{{ tone }}"> <h2>{{ title }}</h2> <Slot /></article>from "@/components/Card.nexy" import Card<Card title="Latest notes" tone="warm"> <p>Everything published this week.</p></Card>from "@/components/Card.nexy" import Card<Card title="Latest notes" tone="warm"> <p>Everything published this week.</p></Card>title 没有默认值,因此页面必须通过它; tone 回落到 "neutral"。标签之间的标记到达 <Slot />(大写 S)内部。有关 props、slots 和标签形式的规则,请参阅 .nexy 文件。
导入客户端组件
从 .nexy 文件中,按路径导入框架组件;编译器将其安装在客户端并将属性作为 props 传递:
from "@/components/Counter.tsx" import Counter<Counter start="0" />
Import(path, framework, symbol) 在 Python 中执行相同的操作:
from nexy import Import counter = Import("@/components/Counter.tsx", "react", "Counter")html = counter(start=0)
相同的导入语法将 .json、.css 和图像文件解析为其 URL。
模板和 Vite
Template().render(path, context) 渲染模板文件(Jinja2 或 Markdown 渲染为 .md 路由的 HTML)。 Template().invalidate(path) 将其从缓存中删除。
Vite() 返回当前模式的客户端标签:开发中的 HMR 脚本、生产中构建的客户端包。 Nexy 为每个页面调用它;你很少直接需要它。
尚未实施
Form 和 Script 是导出的占位符,没有任何行为。不要依赖他们。