就在上周,Astro团队发布了1.0正式版。我从年初就开始关注这个项目,但那时候只学了仓库工程建设相关的东西(changeset,自动发包等),并没有深入了解它自己的功能。趁着正式发布的机会,这几天熟悉了Astro1.0,发现了很多有意思的地方。下面将从团队背景、框架定位、核心优势等维度为大家介绍,最后推荐一些学习资料。团队背景在正式介绍Astro之前,先说说相关背景。Astro的作者是FredK.Schott。没错,他就是开发Snowpack的师兄。可以说是Unbundle构建工具的鼻祖:可惜Vite的发展势头太猛了,Snowpack在逐渐没落。他自己写的看完文章,感慨如下:文章链接:https://dev.to/fredkschott/5-more-things-i-learned-building-snowpack-to-20-000-stars-5dc9大体思路是Snowpack前途黯淡,用户越来越少,感觉要干了,而且Vite发展的很好,所以后面要开发的Astro基于Vite。现在连Snowpack官网都说弃坑了,主动给Vite引流:当然除了Snowpack,FredK.Schott的团队(叫Pika)也做了一个比较知名的产品:Skypack,这是NPM包的ESMCDN服务:不幸的是,Skypack已经很久没有维护了(超过一年)。看得出来,团队已经不想继续投入这个项目了。个人认为主要有两个原因:强大的竞争对手。竞品esm.sh不断迭代,已被Deno官方推荐。这个计划很难实施。这类ESMCDN应用到实际业务项目中还存在很多实际障碍,比如请求量大,没有treeshaking,没有本地调试等,是一个实现起来比较困难的问题。近年来,FredK.Schott团队一直专注于新项目Astro。经过16个月的打磨,Astro在全球拥有超过3万用户,被谷歌、Netlify等大公司使用。Github的star已经达到了15k+。值得一提的是,FredK.Schott为这个项目成立了一家创业公司:TheAstroTechnologyCompany,并已筹集到700万的种子轮投资,打算以开源的方式继续发展。对比一些知名开源项目的赞助收入,比如Webpack[1]22w/年,Babel[2]30w/年,Astro具有经济优势。框架定位接下来说一下Astro框架的定位。是像Vue、React这样的底层渲染框架,还是像Next.js这样的上层研发框架?这对于初学者来说其实是相当麻烦的,因为Astro不仅创建了类似于.vue和.jsx文件的.astro语法,还像Next.js一样提供了常规路由、构造优化等各种运行时能力。、SSR等。但其实它对自己的定位非常明确,那就是一个以内容为核心的应用开发框架。网站等。你可以把Astro理解为垂直场景下的Next.js,但在适用领域它可以超越所有其他竞品(如Next.js、Remix、Vuepress等)。这就是它能做什么的重要原因。接下来,我们就来看看Astro的优势吧。核心优势Astro的主要优势包括以下几点:Islandsarchitecture,解决了传统SSR/SSG框架的全水化问题,实现了尽可能少的客户端JS开销,甚至0JS。学习成本低。.astro语法与传统的.jsx和.vue非常相似,初学者更容易掌握前端。使用灵活。页面开发可以使用官方的.astro语法,也可以使用.md、.vue、.jsx语法。也就是说,你可以自由选择其他前端框架的语法进行开发,甚至可以在一个项目中同时编写Vue组件和React组件!快速构建。底层搭建系统基于Vite和Esbuild实现,项目启动非常快。IslandsArchitecture在上面提到的优势中,让我们关注Astro的Islands架构,因为这是其高性能的主要原因。Islands架构模型早在2019年就被提出,由Preact作者JsonMiller在2011年的IslnadsArchitecture[3]一文中提出,该模型主要用于SSR(包括SSG)应用。我们知道,在传统的SSR应用中,服务端会响应浏览器完整的HTML内容,并在HTML中注入完整的JS脚本来完成事件。结合是完成水合作用(注水)的过程。当注水过程完成后,页面才能真正进行交互。那么当应用的规模逐渐变大,需要在客户端执行的JS脚本越来越多,也就意味着TTI(交互时间)指标越来越高:为了解决这个问题,Islands架构将页面拆分成独立的组件,包括静态组件和交互组件,如下例所示:可以清楚的看到一个页面中只有部分组件交互,那么对于这些??交互组件,我们可以并行执行水合过程,因为组件是相互独立的。对于静态组件,也就是非交互组件,我们可以不让它们参与水化过程,直接复用服务端下发的HTML内容。可交互的组件就像整个页面中的孤岛,所以这种模式被称为孤岛架构。与传统SSR中的全量水化相比,Islands模式可以实现部分水化,从而优化JS的体积,降低网络传输成本和JS运行时的开销。在Astro中,所有组件默认都是静态组件,例如//index.astroimportMyReactComponentfrom'../components/MyReactComponent.jsx';---
