首页 web前端 js教程 对 Astro 的第一印象:我喜欢什么和不喜欢什么

对 Astro 的第一印象:我喜欢什么和不喜欢什么

Dec 29, 2024 am 10:34 AM

First impressions of Astro: what I liked and disliked

我最近开始使用 Astro 来重建最初使用 WordPress、Go、Rails 和 Hugo 构建的副项目。我选择 Astro 是因为它具有类似 React 的 DX 和良好的语言服务器支持,并且它与具有慷慨免费套餐的无服务器托管平台(Cloudflare、AWS Lambda 等)兼容。

当我开始使用 Astro 时,我对它了解不多。现在我已经迁移了多个站点,我想与其他考虑使用该框架的人分享我喜欢和不喜欢该框架的地方。

Astro:我喜欢的

Astro 的核心是一个静态站点生成器,能够在需要时生成动态服务器渲染页面。 Astro 非常适合互动性有限的博客或小型营销网站。该框架提供了 Next.js 的大部分 DX,而没有 React.js 开销。

服务器渲染模板语言中良好的 IntelliSense 和代码格式化

说实话:传统的服务器渲染模板语言严重缺乏良好的语言服务器支持和代码格式。与 React/Vue/Svelte 同行相比,Go 模板、Jinja、ERB 和 EJS 在工具方面远远落后。大多数服务器渲染的模板语言无法知道哪些变量在范围内或者它们的类型是什么。

使用 Astro,所有这些功能都只需一个 VS Code 扩展即可实现。

在 Astro 模板内,您可以在模板顶部的“代码围栏”内设置数据,该代码围栏在构建时或响应服务器上的请求时运行。实际情况如下:

---
import Layout from "../layouts/Layout.astro";
import { getPosts } from "../data/posts";

const posts: { id, title }[] = await getPosts();
---
<Layout pageTitle="Posts">
  <h1>Posts</h1>

  {post.length > 0 ? (
    <ul>
      {posts.map((post) => (
        <li>
          <a href={`/posts/${post.id}`}>
            {post.title}
          </a>
        </li>
      )}
    </ul>
  ) : null}
</Layout>
登录后复制
登录后复制

由于模板的所有数据都加载到模板上方的“代码围栏”中,因此语言服务器可以为范围内定义的任何对象的属性提供自动完成功能。它还会指示您何时尝试使用不存在的变量。

Astro 文件可以是“组件”

我对 Go 模板、Jinja 和 EJS 等传统模板语言最大的抱怨之一是它们没有可以接受子元素的“组件”。我的大多数网站都有某种宽度受限的“容器”UI 元素,这可确保内容不会飞到超宽显示器上的屏幕末端。如果您有一个手动添加到

的 .container 类,元素,那么这通常可以正常工作。但是,如果您使用的是 Tailwind 这样的实用 CSS 框架,那么您可能会发现自己将以下代码添加到每个页面模板中:
<div
 >



<p>When you eventually need to change these classes, it's an error-prone pain to update each file manually. But if your templating language doesn't have components that can accept children, it's almost inevitable. </p>

<p>Unlike those traditional templating languages, Astro templates can be used as components that accept children using a <slot /> tag. A long string of utility classes could be extracted into a reusable Astro component:<br>


<pre class="brush:php;toolbar:false"><div
 >



<p>The Astro component could then be consumed from another Astro file.<br>
</p>

<pre class="brush:php;toolbar:false">---
import Container from "../components/Container.astro";
---
<Container>
  <h1>Hello, world!</h1>
</Container>
登录后复制
登录后复制

Astro 文件不限于单个插槽:它们可以有多个。

我最喜欢的 Astro 组件功能是它们可以接受代码围栏内的 props。这是一个例子:

---
import Layout from "../layouts/Layout.astro";
import { getPosts } from "../data/posts";

const posts: { id, title }[] = await getPosts();
---
<Layout pageTitle="Posts">
  <h1>Posts</h1>

  {post.length > 0 ? (
    <ul>
      {posts.map((post) => (
        <li>
          <a href={`/posts/${post.id}`}>
            {post.title}
          </a>
        </li>
      )}
    </ul>
  ) : null}
</Layout>
登录后复制
登录后复制

该组件可以在另一个文件中使用时接受道具。

<div
 >



<p>When you eventually need to change these classes, it's an error-prone pain to update each file manually. But if your templating language doesn't have components that can accept children, it's almost inevitable. </p>

<p>Unlike those traditional templating languages, Astro templates can be used as components that accept children using a <slot /> tag. A long string of utility classes could be extracted into a reusable Astro component:<br>


<pre class="brush:php;toolbar:false"><div
 >



<p>The Astro component could then be consumed from another Astro file.<br>
</p>

<pre class="brush:php;toolbar:false">---
import Container from "../components/Container.astro";
---
<Container>
  <h1>Hello, world!</h1>
</Container>
登录后复制
登录后复制

内置具有实时重新加载功能的前端资产管道

我之前已经用 Vite 构建了自己的服务器端集成。如果您想快速在线获取某些东西,那么您希望避免自己构建这种商品功能。 Astro 是内置的。

如果您想向 Astro 页面或组件添加自定义脚本,您只需在页面上放置一个脚本标签即可。

---
type Props = { pageTitle: string; pageDescription: string };

const { pageTitle, pageDescription } = Astro.props;
---

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{pageTitle}</title>
    <meta name="description" content={pageDescription} />
  </head>
  <body>
    <slot />
  </body>
</html>
登录后复制

Astro 将自动编译 TS 和 JS 文件作为站点构建过程的一部分。您还可以编写使用 Astro 组件内脚本标记内的 node_modules 导入的脚本,Astro 将在构建时对其进行编译并将其提取到自己的文件中。

---
import Layout from "../layouts/Layout.astro";
---
<Layout
  pageTitle="Tyler's Blog"
  pageDescription="I don't really post on here."
>
  <h1>Tyler's blog</h1>
  <p>Sorry, there's no content yet...</p>
</Layout>
登录后复制

您可以通过在代码围栏中导入 CSS 或 Scss 样式来将 CSS 或 Scss 样式包含在 Astro 文件中。

<div>
  <h1>This is my page</h1>
  <script src="../assets/script.ts"></script>
</div>
登录后复制

Astro 还提供了通过在 Astro 文件中使用样式标签来执行 范围样式 的功能。这个功能对于 Vue 用户来说可能很熟悉。

给定以下 Astro 文件:

<script>
  // This will also compile down to a JavaScript file at build time.

  import axios, { type AxiosRequestConfig, type AxiosResponse } from "axios";

  const response = await axios
    .get<AxiosRequestConfig, AxiosResponse<{foo: string}>>("/some-endpoint");

  console.log(response.data.foo);
</script>
登录后复制

简单吧?

行动

操作提供了一种类型安全的方式来运行后端函数。它们提供验证并可以处理 JSON 和表单数据。它们无疑是 Astro 的杀手级功能之一:所有这些都需要以定制方式在 Next.js 应用程序中手动连接。它们需要的代码比示例多一些,但使用起来非常优雅。我建议阅读操作文档页面。

无运行时 JS 成本

有无数的 Twitter 开发者说 React “足够快”。对于很多事情来说并非如此。

我在小项目中使用 Rasbperry Pi 4,你可以感受 React 的运行时成本。我确信对于便宜的 Android 手机来说也是一样的,只不过在这种情况下 JS 开销也会耗尽电池。

如果我的网站需要的唯一交互性是切换导航菜单,我宁愿自己连接它。当我需要时,我会很乐意使用 React,但对于很多项目来说,我实际上并不需要它。

Astro:我不喜欢什么

我不喜欢 Astro 的地方并不是该框架独有的:它们是从 JavaScript 生态系统中其他工具借用的想法。

基于文件的路由

由于 Astro 采用基于文件的路由,Astro 项目中的一半文件最终命名为 index.(astro|js|ts) 或 [id].(astro|js|ts)。基于文件的路由是一种令人讨厌的模式,在 Next.js 实现它之后,它席卷了前端世界,并且它有很多缺点:

  • 您经常会在编辑器中打开 5 个具有相同文件名的选项卡。至少需要猜测 3 次才能找到您要查找的选项卡。
  • 编辑器的文件模糊查找器的用处要小得多,因为太多文件具有相同的名称。
  • 基于文件的路由将应用程序的核心关注点之一分散在许多文件和文件夹中,因此很难在编辑器中一目了然地看到所有路由。相反,您必须深入到多个文件夹才能了解哪些页面可用。

我承认:当您创建一个页面少于 10 个的网站时,基于文件的路由感觉很棒。但随着网站的发展,它会增加摩擦,你与该功能的对抗多于从中受益。

在 JavaScript 生态系统中,Remix 通过提供基于文件的路由版本而脱颖而出,该版本将所有路由扁平化到单个目录中,并允许用户通过手动路由配置完全选择退出基于文件的路由。

基于文件的路由是我对 Astro 最大的抱怨,但这是一个很难逃避的功能。它在 Next.js、Nuxt.js、SvelteKit 等中实现。更奇怪的是,这些框架对于应用程序其他部分的文件名基本上没有意见。与 Ruby on Rails 相比,大多数 JavaScript 框架在文件名和项目结构方面都为您提供了很大的自由度——除了用于路由。这是一种特殊情况,特殊情况会增加软件的复杂性。

每个文件一个组件(某种程度)

我真正喜欢的 JavaScript 语言功能是能够在单个文件中定义多个变量、函数和类。这使得可以轻松地共置相关功能,而不必因为语言级别的限制而提前将其提取到其他文件。

与 Vue 的单文件组件非常相似,Astro 文件允许为每个文件定义一个组件。这对我来说很乏味,但 Astro 提供了一种解决方法。

Astro 可以将预渲染的 React、Vue、Svelte、Solid 和 Preact 组件直接嵌入到其模板中,而无需加载任何客户端 JavaScript。 Preact 组件与 Astro 合理地配对得很好,因为 Preact JSX 比 React JSX 更接近 HTML。不过,在同一个项目中管理 Astro 和 Preact 组件确实变得很尴尬,一旦我开始使用 Preact 组件,我发现自己将大部分 UI 从 Astro 文件移到了 Preact 中。

关于 Astro 的最终想法

如果您是 Next.js、Nuxt 或 SvelteKit 的狂热用户,并且对您的框架感到满意,那么您可能不会从 Astro 中得到太多好处。然而,如果您想向用户减少 JavaScript 的臃肿,同时保留 Next.js 之类的 DX,那么 Astro 可能适合您。

Astro 面向内容驱动的网站,并提供开箱即用的 Markdown 支持。由于其对内容的关注,它是替代 WordPress 或 Hugo 网站的理想开发者博客平台。然而,它的功能远不止通过操作等功能来实现内容网站。

尽管我非常厌恶基于文件的路由,但我对采用 Astro 最大的担忧是可能会发生重大变化,迫使我重建网站。 JavaScript 工具比其他语言生态系统中的工具更积极地进行重大更改。因为我对 Astro 还很陌生,所以我不知道从一个主要版本到下一个版本有多少变化。即使有这样的担忧,我还是计划将 5 到 6 个网站从其他平台迁移到 Astro,这样我就可以利用其一流的 DX 并以低廉的价格托管这些网站。

以上是对 Astro 的第一印象:我喜欢什么和不喜欢什么的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

使用Next.js(后端集成)构建多租户SaaS应用程序 使用Next.js(后端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

See all articles