I’ve been deploying applications on serverless solutions since 2010. Recently, I discovered Nuxt.js and I wanted to create this post on how to quickly set up a static Nuxt.js app on AppEngine, the Google Cloud PaaS.
Nuxt.js is described as
The Intuitive Vue Framework
Build your next Vue.js application with confidence using NuxtJS.
An open source framework making web development simple and powerful.
For the demo, we will use a fresh new project. To do this, execute the
npx create-nuxt-app command to create a simple Nuxt.js application.
$ node -v v12.16.3 $ npx create-nuxt-app create-nuxt-app v2.15.0 ✨ Generating Nuxt.js project in . ? Project name nuxt-static-deploy-appengine ? Project description My glorious Nuxt.js project ? Author name Julien Landuré ? Choose programming language TypeScript ? Choose the package manager Npm ? Choose UI framework None ? Choose custom server framework None (Recommended) ? Choose the runtime for TypeScript Default ? Choose Nuxt.js modules (Press <space> to select, <a> to toggle all, <i> to inv ert selection) ? Choose linting tools Prettier ? Choose test framework None ? Choose rendering mode Universal (SSR) ? Choose development tools (Press <space> to select, <a> to toggle all, <i> to invert selection) ... 🎉 Successfully created project nuxt-static-deploy-appengine
As described in the command line, run the
npm run start script to get your app running on
Let's edit the
index.vue and write this html:
<h2 class="subtitle">Hello Nuxt on AppEngine 🎉</h2>
And it works! Very easy to see our modification instantly.
To build the app statically, run the
npm run generate command:
$ npm run generate > email@example.com generate .../nuxt-static-deploy-appengine > nuxt generate ℹ Production build 10:52:36 ✔ Builder initialized 10:52:37 ✔ Nuxt files generated 10:52:37 ℹ Starting type checking service... nuxt:typescript 10:52:39 ✔ Client Compiled successfully in 6.95s ✔ Server Compiled successfully in 1.13s Hash: c5e482cb9772cddb1178 Version: webpack 4.43.0 Time: 6951ms Built at: 05/27/2020 10:52:46 AM Asset Size Chunks Chunk Names ../server/client.manifest.json 6.6 KiB [emitted] 98f4a70ff71f0382866c.js 2.31 KiB 3 [emitted] [immutable] runtime 9fc3f5e914943c5b3a9b.js 2.97 KiB 2 [emitted] [immutable] pages/index LICENSES 389 bytes [emitted] a51444c83f14a6afaeb5.js 153 KiB 1 [emitted] [immutable] commons.app d267ba93006b46dadaa8.js 49.2 KiB 0 [emitted] [immutable] app + 2 hidden assets Entrypoint app = 98f4a70ff71f0382866c.js a51444c83f14a6afaeb5.js d267ba93006b46dadaa8.js Hash: fbd0c6af7579246a49e7 Version: webpack 4.43.0 Time: 1127ms Built at: 05/27/2020 10:52:47 AM Asset Size Chunks Chunk Names 818a9680ee5eeafdfb4b.js 3.05 KiB 1 [emitted] [immutable] pages/index server.js 26.7 KiB 0 [emitted] app server.manifest.json 145 bytes [emitted] Entrypoint app = server.js ℹ Generating pages ✔ Generated /
✨ Congratulations, we built our first Nuxt.js application!
ProTips: We can check the files in the
dist folder or run it with
npx http-server dist.
Then, to share the project with the rest of the world, we can deploy it on AppEngine. Appengine comes with a lot of features and quotas.
It is free for a basic usage thanks to its quotas BUT we have to enable billing to enjoy it. As a new customer, we get $300 to spend on Google Cloud Platform products during your free trial.
console.cloud.google.com and create a new Google Cloud Platform project.
Please save the [PROJECT_ID] of the project: you have to replace the
nuxt-static-deploy with your [PROJECT_ID] for the rest of the post.
ProTips: we can retrieve the [PROJECT_ID] in the url of the web console like
https://console.cloud.google.com/appengine/start?project=nuxt-static-deploy where nuxt-static-deploy is my [PROJECT_ID].
ProTips: To create a project to host your app, we can also use the
gcloud projects create command. we need to enter a [PROJECT_ID],
nuxt-static-deploy for example.
# Create a project $ gcloud projects create nuxt-static-deploy Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/nuxt-static-deploy]. Waiting for [operations/cp.4929250122387435991] to finish...done. Enabling service [cloudapis.googleapis.com] on project [nuxt-static-deploy]... Operation "operations/acf.803672e3-74b0-43e1-8a6b-3d37a4a0975b" finished successfully. # List the billing accounts $ gcloud beta billing accounts list ACCOUNT_ID NAME OPEN 00ADEE-870384-XXXXXX my_account True # Link the billing account to my project $ gcloud beta billing projects link nuxt-static-deploy --billing-account=00ADEE-870384-XXXXXX billingAccountName: billingAccounts/00ADEE-870384-XXXXXX billingEnabled: true name: projects/nuxt-static-deploy/billingInfo projectId: nuxt-static-deploy # Enable Cloud Build API $ gcloud --project nuxt-static-deploy services enable cloudbuild.googleapis.com
AppEngine supports various programming languages: python, go, java, php, nodejs etc.
To deploy static files, the best practice is to use the
Let's create a file in
runtime: python37 handlers: - url: / static_files: index.html upload: index.html secure: always - url: /(.*) static_files: \1 upload: (.*) secure: always
For more information on the descriptor file, please read this doc.
Don't forget to copy the file in our
dist folder using this command
cp .appengine/app.yaml dist/.
ProTips: We can add it to the
build script in your
Deploy our app using the
gcloud app deploy command:
$ gcloud app deploy --project nuxt-static-deploy dist You are creating an app for project nuxt-static-deploy. WARNING: Creating an App Engine application for a project is irreversible and the region cannot be changed. More information about regions is at <https://cloud.google.com/appengine/docs/locations>. Please choose the region where you want your App Engine application located:  asia-east2 (supports standard and flexible)  asia-northeast1 (supports standard and flexible)  asia-northeast2 (supports standard and flexible)  asia-northeast3 (supports standard and flexible)  asia-south1 (supports standard and flexible)  australia-southeast1 (supports standard and flexible)  europe-west (supports standard and flexible)  europe-west2 (supports standard and flexible)  europe-west3 (supports standard and flexible)  europe-west6 (supports standard and flexible)  northamerica-northeast1 (supports standard and flexible)  southamerica-east1 (supports standard and flexible)  us-central (supports standard and flexible)  us-east1 (supports standard and flexible)  us-east4 (supports standard and flexible)  us-west2 (supports standard and flexible)  us-west3 (supports standard and flexible)  us-west4 (supports standard and flexible)  cancel Please enter your numeric choice: 7 Creating App Engine application in project nuxt-static-deploy and region [ europe-west]....done. Services to deploy: descriptor: [.../nuxt-static-deploy-appengine/dist/app.yaml] source: [.../nuxt-static-deploy-appengine/dist] target project: [nuxt-static-deploy] target service: [default] target version: [20200602t094056] target url: [https://20200602t094056-dot-nuxt-static-deploy.ew.r.appspot.com] (add --promote if you also want to make this service available from [https://nuxt-static-deploy.ew.r.appspot.com]) Do you want to continue (Y/n)? Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 12 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Deployed service [default] to [https://20200602t094056-dot-nuxt-static-deploy.ew.r.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
Go here at https://nuxt-static-deploy.appspot.com/ to see our first Nuxt.js app deployed with AppEngine.
Nuxt.js is a cool technology to create Vue.js app and is trending with the release of
Nuxt.js@nuxt_jsIntroducing @nuxt/content ✍️
The content/ directory for your Nuxt app, acting as a git-based headless CMS.
✅ Vue components in Markdown
✅ Powerful QueryBuilder API
✅ Handles MD, CSV, YAML, JSON
✅ Blazing fast hot reload in dev
✅ Syntax highlighting
content.nuxtjs.org11:36 AM - 22 May 2020
AppEngine comes with a lot of features:
- 🔁 Multiple versions available to do A/B testing or Traffic Splitting (each version has a different timestamp on the Versions Page on Appengine)
- 🔐 Custom Domain Mapping & auto-renew, free, managed SSL certificates
- 💸 Free quota (1 GB bandwidth)
- ⭐️ No instance used with Python37 runtime and our configuration because we have only static content
- 🌐 Static content available through Google CDN and its Edge Network
- ⚡️ Managed network: Surprise 🎉 our project uses the http3 procotol
Feel free to contact me on Twitter if you have questions!
NB: You can find another guide on Nuxt.js with AppEngine here in the official documentation.