<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rootasjey</title>
    <description>The latest articles on DEV Community by rootasjey (@rootasjey).</description>
    <link>https://dev.to/rootasjey</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F94617%2F849961c3-f9c5-4158-9b95-839d3c1fcc11.jpeg</url>
      <title>DEV Community: rootasjey</title>
      <link>https://dev.to/rootasjey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rootasjey"/>
    <language>en</language>
    <item>
      <title>Horizontal Cricket</title>
      <dc:creator>rootasjey</dc:creator>
      <pubDate>Sun, 04 Aug 2024 23:34:07 +0000</pubDate>
      <link>https://dev.to/rootasjey/horizontal-cricket-4did</link>
      <guid>https://dev.to/rootasjey/horizontal-cricket-4did</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2024-07-24"&gt;Frontend Challenge v24.07.24&lt;/a&gt;, Glam Up My Markup: Recreation&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I played with font and tried to emphasis important information.&lt;br&gt;
I created blank spaces in order to make information more digest.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;



&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/qhypym?view=preview&amp;amp;module=%2Fstyles.css"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I focused on text, layout and spacing since it's what I love the most. I opted for a horizontal layout for a change.&lt;/p&gt;

&lt;p&gt;License: MIT.&lt;/p&gt;

&lt;p&gt;Have an excellent day!&lt;br&gt;
Thank you for reading.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Yes. You can deploy Nuxt on Firebase App Hosting (2024)</title>
      <dc:creator>rootasjey</dc:creator>
      <pubDate>Fri, 07 Jun 2024 00:12:46 +0000</pubDate>
      <link>https://dev.to/rootasjey/yes-you-can-deploy-nuxt-on-firebase-app-hosting-2024-44bd</link>
      <guid>https://dev.to/rootasjey/yes-you-can-deploy-nuxt-on-firebase-app-hosting-2024-44bd</guid>
      <description>&lt;p&gt;Firebase team just announced, at &lt;a href="https://youtu.be/qyhdKb8liEA" rel="noopener noreferrer"&gt;Google I/O 2024&lt;/a&gt;, a new product to deploy fullstack web app: &lt;a href="https://firebase.google.com/docs/app-hosting?authuser=1" rel="noopener noreferrer"&gt;Firebase App Hosting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Previously we had &lt;a href="https://firebase.google.com/docs/hosting" rel="noopener noreferrer"&gt;Firebase Hosting&lt;/a&gt; which was only suitable for frontend apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Types : Static Site, SPA Single Page App&lt;/li&gt;
&lt;li&gt;Frameworks : Vue.js, React.js, Svelte, Flutter web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But we couldn't deploy fullstack apps (using SSR, ISR) with Firebase Hosting. It was possible to workaround this limitation using Firebase Functions. I tried it and it was not easy nor pleasant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There was a latency due to warm-up functions&lt;/li&gt;
&lt;li&gt;You have to configure the functions to serve the content (which is an additional step specific to Firebase Hosting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, with Firebase App Hosting, this became a lot more easier.&lt;br&gt;
Since Firebase team didn't explicitly tell if it was possible to deploy applications other than Angular and Next.js, I took the journey to deploy a Nuxt app using SSR.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;TL;DR: It's working!&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;I'll assume that you have the necessary toolings to develop a Nuxt app. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed - v18.0.0 or newer&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://warp.dev/" rel="noopener noreferrer"&gt;A terminal&lt;/a&gt;: in order to run Nuxt &amp;amp; Firebase commands&lt;/li&gt;
&lt;li&gt;A Text editor: like &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt; and a &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; account 
(create an account if you don't already have one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm using macOS with Node.js v20.13.1 (lts/iron), VSCode with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=Vue.volar" rel="noopener noreferrer"&gt;official Vue extension&lt;/a&gt;, &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;bun&lt;/a&gt; v1.1.8.&lt;/p&gt;

&lt;p&gt;I'll name the project nuxt-firebase. Feel free to replace that name with your your own.&lt;/p&gt;


&lt;h2&gt;
  
  
  Create a Nuxt app
&lt;/h2&gt;

&lt;p&gt;Let's create a Nuxt app with minimal code and SSR configuration. Than we will deploy it on the cloud.&lt;/p&gt;


&lt;h3&gt;
  
  
  Initialize the repository
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://nuxt.com/docs/getting-started/installation" rel="noopener noreferrer"&gt;(You can follow the official Nuxt documentation there).&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/ebfe93c5dcf04aa1897ddd3c80998153"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;&lt;br&gt;&lt;br&gt;
First, initialize a repository with Nuxt:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;# initialize your nuxt app&lt;/span&gt;
npx nuxi@latest init nuxt-firebase


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;We then navigate into the created directory:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;# move into your project directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;nuxt-firebase


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Run the app to check that everything is okay:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;# in your nuxt project directory&lt;/span&gt;
npm run dev &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Add pages and routes
&lt;/h3&gt;

&lt;p&gt;We're going to edit the app.vue file and add two pages inside the /pages/ directory which does not exist yet.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/22d2476442ec4834a58ac5d0b316b5fb"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Replace the content of app.vue with this one:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

// app.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;NuxtLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;NuxtPage&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/NuxtLayout&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"link-bar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;NuxtLink&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/NuxtLink&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;NuxtLink&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/NuxtLink&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;footer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.link-bar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#FFE6E6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;#FFE6E6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Create the &lt;code&gt;/pages/&lt;/code&gt; folder at the root of your project's directory. Inside, add these two files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.vue:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

// pages/index.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Index&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;about.vue:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

// pages/about.vue
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;You should see something like this in your browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nvuw9ji3jxc3us7h61c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nvuw9ji3jxc3us7h61c.png" alt="Nuxt basic project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's very basic. You can customize your pages but for our demo it's good enough.&lt;/p&gt;


&lt;h3&gt;
  
  
  Configure Rendering Modes
&lt;/h3&gt;

&lt;p&gt;By default, Nuxt uses SSR in development mode, but switches to client-side rendering in production (for example, static rendering).&lt;/p&gt;

&lt;p&gt;We need to configure our app routes to explicitly tell Nuxt to use SSR for our pages in &lt;code&gt;nuxt.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// nuxt.config.ts&lt;/span&gt;
&lt;span class="c1"&gt;// --------------&lt;/span&gt;
&lt;span class="c1"&gt;// https://nuxt.com/docs/api/configuration/nuxt-config&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;devtools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;routeRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/about&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Now when we'll deploy our app on Firebase App Hosting, the routes &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;/about&lt;/code&gt; will be serve through server side rendering (SSR).&lt;/p&gt;

&lt;p&gt;For our own knowledge, here is an example of a config rendering rules with their purpose:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;routeRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Homepage pre-rendered at build time&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;prerender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Products page generated on demand, revalidates in background, cached until API response changes&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;swr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Product page generated on demand, revalidates in background, cached for 1 hour (3600 seconds)&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;swr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Blog posts page generated on demand, revalidates in background, cached on CDN for 1 hour (3600 seconds)&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Blog post page generated on demand once until next deployment, cached on CDN&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/blog/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Admin dashboard renders only on client-side&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/admin/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Add cors headers on API routes&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Redirects legacy urls&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/old-page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/new-page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;An overview of routes rendering rules:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc8yem7qmnny68xdr8ek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc8yem7qmnny68xdr8ek.png" alt="Nuxt routes rendering rules overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://nuxt.com/docs/guide/concepts/rendering#route-rules" rel="noopener noreferrer"&gt;https://nuxt.com/docs/guide/concepts/rendering#route-rules&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the official documentation for more information: &lt;a href="https://nuxt.com/docs/guide/concepts/rendering" rel="noopener noreferrer"&gt;https://nuxt.com/docs/guide/concepts/rendering&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Push into GitHub
&lt;/h2&gt;

&lt;p&gt;The final part in the code editor is to push the new code to &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Thus Firebase will be able to fetch and build our app with its CI/CD.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/701d8dac81444ac7b203bf0a24d9f08e"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;You can see the source code here: &lt;a href="https://github.com/rootasjey/nuxt-firebase" rel="noopener noreferrer"&gt;nuxt-firebase&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Deploy on Firebase App Hosting
&lt;/h2&gt;

&lt;p&gt;First we need to &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;create a Firebase account&lt;/a&gt; if we don't have one. After your Firebase account has been created, you should see the welcome screen. Click on the "Create a project" button:&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/3e6540357efa4e97ae0fb02ce2fa7c7c"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Once created, we go on le left side bar and select "App Hosting".&lt;/p&gt;

&lt;p&gt;You can follow the video tutorial or/and the screen by screen images with text explanations:&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/c5a2f777651a44c786ff0b9f23e2a22b"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;App Hosting button is in the Build accordion:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgj8uzxcwhpsjbfl6dpet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgj8uzxcwhpsjbfl6dpet.png" alt="Firebase Console - Home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We arrive on the App Hosting welcome page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h1wuovl53dj0xp481di.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h1wuovl53dj0xp481di.png" alt="Firebase Console - App Hosting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to upgrade our project from Spark Plan to Blaze Plan.&lt;br&gt;
Our Nuxt app uses features in the Blaze Plan so we have to add a payment method. For this demo we'll pay little to nothing since our app won't consume much resources, if it has minimal traffic. Firebase products pricing - including App Hosting - is based on usage cost. Meaning that if your app get approximately 10k visits, you'll pay ~$0.15 according to the &lt;a href="https://firebase.google.com/docs/app-hosting/costs" rel="noopener noreferrer"&gt;Firebase documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xp1bv2ern710k2uf8m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xp1bv2ern710k2uf8m1.png" alt="Firebase cost usage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOTE: This is an example and other factors should be taken into account like: Effective Concurrency, CPU/Mem Time.&lt;/p&gt;

&lt;p&gt;Plus there are no-cost limits which allow us to use these resources for free before being charged:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t8avl2klw0n37norloe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t8avl2klw0n37norloe.png" alt="Firebase no-cost limits"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking on the "Upgrade project" button, a popup opens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef2b0134kmujdf1ozzl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef2b0134kmujdf1ozzl4.png" alt="Firebase Console - App Hosting - Upgrade project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on "Continue".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3s2pbpvj2tj50ygpdfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3s2pbpvj2tj50ygpdfb.png" alt="Firebase Console - App Hosting - Payment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We confirm our country, and enter a payment method.&lt;/p&gt;

&lt;p&gt;Your account is now setup on the Blaze plan, now we can go to our dashboard and create a new &lt;strong&gt;App Hosting&lt;/strong&gt; project (which will be inside our Firebase project: nuxt-firebase).&lt;/p&gt;

&lt;p&gt;Click on "Get started" button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfkvyl32f645uq8ucixe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfkvyl32f645uq8ucixe.png" alt="Firebase Console - App Hosting - Set up"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The configuration wizard will ask us to create access from our GitHub account to Google Developer Connect, which will be then linked to Firebase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqmsxgta608s4c730f4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqmsxgta608s4c730f4a.png" alt="Firebase Console - App Hosting - Connect GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When this is done, we will be able to select our GitHub account and Nuxt app (hosted on GitHub).&lt;/p&gt;

&lt;p&gt;Wait some minutes for the app to build. At this time, the build time is much longer than Vercel. It takes ~45 seconds on Vercel and ~3 minutes on Firebase App Hosting.&lt;/p&gt;

&lt;p&gt;And voilà! If the build and deployment succeeded, a new link is generated with a SSL certificate. It may took some time (in minutes or hours) for the link to be functional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxdv9306lhong3g59xan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxdv9306lhong3g59xan.png" alt="Firebase Console - App Hosting - Success"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can visit the deployed &lt;a href="https://nuxt-firebase--nuxt-firebase-1f646.us-central1.hosted.app/" rel="noopener noreferrer"&gt;Nuxt app this new url&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source code is on &lt;a href="https://github.com/rootasjey/nuxt-firebase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nuxt.com/docs/getting-started/installation" rel="noopener noreferrer"&gt;Nuxt documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/qyhdKb8liEA?si=Fm0BohXjKZA7O93w" rel="noopener noreferrer"&gt;Google I/O - Introducing Firebase App Hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/app-hosting" rel="noopener noreferrer"&gt;Firebase App Hosting documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>nuxt</category>
      <category>firebase</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
