Astro是一个强大的框架,它同时支持静态网站生成(SSG)和服务端渲染(SSR),帮助我们建立快速的、基于内容的网站,同时考虑到开发人员的体验。它轻量、高效、灵活,使它成为创建内容丰富的网站的合适选择,如博客、投资组合、文档和一些电子商务网站。如果你想创建一个具有大量交互的复杂应用程序,Astro可能不是你的正确选择。相反,你可以考虑其他工具比如Next.js。

Astro入门:

Astro项目结构:

Astro页面:

Astro组件:

添加脚本:

Astro布局:

元素:

Astro组件props:

Astro中的样式:

获取数据:

管理内容:

嵌套布局:

加载本地文件:

添加脚本:

使用UI框架:

指令:

构建和发布:

总结:

首先,我们需要安装Astro并创建项目的模板。请确保你的电脑上已经安装了Node.js v16.12.0或者更高版本。然后,执行以下命令:

```bash

npm create astro@latest

```

或者使用yarn:

```bash

yarn create astro@latest

```

CLI会询问你的项目名称和你是否要使用Typescript。此外,它还会给你几个选项,告诉你如何设置你的项目。在本教程中,我选择了"一个空项目"选项。

以下是我与Astro CLI的小型对话:

一旦你在编辑器中打开你的项目,你可以安装Astro的扩展。由于Astro有自己的文件扩展和语法,你可能想为你的编辑器安装其扩展。这里是VSCode的Astro扩展的链接,它不仅仅为你高亮语法,还能做得更多。

现在你可以用以下命令来运行你的项目。不需要安装任何依赖。

```bash

npm run dev

```

打开浏览器,访问http://localhost:3000/ ,一切就绪。

Astro项目的文件结构相当直截了当。主要文件位于以下目录:

- src/public

- src/pages/index.astro、index.html、index.js

- src/content/Collections API、src/content/about.astro

- src/pages/about.md、about.mdx、about.html、about.js、about.ts

- src/pagesindex.astro

每个页面都有一个对应的`.astro`、`.md`、`.mdx`、`.html`或`.js`文件,以及一个可选的`.ts`文件。这样可以让你在使用不同的Markdown或Mdx格式编写页面时保持一致性。

```html

About

About

Jamstack development agency.

```

```javascript

// index.astroabout.astro

export default function App() {

return (

About

Jamstack development agency.

);

}

```

--- Component Script (JavaScript)

--- Component Template (HTML + JS Expressions)

让我们为项目添加第一个组件。

src/components/header.astro

---

<nav>

<a href="/">Home</a>

<a href="/about">About</a>

</nav>

--- import Header from `../components/Header.astro`;

--- <html lang=`en`>

<head>

<meta charset=`utf-8` />

<link rel=`icon` type=`image/svg+xml` href=`/favicon.svg` />

<meta name=`viewport` content=`width=device-width` />

<title>About</title>

</head>

<body>

<h1>About</h1>

<p>Jamstack development agency.</p>

</body> </html>

header.astro

--- body() { return html `

About

`}

--- pages/index.astro: header(), logoheader()

请根据以下内容重构代码:

```html

```

这就是Astro的厉害之处。到目前为止,我们已经制作了页面,并向其添加了组件,而几乎不需要写任何HTML以外的东西。

接下来是脚本部分。Astro使用代码栅栏来存放组件的JavaScript代码。你可以在栅栏内编写任何需要的JavaScript以渲染模板,甚至可以使用TypeScript。

代码栅栏的作用是将你在其中编写的所有JavaScript代码“围起来”,使其无法逃逸到浏览器中或传递给用户。你在这里编写的所有内容都只是为了辅助组件模板。

现在让我们回到我们的页面,在页面的代码栅栏中添加一个变量,用于存储页面标题:

```javascript

import Header from '../components/Header.astro';

const pageTitle = 'Bejamas';

```

接下来,我们需要将这个变量插入到HTML模板中:

```html

{pageTitle}

{pageTitle}

```

在上述代码片段中,我们可以看到如何在代码栅栏内定义本地JavaScript变量,并使用类似JSX的表达式将变量注入HTML模板中。当我们查看不同页面时,可能会注意到一些重复的内容,例如标题和完全相同的代码。为了解决这个问题,我们可以谈论Astro布局。

Astro布局是一种具有不同名称的Astro组件,用于创建UI结构或布局,如页面模板。因此,任何可以在组件中实现的功能都有可能在布局中实现。在src/layouts目录下,我们可以找到BaseLayout.astro、index.astro等文件。

刚刚完成了第一个Astro布局后,我们需要在Astro页面中使用它。下面是一个示例,展示了如何在index.astro文件中导入BaseLayout组件:

```astro

--- import BaseLayout from '../layouts/BaseLayout.astro'; --- <BaseLayout></BaseLayout>

```

接下来,我们可以在About页面中使用BaseLayout组件。在about.astro文件中,我们可以这样写:

```astro

BaseLayout

```

通过这种方式,我们可以避免在不同页面中重复编写相同的代码,提高代码的可维护性和可读性。

请根据以下内容重构代码:

```javascript

import { Header } from '../components/Header.astro';

const pageTitle = 'Bejamas';

function BejamasTemplate() {

return (

{pageTitle}

{pageTitle}

);

}

export default function AboutBejamas() {

return (

Jamstack development agency.

);

}

```

关于BaseLayout部分,你可以按照以下方式进行重构:

```javascript

import { BaseLayout } from '../layouts/BaseLayout.astro';

function AboutBaseLayout() {

return (

Jamstack development agency.

);

}

export default AboutBaseLayout;

```

```markdown# 使用Astro生成页面

## 导入头部组件

```javascript

import Header from '../components/Header.astro';

const { pageTitle } = Astro.props;

```

HTML模板

```html

{pageTitle}

{pageTitle}

```

Astro属性

```javascript

const { pageTitle, pageDescription } = Astro.props;

```

首页标题

```javascript

index.astro pageTitle

```

## 导入基本布局组件

```javascript

import BaseLayout from '../layouts/BaseLayout.astro';

```

首页内容为“Bejamas”的页面

```html

```

关于页面标题为“About”的页面

```html

import BaseLayout from '../layouts/BaseLayout.astro';

const pageTitle = 'About';

Jamstack development agency.

```

目前为止,我还没给你展示任何结果。原因是我们还缺少样式。那么我们就加一些CSS吧。Astro中的样式

Astro项目可以用很多方法进行样式声明,我们在这里无法涵盖所有。然而你应该知道,Astro支持任何你能想到的方法。你可以编写纯CSS、Sass和CSS模块,甚至可以导入你喜欢的CSS库,比如Tailwind。

```javascriptimport BaseLayout from '../layouts/BaseLayout.astro';

const pageTitle = 'Bejamas';

// 主页内容

const homeContent = `

Jamstack Developers for hire

We build
fast sites & apps.

Maximize your business potential...

Start project

`;

```

```javascriptimport BaseLayout from '../layouts/BaseLayout.astro';

const pageTitle = 'Bejamas';

async function getPosts() {

const response = await fetch('bejamas.io/api/blog?category=case-studies');

const data = await response.json();

const posts = data.posts;

}

getPosts().then(() => {

// Do something with the posts, e.g. display them on a page

});

```

最酷的是,所有这些都是在构建时发生的,我们将只向浏览器发送静态HTML。这是向全局CSS添加样式后的结果:点击这里查看demo。

管理内容

当涉及到创建和管理你的内容时,Astro给你两个选择:Markdown和MDX。MDX类似于标准的Markdown,但有额外的功能。它允许你在你的Markdown内容中使用变量、JSX表达式和组件。以下是一个简单的示例:

```jsx

import React from 'react';

import { MDXProvider } from '@mdxjs/react';

import { createGlobalStyle } from 'styled-components';

import { PageSection } from './components/PageSection';

import { CodeBlock } from './components/CodeBlock';

const GlobalStyles = createGlobalStyle`

body {

font-family: Arial, sans-serif;

}

`;

const components = {

PageSection,

CodeBlock,

};

export default function App() {

return (

{/* Your content here */}

);

}

```

在我们进一步讨论之前,有必要提到Astro v2引入了内容集合,这是一种在Astro项目中组织内容的绝佳方式。我们将在未来的教程中写更多关于这个主题的内容。

首先,你需要创建一个新的博客文章页面。你可以通过运行以下命令来做到这一点:

```bash

npx create-pages blog --template ./src/pages/src/pages --url localhost:3000/blog

```

然后,你需要将你的新博客文章添加到你的内容集合中。在你的文章目录(`./src/pages/src/pages`)中,你会找到一个名为 `index.md` 的文件和两个名为 `[post]-*.md` 的模板文件。在这个目录中创建一个新的Markdown文件,例如 `jamstack.md`,并添加以下内容:

```markdown

--- title: 'Jamstack Explained' pubDate: 2020-12-14 description: 'Jamstack is no longer a buzzword over which dev keyword warriors brawl. It has grown to become a booming ecosystem of tools helping developers ship performant websites, progressive web apps, and other projects with benefits too good to ignore.' author: 'Denis Kostrzewa' image: url: '<https://bejamas.io/_next/image/?.>..' alt: 'Jamstack Explained Photo' --- # Jamstack Explained Jamstack is no longer a buzzword over which dev keyword warriors brawl. It has grown to become a booming ecosystem of tools helping developers ship performant websites, progressive web apps, and other projects with benefits too good to ignore.

你当然不希望你的文章看起来像这样,肯定希望把你的网站设计融入其中,对吗?让我们为我们的博客内容创建一个布局。

```

接下来,你需要创建一个新的布局文件以显示你的博客文章。在你的项目根目录下运行以下命令:

```bash

npx create-layouts src/layoutsBlogLayout.astro --template ./src/pages/src/pages/[post].md

```

最后,更新你的博客文章URL以使用新创建的布局。打开 `blog.md` 文件并将以下内容替换为你在上一步中设置的 `localhost:3000/blog/jamstack` URL:

```markdown

--- title: 'Jamstack Explained' pubDate: 2020-12-14 description: 'Jamstack is no longer a buzzword over which dev keyword warriors brawl. It has grown to become a booming ecosystem of tools helping developers ship performant websites, progressive web apps, and other projects with benefits too good to ignore.' author: 'Denis Kostrzewa' image: url: '<https://bejamas.io/_next/image/?.>..' alt: 'Jamstack Explained Photo' --- # Jamstack Explained Jamstack is no longer a buzzword over which dev keyword warriors brawl. It has grown to become a booming ecosystem of tools helping developers ship performant websites, progressive web apps, and other projects with benefits too good to ignore.

你当然不希望你的文章看起来像这样,肯定希望把你的网站设计融入其中,对吗?让我们为我们的博客内容创建一个布局。

```

请根据提供的内容完成内容重构,并保持段落结构:

```jsx

import Header from '../components/Header.astro';

import '../styles/global.css';

const { frontmatter } = Astro.props;

```

重构后的代码:

```jsx

import Header from '../components/Header.astro';

import '../styles/global.css';

// ... 其他代码

```

在撰写博客文章时,我们需要考虑以下几个方面:

1. 使用frontmatter来定义文章的元数据,如布局、标题、发布日期、描述、作者等。

2. 注意插槽元素,这是内容出现在最终HTML页面上的地方。

3. 将布局添加到内容中,可以使用layouts文件夹中的预定义布局。

4. 如果需要嵌套布局,可以使用BaseLayout和BlogLayout。

下面是一个示例:

```markdown

--- layout: ../../layouts/BlogLayout.astro

title: 'Jamstack Explained'

pubDate: 2020-12-14

description: 'Jamstack is not about a specific technology...'

author: 'Denis Kostrzewa'

image:

url: '..'

alt: 'Jamstack Explained Photo'

---

# Jamstack Explained

Jamstack is no longer a buzzword over which dev keyword warriors brawl. It has grown to become a booming ecosystem of tools helping developers ship performant websites, progressive web apps, and other projects with benefits too good to ignore.

```

在这个示例中,我们使用了BlogLayout作为布局,并定义了文章的元数据。如果需要嵌套布局,可以使用BaseLayout和BlogLayout。

```javascriptimport BaseLayout from "./BaseLayout.astro";

const { frontmatter } = Astro.props;

{frontmatter.title}

{frontmatter.description}

Author: {frontmatter.author}

{frontmatter.image.alt}

```

多么整洁,不是吗?

```

import BaseLayout from './BaseLayout.astro';

const { frontmatter } = Astro.props;

const blogs = await Astro.glob('../pages/blog/*.md');

function BlogPost({ frontmatter: { title, date, tags, content }, path }) {

return (

{title}

{date}

);

}

return (

,

{blogs.map((path, index) => )}

);

```

请根据以下内容完成代码重构:

```html

Our Blog

    {blogs.map((blog) => (

  • {blog.frontmatter.image.alt}

    {blog.frontmatter.title}

    {blog.frontmatter.description}

    Read more

  • ))}

```

index.astro

global.css

如果你点击”Read more”链接,你会看到每篇文章的内容。这里是目前为止项目的demo。添加脚本。

Astro 是一个基于 Vuejs 的 UI 框架,它可以灵活地与你喜欢的 JS 框架集成。而且你不必只使用一个框架,你可以使用多个。在我们的项目中,我想在主页的底部添加一个 FAQ 部分。我没有太多的时间,只想使用别人的作品,以便能够尽快创建我的页面。我搜索了一下 FAQ 的 React 组件,出现了一些链接。

那么问题来了,如何将 React 组件添加到你的项目中。首先,你需要将 React 添加到你的项目中。在你的终端运行以下命令:

```bash

npx astro add react

```

这将在 `src/components.jsx` 文件中添加一个 React 组件。由于我想导入一个 React 组件而不是自己写,所以我需要先把它添加到我的项目中。所以我将用我的终端来安装这个包:

```bash

npm install react-faq-component

```

接下来,在 `src/components.jsx` 文件中引入并注册这个组件:

```javascript

import React from 'react';

import ReactFaqComponent from 'react-faq-component';

const components = {

Faq: ReactFaqComponent,

};

export default components;

```

现在你可以在其他地方使用这个 FAQ 组件了。例如,在 `src/App.vue` 文件中:

```html

```

以下是重构后的内容:

```javascript

import React, { useEffect, useState } from 'react';

import Faq from 'react-faq-component';

import './FAQ.css';

const data = { rows: [] };

const styles = {};

const config = {};

export default function FAQ() {

return

;

}

```

在页面中导入组件:

```javascript

import BaseLayout from '../layouts/BaseLayout.astro';

import Faq from '../components/FAQ.jsx';

const pageTitle = 'Bejamas';

```

在模板中使用组件:

```html

Questions you probably want to ask

```

Astro框架的组件在默认情况下只会在服务端渲染为静态HTML,因此,如果你想让这些组件具有交互性,你需要使用Astro指令。以下是一些常用的Astro指令:

1. `client:load`:在页面加载时加载组件。

2. `client:init`:在组件首次渲染时调用钩子函数。

3. `client:update`:在组件发生更改时调用钩子函数。

4. `client:remove`:在组件被移除时调用钩子函数。

5. `client:state`:使用JavaScript状态钩子来更新组件的状态。

在你的例子中,你可以使用`client:load`指令来实现页面加载时加载FAQ组件。你可以这样写:

```html

```

这将确保在页面加载时,FAQ组件会被添加到页面上并具有交互性。

Astro网站是开箱即用型的静态网站,这意味着所有的页面在最后都是静态HTML。因此,如果你拥有一台服务器,你部署网站的第一个选择是仅将你的最终HTML文件上传到你的服务器。

在你部署你的网站之前,你需要构建它。要做到这一点,你需要从你的Astro项目的根目录中运行构建命令。你可以通过在你的终端运行以下命令来做到这一点:

```bash

npm run build

```

或者

```bash

dist/dist

```

构建完成后,你可以根据Astro网站上的指南,将其部署到不同的部署服务上,如Netlify、Vercel、Deno等。

好的,以下是重构后的内容:

以上就是本文的全部内容。如果你觉得这篇文章对你有所帮助,欢迎点赞、收藏或转发哦~