在本篇文章中,我们将介绍:
Static Export 是一种 Web 开发模式,它允许我们在构建网站时将页面提前生成为静态 HTML 文件,而不是在每次请求时动态生成。这意味着页面内容在构建时就已经准备好,而不是等待用户请求时才生成。这样做的好处是:
静态网站是一种最原始的 Web 形式,它由静态文件组成。和 JSP/Blade/Pug 等后端模板引擎不同, 它不需要服务器端代码来生成页面内容(拼接 HTML)。一个简单的静态网站可以通过将HTML、CSS和JavaScript等文件放入静态服务器中或者本地文件系统中,通过浏览器进行访问。
在 Next.js 中,组件默认被视为 Server Components。Server Components 在 Static Export 时可以生成静态页面。让我们看一个示例:
function Home() {
return (
<main>
<ComponentA />
</main>
);
}
async function ComponentA() {
const data = await fetchData(
'/some_data_that_rarely_changes_so_we_fetch_when_building'
);
return <div className='component-a'>{data}</div>;
}
在 Static Export 构建时,上述代码会生成如下的HTML:
<main>
<div className='component-a'>
some data that rarely changes
</div>
</main>
这意味着数据在构建时就被获取,并且在每个用户请求页面时都是相同的。
但如果我们希望在每次用户访问页面或与页面交互时获取新数据,就需要使用 Client Components。以下是一个示例:
'use client';
// ...
export function ComponentB() {
const [count, setCount] = useState(0);
const [data, setData] = useState();
useEffect(() => {
fetchData(
`/some_frequently_changing_data_so_we_fetch_every_time_user_open_the_page_or_click_the_button?param=${count}`
).then(setData);
}, [count]);
return (
<div className='component-b'>
<div className='count'>{count}</div>
<button onClick={() => setCount((val) => val + 1)}>add</button>
<div className='data'>{data}</div>
</div>
);
}
function Home() {
return (
<main>
<ComponentA />
<ComponentB />
</main>
);
}
在 Static Export 构建时,上述代码会生成如下的HTML:
<main>
<div className='component-a'>
some data that rarely changes
</div>
<div className='component-b'>
<div className='count'>0</div>
<button>add</button>
<div className='data'></div>
</div>
</main>
这里的关键区别在于:
而传统的 SPA(Single Page Application),在构建后,通常你只会得一个空空如也的HTML:
<div id='root'></div>
<script src="app.js" />
在 app.js 下载和执行完成之前,用户只能面对一个空白的网页。
在 Next.js 中,Static Export 是一种强大的工具,它允许我们在构建时生成静态页面,从而提高网站的性能和降低网站托管成本,且有更好的 SEO。通过 Server Components 和 Client Components,我们可以选择何时获取数据,以满足不同的需求。使用这些工具,你可以更灵活地构建出适应不同场景的网站。
LangChain几乎是LLM应用开发的第一选择,它的野心也比较大,它致力于将自己打造成LLM应用开发的最大社区。而LangChain最核心的部分非 Chain 莫属。
路由链(RouterChain)是由LLM根据输入的Prompt去选择具体的某个链。路由链中一般会存在多个Prompt,Prompt结合LLM决定下一步选择哪个链。