Astro supports most static assets with zero configuration required. You can use the
import
statement anywhere in your project JavaScript (including your Astro frontmatter) and Astro will include a built, optimized copy of that static asset in your final build.
@import
is also supported inside of CSS &
<style>
tags.
The following file types are supported out-of-the-box by Astro:
Astro Components (
.astro
)
Markdown (
.md
,
.markdown
, etc.)
JavaScript (
.js
,
.mjs
)
TypeScript (
.ts
,
.tsx
)
NPM Packages
JSON (
.json
)
JSX (
.jsx
,
.tsx
)
CSS (
.css
)
CSS Modules (
.module.css
)
Images & Assets (
.svg
,
.jpg
,
.png
, etc.)
Additionally, you can extend Astro to add support for different
UI Frameworks
like React, Svelte and Vue components. You can also install the
Astro MDX integration
and use
.mdx
files in your project.
You can place any static asset in the
public/
directory
of your project, and Astro will copy it directly into your final build untouched.
public/
files are not built or bundled by Astro, which means that any type of file is supported. You can reference a
public/
file by a URL path directly in your HTML templates.
Astro doesn’t perform any type checking itself.
Type checking should be taken care of outside of Astro, either by your IDE or through a separate script. For type checking Astro files, the
astro check
command
is provided.
Astro includes built-in support for JSX (
*.jsx
and
*.tsx
) files in your project. JSX syntax is automatically transpiled to JavaScript.
While Astro understands JSX syntax out-of-the-box, you will need to include a framework integration to properly render frameworks like React, Preact and Solid. Check out our
Using Integrations
guide to learn more.
If you’ve installed an NPM package, you can import it in Astro.
---
import { Icon } from'astro-icon';
---
If a package was published using a legacy format, Astro will try to convert the package to ESM so that
import
statements work. In some cases, you may need to adjust your
vite
config
for it to work.
Astro supports importing CSS files directly into your application. Imported styles expose no exports, but importing one will automatically add those styles to the page. This works for all CSS files by default, and can support compile-to-CSS languages like Sass & Less via plugins.
Astro supports CSS Modules using the
[name].module.css
naming convention. Like any CSS file, importing one will automatically apply that CSS to the page. However, CSS Modules export a special default
styles
object that maps your original classnames to unique identifiers.
CSS Modules help you enforce component scoping & isolation on the frontend with uniquely-generated class names for your stylesheets.
All other assets not explicitly mentioned above can be imported via ESM
import
and will return a URL reference to the final built asset. This can be useful for referencing non-JS assets by URL, like creating an image element with a
src
attribute pointing to that image.
It can also be useful to place images in the
public/
folder as explained on the
project-structure page
.
Astro.glob()
only takes one parameter: a relative
glob pattern
matching the local files you’d like to import. It’s asynchronous, and returns an array of each matching file’s exports.
src/components/my-component.astro
---
// imports all files that end with `.md` in `./src/pages/post/`
A glob pattern is a file path that supports special wildcard characters. This is used to reference multiple files in your project at once.
For example, the glob pattern
./pages/**/*.{md,mdx}
starts within the pages subdirectory, looks through all of its subdirectories (
/**
), and matches any filename (
/*
) that ends in either
.md
or
.mdx
(
.{md,mdx}
).
Content collections
provide a
getCollection()
API
for loading multiple files instead of
Astro.glob()
. If your content files (e.g. Markdown, MDX, Markdoc) are located in collections within the
src/content/
directory, use
getCollection()
to
query a collection
and return content entries.
We encourage Astro users to avoid Node.js builtins (
fs
,
path
, etc.) whenever possible. Astro is compatible with multiple runtimes using
adapters
. This includes
Deno
and
Cloudflare Workers
which do not support Node builtin modules such as
fs
.
Our aim is to provide Astro alternatives to common Node.js builtins. However, no such alternatives exist today. So, if you
really
need to use these builtin modules we don’t want to stop you. Astro supports Node.js builtins using Node’s newer
node:
prefix. If you want to read a file, for example, you can do so like this:
src/components/MyComponent.astro
---
// Example: import the "fs/promises" builtin from Node.js
With
Vite
and compatible
Rollup
plugins, you can import file types which aren’t natively supported by Astro. Learn where to find the plugins you need in the
Finding Plugins
section of the Vite Documentation.
Related recipe:
Installing a Vite or Rollup plugin