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
Jamstack development agency.
```
```javascript
// index.astroabout.astro
export default function App() {
return (
Home
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}
```
在上述代码片段中,我们可以看到如何在代码栅栏内定义本地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}
);
}
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}
```
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。
.container { /* */ }
nav {
display: flex;
gap: 1rem;
}
nav a { /* */ }
```javascriptimport BaseLayout from '../layouts/BaseLayout.astro';
const pageTitle = 'Bejamas';
// 主页内容
const homeContent = `
Jamstack Developers for hire
We build
fast sites & apps.
Maximize your business potential...
`;
```
```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}
```
多么整洁,不是吗?
```
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 (
,
);
```
请根据以下内容完成代码重构:
```html
Our Blog
-
{blog.frontmatter.title}
{blog.frontmatter.description}
{blogs.map((blog) => (
))}
```
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等。
好的,以下是重构后的内容:
以上就是本文的全部内容。如果你觉得这篇文章对你有所帮助,欢迎点赞、收藏或转发哦~