🚀🚀🚀Astro:一个可以同时写React、Vue、Svelte、SolidJS等多种语言的框架

简介: 🚀🚀🚀Astro:一个可以同时写React、Vue、Svelte、SolidJS等多种语言的框架


🎉 什么是 Astro

Astro 是「集多功能于一体的 Web 框架」,用于构建「快速、以内容为中心」的网站。

🎉 主要特性

  1. 「以内容为中心」:Astro 专为内容丰富的网站而设计。
  2. 「服务器优先」:网站在服务器上渲染 HTML 时运行速度更快。
  3. 「默认快速」:在 Astro 中构建缓慢的网站是不可能的。
  4. 「易于使用」:您不需要成为专家即可使用 Astro 构建某些内容。
  5. 「功能齐全且灵活」:超100多种 Astro 集成可供选择。

说人话:默认服务端渲染、没有JavaScript,所以很快;可以集成多种框架

Astro 的目标是构建内容(静态网站),而不是web APP级别的应用。

🎉 安装

// 全局安装
npm i -g astro
// 初始化项目
npm create astro@latest

接着根据提示回车即可

🎉 语法

🚀 类似 jsx的表达式的 HTML 超集

「Astro 组件」是 Astro 项目的基础构建块。它们是纯 HTML、无需客户端运行时的模板组件。你可以通过文件扩展名 .astro 来写 Astro 组件。

vscode 中可以使用 Astro 插件进行代码高亮

如果组件种需要 JavaScript ,那么你可以在代码栅栏、script 标签等方式加入 JavaScript 代码。

---
// 组件脚本(JavaScript)
---
<!-- 组件模板(HTML + JS 表达式)-->

「Astro 组件语法」采用类似jsx的写法,不过他们还是有一些区别

💎 区别1:属性采用 html 语法

- <div className="box" dataValue="3" />
+ <div class="box" data-value="3" />

💎 区别2:没有根元素限制

---
// 包含多个元素的模板
---
<p>无需将元素包装在单个容器元素中。</p>
<p>Astro 支持模板中的多个根元素。</p>

💎 区别3:多种注释写法

---
---
<!-- HTML 注释语法在.astro 文件中是有效的 -->
{/* JS 注释语法也是有效的 */}

🚀 模板语法

💎 定义变量

---
const name = "Astro";
---
<div>
  <h1>你好 {name}!</h1>  <!-- 输出 <h1>Hello Astro!</h1> -->
</div>

💎 动态属性

---
const name = "Astro";
---
<h1 class={name}>支持属性表达式</h1>
<MyComponent templateLiteralNameAttribute={`MyNameIs${name}`} />

💎 Fragment 片段

---
const htmlString = '<p>Raw HTML content</p>';
---
<Fragment set:html={htmlString} />
<>helloe!!!</>

💎 动态标签

---
import MyComponent from "./MyComponent.astro";
const Element = 'div'
const Component = MyComponent;
---
<Element>Hello!</Element> <!-- 渲染成 <div>Hello!</div> -->
<Component /> <!-- 渲染成 <MyComponent /> -->

💎 CSS 样式

Astro <style> 标签内的 CSS 规则「默认自动限定范围」。即仅当前组件有效

<style>
  h1 {
    color: red;
  }
  .text {
    color: blue;
  }
</style>

如果你想全局生效,需要使用指令

<style is:global>
  h1 {
    color: red;
  }
  .text {
    color: blue;
  }
</style>

💎 Script 标签

Astro 允许你不使用任何框架,那么将会严格按照 html 进行编译,此时,此时你可以使用 script 标签处理事件,包括点击事件。

// <button class="alert" onClick={onClick}>Click me!</button>
// 上面的点击写法是无效的
<button class="alert">Click me!</button>
<script>
  // 在页面上找到所有带有 `alert` 类的按钮。
  const buttons = document.querySelectorAll('button.alert');
  // 处理每个按钮上的点击事件。
  buttons.forEach((button) => {
    button.addEventListener('click', () => {
      alert('按钮被点击了!');
    });
  });
</script>

💎 指令

👉 class:list

class:list 接收数组,其中有几种不同的可能值:

  • string:添加到 class 元素
  • Object:添加到键值对到 class 元素
  • Array:扁平化
  • false, null, or undefined: skipped
<!-- 原先 -->
<span class:list={[ 'hello goodbye', { world: true }, [ 'friend' ] ]} />
<!-- 输出 -->
<span class="hello goodbye world friend"></span>
👉 set:html

set:html={string} 将 HTML 字符串注入元素中,类似于设置 el.innerHTML

---
const rawHTMLString = "Hello <strong>World</strong>"
---
<h1>{rawHTMLString}</h1>
  <!-- 输出:<h1>Hello &lt;strong&gt;World&lt;/strong&gt;</h1> -->
<h1 set:html={rawHTMLString} />
  <!-- 输出:<h1>Hello <strong>World</strong></h1> -->
👉 set:text

set:text={string} 将文本字符串注入元素中,类似于设置 el.innerText


         
👉 客户端指令

默认情况下,UI 框架组件不会在客户端激活。如果没有 client:* 指令,它的 HTML 将被渲染到页面上,而无需 JavaScript。

  • client:load 立即加载并激活组件的 JavaScript。
  • client:idle 一旦页面完成了初始加载,并触发 requestIdleCallback 事件,就会加载并激活组件中的 JavaScript
  • client:visible 一旦组件进入用户的视口,就加载组件的 JavaScript 并使其激活
  • client:media 一旦满足一定的 CSS 媒体查询条件,就会加载并激活组件的 JavaScript。
  • client:only 跳过 HTML 服务端渲染,只在客户端进行渲染
<BuyButton client:load />
<ShowHideButton client:idle />
<HeavyImageCarousel client:visible />
<SidebarToggle client:media="(max-width: 50em)" />
<SomeReactComponent client:only="react" />
<SomePreactComponent client:only="preact" />
<SomeSvelteComponent client:only="svelte" />
<SomeVueComponent client:only="vue" />
<SomeSolidComponent client:only="solid-js" />

🚀 集成第三方框架

💎 安装集成组件

npx astro add react

astro.config.mjs 配置文件中添加如下

import { defineConfig } from 'astro/config';
import react from "@astrojs/react";
// https://astro.build/config
export default defineConfig({
  integrations: [react()]
});

💎 添加组件

定义 React 组件

import React from "react"
import { useState } from "react"
const ReactComponent = () => {
  const [count, setCount] = useState(0)
  return <div onClick={() => setCount(count + 1)}>React:{count}</div>
}
export default ReactComponent

引入组件

---
import Layout from '../layouts/Layout.astro';
import ReactComponent from "../components/ReactComponent";
---
<Layout title="Welcome to Astro.">
    <main>
        <ReactComp client:load></ReactComp>
    </main>
</Layout>

其他框架的流程类似

只有在 .astro 文件中才可以使用多种框架的语言

下面是我添加的 react、vue 框架的 count 功能组件:

🎉 总结

Astro 是一个以内容为中心的框架,默认服务端渲染,尽量没有JavaScript,所以速度很快。

Astro 除了可以集成流行的框架之外,还对标准的 markdown 语法内置支持。包括 frontmatter YAML 语法。

🎉 最后

今天的分享就到这里了,感谢大家的阅读,如果文中有错误的地方,欢迎指正!

相关文章
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
77 9
|
26天前
|
存储 缓存 JavaScript
如何优化React或Vue应用的性能
需要注意的是,性能优化是一个持续的过程,需要根据具体的应用场景和性能问题进行针对性的优化。同时,不同的项目和团队可能有不同的优化重点和方法,要结合实际情况灵活运用这些优化策略,以达到最佳的性能效果。
107 51
|
23天前
|
存储 前端开发
在React框架中,如何使用对象来管理组件的状态
在React中,组件状态通过`state`对象管理,利用`setState`方法更新状态。状态变化触发组件重新渲染,实现UI动态更新。对象结构清晰,便于复杂状态管理。
|
25天前
|
缓存 监控 JavaScript
Vue.js 框架下的性能优化策略与实践
Vue.js 框架下的性能优化策略与实践
|
26天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
33 1
|
27天前
|
JavaScript 前端开发 开发者
React和Vue有什么区别?
React 和 Vue 都有各自的优势和特点,开发者可以根据项目的需求、团队的技术背景以及个人的喜好来选择使用。无论是 React 还是 Vue,它们都在不断发展和完善,为前端开发提供了强大的支持。
67 2
|
27天前
|
JavaScript 前端开发 测试技术
React和Vue的性能对比如何?
需要注意的是,性能不仅仅取决于框架本身,还与开发者的代码质量、架构设计以及项目的优化程度等密切相关。因此,在评估性能时,应该综合考虑多个因素,而不是仅仅局限于框架之间的比较。
106 1
|
1月前
|
开发框架 前端开发 JavaScript
React 框架的优点和缺点是什么?
React框架作为当前主流的前端开发框架之一,具有诸多优点,同时也存在一些缺点
|
1月前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
1月前
|
移动开发 前端开发 JavaScript
React框架
React是一个用于构建用户界面的JavaScript库,由Facebook开发并于2013年开源,目前在前端开发领域得到了广泛的应用。