Package Exports
- astro
Readme
π©βπ Astro
A next-generation static-site generator with partial hydration. Use your favorite JS framework and ship bare-minimum JS (or none at all!).
π§ Setup
# currently hidden during private beta, please don't share :)
npm install astro@shhhhhπ§ Development
Add a dev npm script to your /package.json file:
{
"scripts": {
"dev": "astro dev ."
}
}Then run:
npm run devβοΈ Configuration
To configure Astro, add a astro.config.mjs file in the root of your project. All of the options can be omitted. Here are the defaults:
export default {
/** Where to resolve all URLs relative to. Useful if you have a monorepo project. */
projectRoot: '.',
/** Path to Astro components, pages, and data */
astroRoot: './astro',
/** When running `astro build`, path to final static output */
dist: './_site',
/** A folder of static files Astro will copy to the root. Useful for favicons, images, and other files that donβt need processing. */
public: './public',
/** Extension-specific handlings */
extensions: {
/** Set this to "preact" or "react" to determine what *.jsx files should load */
'.jsx': 'react',
},
};π§ Partial Hydration
By default, Astro outputs zero client-side JS. If you'd like to include an interactive component in the client output, you may use any of the following techniques.
<MyComponent />will render an HTML-only version ofMyComponent(default)<MyComponent:load />will renderMyComponenton page load<MyComponent:idle />will use requestIdleCallback() to renderMyComponentas soon as main thread is free<MyComponent:visible />will use an IntersectionObserver to renderMyComponentwhen the element enters the viewport
π Styling
If youβve used Svelteβs styles before, Astro works almost the same way. In any .astro file, start writing styles in a <style> tag like so:
<style>
.scoped {
font-weight: bold;
}
</style>
<div class="scoped">Iβm a scoped style</div>π Sass
Astro also supports Sass out-of-the-box; no configuration needed:
<style lang="scss">
@use "../tokens" as *;
.title {
color: $color.gray;
}
</style>
<h1 class="title">Title</h1>Supports:
lang="scss": load as the.scssextensionlang="sass": load as the.sassextension (no brackets; indent-style)
π¦ Autoprefixer
We also automatically add browser prefixes using Autoprefixer. By default, Astro loads the default values, but you may also specify your own by placing a Browserslist file in your project root.
π Tailwind
Astro can be configured to use Tailwind easily! Install the dependencies:
npm install @tailwindcss/jit tailwindcssAnd also create a tailwind.config.js in your project root:
module.exports = {
// your options here
}Note: a Tailwind config file is currently required to enable Tailwind in Astro, even if you use the default options.
Then write Tailwind in your project just like youβre used to:
<style>
@tailwind base;
@tailwind components;
@tailwind utilities;
</style>π± Collections (beta)
Astroβs Collections API is useful for grabbing collections of content. Currently only *.md files are supported.
π½ Markdown
// pages/blog.astro
---
import PostPreview from '../components/PostPreview.astro';
const blogPosts = import.meta.collections('./post/*.md');
---
<main>
<h1>Blog Posts</h1>
{blogPosts.map((post) => (
<PostPreview post={post} />
)}
</main>This will load all markdown files located in /pages/post/*.md, compile them into an array, then expose them to the page.
If you were to inspect the array, youβd find the following schema:
const blogPosts = [
{
content: string, // Markdown converted to HTML
// all other frontmatter data
},
// β¦
];π§βπ³ Advanced usage
All of the following options are supported under the 2nd parameter of import.meta.collections():
const collection = import.meta.collections('./post/*.md', {
/** If `page` is omitted, all results are returned */
page: 1, // β οΈ starts at 1, not 0
/** How many items should be returned per-page (ignored if `page` is missing; default: 25) */
perPage: 25,
/** How items should be sorted (default: no sort) */
sort(a, b) {
return new Date(b.date) - new Date(a.date); // sort newest first, by `date` in frontmatter
}
/** Should items be filtered by their frontmatter data? */
filter(post) {
return post.tag === 'movie'; // (optional) only return posts tagged "movie"
}
});π Build & Deployment
Add a build npm script to your /package.json file:
{
"scripts": {
"dev": "astro dev .",
"build": "astro build ."
}
}Then run:
npm run buildNow upload the contents of /_site_ to your favorite static site host.