我想用Next.js建立一个网站,并试图更好地了解他们的Automatic Static Optimization以及使用它的不同方式。
首先,有Gatsby.js是静态网站生成器。当您运行Gatsby的build
命令时,会得到一个/public
文件夹,该文件夹是完全静态的,可以在不需要任何后端的情况下进行部署。如果我理解正确,则意味着整个静态文件夹是在第一个请求时发送到客户端的,此后所有内容(包括路由)都在客户端发生。
另一方面,使用Next.js,您可以静态生成,这意味着所有页面都在构建时预先呈现在服务器上(如Gatsby),但是应用程序仍然依赖于后端(完全成熟的)服务器或无服务器功能)进行路由。也就是说,页面是预渲染的,但是与Gatsby不同,页面是根据请求(即导航)发送给客户端的。 (我发现this answer表示Next仅存在初始请求,但与盖茨比有什么区别?)
所有这些让我感到困惑的是诸如Static HTML Export的Next的文档之类的东西。他们先说
下一个
export
允许您将应用程序导出到静态HTML,该HTML可独立运行而无需Node.js服务器。
因此,听起来像此选项使我们能够像Gatsby一样使用Next,即完全静态的文件夹。
但是随后他们继续评论:
如果您的页面没有
getInitialProps
,则可能根本不需要next export
;感谢Automatic Static Optimization,next build
已经足够了。
但是“自动静态优化”仅指服务器端的静态预渲染,并且next build
不会产生像Gatsby这样的静态文件夹,可以将其作为独立的部署进行部署。
那我在这里想念什么? Gatsby.js和Next.js有什么区别?盖茨比可以做下一个不能做的事情吗?是否可以在不使用export
命令的情况下使用Next建立一个完全静态的站点?
最重要的是,我是否可以构建和部署Next.js应用程序,使其具有完全静态的页面(如Gatsby),仅预渲染的页面(getStaticProps
和getStaticPaths
),以及某些页面在服务器端呈现(getServerSideProps
?
非常感谢!
答案 0 :(得分:1)
第一个请求是针对<url>/index.html
的,因此不会将整个public
都发送给客户端。
Gatsby优化了加载过程,以确保首先加载关键资源(HTML,CSS,JS),从而确保最佳的用户体验。从那里将加载呈现整个页面所需的剩余资源,还将从主页预取链接的页面。当然,如果您已请求到其他页面的路由,则客户端最初将获取该页面的HTML,但是随后的过程将是相似的。
Gatsby在这方面还比Next.js更好(SSG是Next的一个非常新的功能,这是Gatsby的核心功能)-请参见https://dev.to/notsidney/gatsby-won-against-next-js-in-this-head-to-head-37ka。
回答您的问题,是的,您可以使用Next进行完整的SSG,部分SSR / SSG和完整的SSR。如果您要使用完整的SSG,则需要执行next export
,否则对于其他模式,您在标准的Next区域中,并且Next会同时照顾SSG / SSR,因为您有运行可同时提供静态内容的传统Web服务器的情况并执行动态SSR。