In this article we will be going over how to I used laravel-export to deploy the very blog you're reading right now; to Cloudflare Pages, Netlify and Vercel.

Earlier this week Spatie released a new package called laravel-export, which bundles your Laravel application into a statically host-able website. To me, this is a great addition to the Laravel ecosystem, as it unlocks a whole new paradigm for hosting Laravel applications.
A method of hosting which would be perfect for websites like:
Which don’t rely on making calls to a backend server, but display static information.
In this article we will be going over how to I used laravel-export to deploy the very blog you’re reading right now; to Cloudflare Pages, Netlify and Vercel.
Before we can start deploying we need to install the package.
composer require spatie/laravel-export
We will also be publishing the config file so we can leverage the hooks.
php artisan vendor:publish --provider=Spatie\\Export\\ExportServiceProvider
The after hook depends on the hosting platform but the before hook is the same everywhere.
return [
'before' => [
'assets' => 'npm run build',
],
];
Running php artisan export right now will create a new dist folder with our bundled application.
Now let’s upload this folder to some hosting providers.
To upload our static site we will be using Cloudflare’s CLI called wrangler.
npm install wrangler --save-dev
With wrangler installed we can run the following command to deploy our dist folder.
npx wrangler pages deploy dist
The first time you run this command you need to go through a few steps:
main.Deployment done!
But if you were to visit the preview link generated by Cloudflare you might notice some things not working quite right, mainly compiled css/js and links.
This is because the the laravel-export package uses the APP_URL environment value to generate the links and the locations of the compiled assets.
At this point you should however have a hostname provided by Cloudflare which you can find in their dashboard.
Since I used boydbloemsma as my project name my hostname is boydbloemsma.pages.dev, we need to replace the old APP_URL value with this hostname.
Then we can add the wrangler deploy command to the after hook and we are off to the races.
return [
'after' => [
'deploy' => 'npx wrangler pages deploy dist',
],
];
All we have to do now is run php artisan export and seconds later our application is deployed to Cloudflare.
For Vercel we will be using their vercel CLI.
npm i -g vercel
We will need to login to Vercel so we run the following command.
vercel login
When this is done we can start deploying our dist folder.
vercel deploy dist --prod
The first time we run this command we need to create our project, I chose to name mine boydbloemsma again which provides me with the boydbloemsma.vercel.app hostname.
Don’t forgot to update your
APP_URLwith this hostname.
Vercel then adds a .vercel folder in our dist folder to store the link between the folder and the project.
We need to keep this .vercel folder because otherwise we will be prompted to link to a project everytime.
Luckily the export-laravel package has a option called clean_before_export, changing this value to false makes sure the destination folder is not emptied before starting the export.
return [
'clean_before_export' => false,
];
We also have to update the after command.
return [
'after' => [
'deploy' => 'vercel deploy dist --prod',
],
];
And just like that running php artisan export deploys to Vercel.
And last but not least, Netlify also has a CLI we will be using.
npm install netlify-cli -g
Similar to Vercel we also need to login here.
netlify login
Then we can deploy our folder.
netlify deploy --dir=dist --prod
Again we will be prompted to create a new project and we will be provided a hostname, boydbloemsma.netlify.app in this case.
Don’t forgot to update your
APP_URLwith this hostname.
Update the after command.
return [
'after' => [
'deploy' => 'netlify deploy --dir=dist --prod',
],
];
Run php artisan export and we’re live.
We’ve just deployed our Laravel website on three separate static hosting platforms!
While working on this article I did come across a few issues that you might run in to as well.
The @production blade tag doesn’t work.
This makes sense of course since we didn’t update our .env to production, but it is something to remember.
Any preview links generated by the hosting platforms aren’t really usable since they get their assets from the production hostname.