前言
探索新技术的背景及目的
提升开发效率
Astro
是一个备受关注的静态站点生成器和前端框架,它提供了预渲染和增量渲染技术,能够在构建时生成静态 HTML,并在客户端进行增量更新。了解和掌握 Astro
框架可以提升我们的开发效率,使我们能够更快地构建现代化的 Web 应用和静态站点。
提高性能和用户体验
Astro 的Islands 架构能够极大地提高页面加载速度和性能,从而改善用户体验。通过探索 Astro,我们可以了解其内部的工作原理和优化策略,从而为我们的项目提供更好的性能和用户体验。
投入生产可行性
通过探索Astro 框架,我们可以深入了解其特性、优点和局限性,从而更好地评估其是否适合我们的项目需求,并做出明智的选择。
Astro 是什么?
Astro是一个强大的框架,它同时支持静态网站生成(SSG)和服务端渲染(SSR),帮助我们建立快速的、基于内容的网站。它轻量、高效、灵活,使它成为创建内容丰富的网站的合适选择,如博客、投资组合、文档和一些电子商务网站。
框架定位
Astro 框架的定位,是像 Vue、React 这样的底层渲染框架,还是像 Next.js 这种上层的研发框架?
-
Astro 既自创了类似于.vue、.jsx文件的 .astro 语法,又提供了像 Next.js 里面各种运行时的能力,比如约定式路由、构建优化、SSR 等等。
-
但实际上它给自己的定位非常清晰,即
content-focused
应用开发框架,换句话说,就是重内容、轻交互场景下的上层研发框架,比如大多数电商网站、文档站、博客站、证券网站等等。 -
你可以将 Astro 理解为一个垂直场景下的Next.js,但它可以在它适用的领域里面可以胜过其它所有竞品(如Next.js、Remix、Vuepress 等),这是它能够做起来的重要原因。
核心特性
- 内容驱动: Astro 是最适合构建像博客、营销网站、电子商务网站这样的以内容驱动的网站的 Web 框架。
- 服务器优先: Astro 尽可能多地使用服务器渲染而不是在浏览器中的客户端渲染。
- 默认快速: Astro 的魔力在于它如何将上述两个价值 以内容为中心和服务器优先的架构 相结合,做出权衡并提供其他框架无法实现的功能。结果是每个网站都开箱即有令人惊叹的 Web 性能。
为什么如此快?
Islands架构
解决传统 SSR/SSG 框架的全量 hydration 问题,做到尽可能少的 Client 端 JS 的开销,甚至是 0 JS。默认情况下,Astro 会自动将每个 UI 组件渲染成仅包含 HTML 和 CSS 的形式,并自动剥离掉所有客户端 JavaScript。所以,群岛正是 Astro 在默认情况下能够如此迅速之秘诀!
预渲染技术
预渲染是指在构建过程中,提前将应用或网站的页面转换成静态的HTML文件。这意味着当用户访问网站时,服务器直接发送已经生成好的HTML页面,而不是在用户端动态生成内容。这样做有几个好处:1.提高性能 2.改善SEO 3.提高稳定性和安全性
增量构建
增量构建是一种优化构建过程的技术,只对发生变更的文件或数据进行重新构建,而不是每次都从头开始构建整个项目。这显著减少了构建所需的时间,尤其是在大型项目中,可以显著提高开发和部署的效率。增量构建的优势包括:1.减少构建时间 2.提高开发体验 3.优化部署流程
Islands群岛架构
Astro 群岛是Astro框架的一个核心概念,它旨在解决传统SPA(单页应用)加载过多不必要JavaScript的问题。通过这种架构,Astro能够实现页面上只有交互性组件加载JavaScript,其余部分保持为静态HTML。这种做法大大减少了页面的初始加载时间,提高了性能,并改善了用户体验。使用Astro群岛时,开发者可以指定哪些组件需要客户端交互,Astro将为这些组件按需加载JavaScript,而静态内容则无需加载额外的脚本,有效地实现了页面的部分动态化。这种架构模式所依赖的技术也被称为 局部化或选择性激活。
激活岛屿
默认情况下,Astro 会自动将每个 UI 组件渲染成仅包含 HTML 和 CSS 的形式,并自动剥离掉所有客户端 JavaScript。正是这种做法使得 Astro 网站默认保持快速,并且避免开发者不小心发送不必要或不想要的
JavaScript
,而拖慢他们的网站速度。
只需使用一个 client:* 指令,就可以将任何静态 UI 组件转变为交互式岛屿。然后 Astro 会自动构建并打包你的客户端 JavaScript,以优化性能。
在使用群岛时,客户端的 JavaScript 只会加载你所使用 client:* 指令明确标记的交互组件。
并且由于交互是在组件层面配置的,所有你可以根据每个组件的使用情况来处理不同的加载优先级。例如,*client:idle *告诉一个组件在浏览器变为空闲时加载,而 *client:visible *告诉一个组件只有在进入视口后才加载。
组件嵌套
在组件嵌套使用的情况下子组件是否可以交互决定于父组件是否可以交互,当父组件为可交互岛屿时,即使子组件不写任何client指令,也会加载子组件的js,反之亦然。
Astro 对于多种框架的支持是怎么做到的
Astro 对于多种前端框架的支持是通过一种名为 "组件编译器" 的工具实现的。这个工具会将各种前端框架的组件转换为 Astro 的内部表示形式,这样这些组件就可以在 Astro 的环境中被使用和渲染。
当开发者在 Astro 中使用一个特定的框架的组件时,Astro 的组件编译器会将这个组件转换为 Astro 的组件格式,并将它与 Astro 的其他组件一起编译和打包。这样,即使应用程序中同时使用多种框架,Astro 也能够处理它们,并将它们整合到一个统一的应用程序中。
迁移案例
可以看到,Astro 相比 Next.js 可以大幅度减少 JS 代码的体积(90% 以上),同时页面的运行时性能也提升了 30% 以上。除此之外,Astro 不仅支持使用 React 框架,而且支持 Vue,Svelte,Solid 等在内的各种前端框架,灵活性更高。
复盘总结
Astro 的优点
- 性能优化: 通过预渲染生成静态HTML,极大提高了网站的加载速度和性能。
- 前端框架兼容: 支持
React、Vue、Svelte
等多个前端框架,允许开发者在同一个项目中使用不同的技术栈。 - SEO友好: 生成的静态页面有利于搜索引擎优化,提高网站的搜索排名。
- 减少JavaScript负载: Islands 架构仅在必要时加载客户端JavaScript,减少了页面加载时间,提高用户体验。
- 增量构建: 支持增量构建,仅重建变更的内容,提高了开发效率。
局限性
- 动态内容处理: 对于需要频繁更新的动态内容,
Astro
可能不如传统的服务器端渲染或客户端渲染框架灵活。 - 学习曲线: 虽然Astro旨在简化开发过程,但对于习惯传统开发流程的开发者来说,可能需要一定的时间来适应Astro的工作方式。
- 社区和生态: 虽然Astro的社区正在快速发展,但与一些成熟的框架(如React或Vue)相比,可用的资源和插件可能相对较少。