small icon of Elian

Elian.codes

♻️ Upgrading my website to Astro v1.0

Upgrading my website to Astro v1.0

So, Astro came out with some beta versions of their v1.0 release of the framework. I upgraded my website to use that version, since I was still running on v0.24 (2 or 3 months behind). The following are the changes I had to do to get it working.

New Markdown API

Astro.glob() vs. Astro.fetchContent()

Astro has replaced the ‘old’ Astro.fetchContent() with a newer version called Astro.glob().

This is what the older API looked like:

---
const blogposts = Astro.fetchContent("*.md");
---

<body>
  <ul>
    {
      blogposts.map((blogpost) => {
        return <li>{blogpost.title}</li>;
      })
    }
  </ul>
</body>

In my eyes the new API looks way better and is more developer friendly since it uses await, which also means, you can use .then() & .catch().

Here is what it looks like:

---
const blogposts = await Astro.glob("*.md");
---

<body>
  <ul>
    {
      blogposts.map((blogpost) => {
        return <li>{blogpost.frontmatter.title}</li>;
      })
    }
  </ul>
</body>

An example of what the .then() use, could look like:

---
const blogposts = await Astro.glob("./**/*.md").then((posts) =>
  posts.sort(
    (a, b) =>
      new Date(b.frontmatter.createdAt) - new Date(a.frontmatter.createdAt),
  ),
);
---

Frontmatter and variables

Did you notice in the above example that I used blogpost.frontmatter.title?

Yup, that’s an example of the new Markdown API.

The new API gives you access to the frontmatter as a whole with variables as an object.

Check out the official docs about this here.

Default script behaviour

The default <script> behaviour has changed to default hoist, which means that Astro will process the scripts by default. This behaviour can be changed by using <script is:inline> to tell the Astro compiler to leave your script unchanged and unprocessed.

More about that here.

New configuration API

Some changes also ocurred in the astro.config.mjs file.

Here’s an example of the new API:

import { defineConfig } from "astro/config";
import sitemap from "@astrojs/sitemap";

// https://astro.build/config
export default defineConfig({
  trailingSlash: "ignore",
  site: "https://www.elian.codes",
  server: {
    port: 3000,
  },
  integrations: [
    sitemap({
      canonicalURL: "https://www.elian.codes",
    }),
  ],
});

Note that the integrations object is a new thing, which basically contains the renderers and other Astro packages. Here I’ve used it to load in the sitemap configuration, since the sitemap: true is depricated.

Keep in mind that the @astrojs/sitemap is a new and seperate package, so should be installed too.

That’s basically all I had to do. If you’re interested to upgrade your Astro website to v1.0-beta and need some more guidance, here’s the Official upgrade & migration guide