A modern version of templating engines and Jquery.
In this age of high-level frameworks, this stack gives you a clean slate similar to the experience of web developers ages ago, when SPA was still an experimental concept and when Jquery was still king, only this time with the benefits of cutting-edge technology and modern day advancements.
best used for
This stack works best with websites that are content-heavy, not needing heavy logic, but still needs scripts for things like carousels, dropdowns, navbars, etc. And unlike other more popular JS frameworks, Your code will feel much more light-weight and more closer to traditional javascript, because you are not rendering markup with your logic, but instead attaching logic to your markup.
Try it out!
Astro already has official support for Alpine with the @astrojs/alpine
integration. You can then start writing scripts with either Alpine.data
or inlining it with x-data
:
<script>
import Alpine from "alpinejs";
document.addEventListener("alpine:init", () => {
Alpine.data("Component", /*...*/);
});
</script>
Important things to know:
@astrojs/alpine
does two things to add alpine to the project, one is letting you add an entrypoint
where you could add plugins and custom directives to Alpine, and then it attaches the Alpine module script at the <head />
of every page.
<head>
<!-- your custom astro scripts will be placed above -->
<script type="module" src="...">Alpine.start()</script>
</head>
This allows you to use Astro's script tags without worrying about Alpine initializing before registering your alpine:init
listeners.
You can even create a utility function for it:
// utils.js
export function defineComponent(name, cb) {
document.addEventListener('alpine:init', () => {
Alpine.data(name, cb);
})
}
<script>
import { defineComponent } from "./utils.js";
defineComponent("Component", () => { /* ... */ });
</script>
Just note that if you do import Alpine
on the server, you'll most likely get an error, avoid that by only importing utils.js
inside <script />
tags.
Another thing is to be aware of is name conflicts when using Alpine.data()
, they are not scoped and there's no way for us to create these names dynamically with Astro, so a naming convention is needed to avoid potential conflicts.
Top comments (1)
ayus pre