<?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: Devonte</title>
    <description>The latest articles on DEV Community by Devonte (@devotox).</description>
    <link>https://dev.to/devotox</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%2F180643%2F52866c09-c388-4048-b904-6603a16ce4e7.jpeg</url>
      <title>DEV Community: Devonte</title>
      <link>https://dev.to/devotox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devotox"/>
    <language>en</language>
    <item>
      <title>Zero Cost Web App Part 1</title>
      <dc:creator>Devonte</dc:creator>
      <pubDate>Wed, 19 Jun 2019 11:20:16 +0000</pubDate>
      <link>https://dev.to/devotox/zero-cost-web-app-part-1-f60</link>
      <guid>https://dev.to/devotox/zero-cost-web-app-part-1-f60</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This app is going to be revolutionary…&lt;br&gt;
This is going to be the next Facebook…&lt;br&gt;
It’s like Instapaper meets Kickstarter and a little bit like Quora but without the questions…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As a developer, if you had a dollar for every time you heard statements like these… well, then you wouldn’t need to actually create anything because you would already be minted.&lt;/p&gt;

&lt;p&gt;We are in an age where everyone, &lt;em&gt;including you&lt;/em&gt;, believes they have the next billion dollar idea. As much as we would love to develop anything and everything, the sheer amount of resources needed to build a web application is immense. You would need a server, database, hosting provider, SSL certificates, etc. With your limited income, how could you even begin to create the “&lt;em&gt;next big thing&lt;/em&gt;” without burning a hole in your pocket?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gy_SDyvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AZOiQh3jJNkG3Qt8xhLCVAw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gy_SDyvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AZOiQh3jJNkG3Qt8xhLCVAw.jpeg" alt="Empty Pockets"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Empty Pockets&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;This is part 1 of a 3 part series that delves into a possible solution to ensure you don’t spend a dime building your app at least until you have a plethora of users.&lt;/p&gt;

&lt;p&gt;There are a number of ways to achieve the above statement but we have chosen to use &lt;a href="https://emberjs.com/"&gt;Ember&lt;/a&gt; as our frontend framework and &lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt; as our backend solution. We have found that this proposed solution is an extremely simple yet effective way of developing your web application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ember is a mature, opinionated, full-featured, Javascript framework that makes it easy to build large scale applications. It considers itself “A framework for ambitious web developers.”&lt;/p&gt;

&lt;p&gt;Firebase is a comprehensive development platform that gives you the tools to develop high-quality apps, grow your user base, and earn more money. It covers the essentials so you can monetize your business and focus on your users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s start by diving into three concepts that will be the basis for transforming your idea into an &lt;em&gt;awesome&lt;/em&gt; web app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Free Tiers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt; started out as just a real-time database but has grown to be much more now.&lt;/p&gt;

&lt;p&gt;You are now provided with two different types of databases, authentication, file storage, hosting, a global CDN, and SSL right out the box all with a very generous free tier.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt; Hosting we leverage Google’s globally distributed edge points of presence to accelerate content delivery. The sheer scale of Google data centres allows your app to scale efficiently under the stress of a large number of users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uT0ft4pu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A2ZTwzABzw6ZWb-u0bcVH0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uT0ft4pu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A2ZTwzABzw6ZWb-u0bcVH0w.png" alt="Firebase Key Capabilities"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Firebase Key Capabilities&lt;/i&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  SSR (Server-Side Rendering)
&lt;/h2&gt;

&lt;p&gt;We will ensure that even though we are building a single page application each page can be rendered server-side as this will be crucial for the next step.&lt;/p&gt;

&lt;p&gt;We will use &lt;a href="https://ember-fastboot.com/"&gt;Ember Fastboot&lt;/a&gt; and &lt;a href="https://firebase.google.com/docs/functions"&gt;Firebase Functions&lt;/a&gt;, a wrapper around serverless functions, to fully render the initial page and rehydrate as soon as the Javascript file is parsed.&lt;/p&gt;

&lt;p&gt;With SSR we get multiple benefits without losing the speed and dynamicity of a SPA (Single Page Application).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SEO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Graceful Degradation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First Meaningful Paint&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GvS6oZiO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2570/1%2AH6mLWQKlvs8P9eA_3LcTWg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GvS6oZiO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2570/1%2AH6mLWQKlvs8P9eA_3LcTWg.png" alt="Ember Fastboot"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Ember Fastboot&lt;/i&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  Browser Caching
&lt;/h2&gt;

&lt;p&gt;You want to minimize round trips to the server for &lt;em&gt;speed&lt;/em&gt;, &lt;em&gt;efficiency&lt;/em&gt;, but most of all, &lt;em&gt;cost&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt; has a limit for its free tier both on the data transferred and the number of functions called per month. We can cut down our chances of hitting these limits by ensuring we call the server only once unless a resource has been modified.&lt;/p&gt;

&lt;p&gt;Browser caching along with SSR speeds up your app massively by cutting down the time to &lt;em&gt;&lt;code&gt;First Meaningful Paint&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u7AyjgVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2314/1%2ATWufGZRJbDxDKHAnPUZ5dA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u7AyjgVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2314/1%2ATWufGZRJbDxDKHAnPUZ5dA.png" alt="Google Developer Page Insights"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Google Developer Page Insights&lt;/i&gt;&lt;/center&gt;

&lt;p&gt;This guide will help you easily accomplish the stated concepts above.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: You will be retrieving preconfigured files from &lt;a href="https://gist.github.com/devotox/94e56ee31adff980d148506f2368a0d1"&gt;Github Gists&lt;/a&gt; rather than modify these files yourself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Soooo let’s get developing!&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install &lt;a href="https://nodejs.org/en/download/"&gt;NodeJS and NPM&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;a href="https://console.firebase.google.com"&gt;Firebase Console&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a firebase project called zero-cost-web-app&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: Project ID will be used as the subdomain for your app later&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e4Ru8aPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AhNLgH9cY5FaT7q5ZppWNwA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e4Ru8aPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AhNLgH9cY5FaT7q5ZppWNwA.png" alt="Create a Firebase Project"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Create A Firebase Project&lt;/i&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Install global packages&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; ember-cli
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; firebase-tools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Web App
&lt;/h2&gt;

&lt;p&gt;Setup a new Ember app&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ember new zero-cost-web-app
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;zero-cost-web-app
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ember &lt;span class="nb"&gt;install &lt;/span&gt;ember-cli-fastboot
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ember &lt;span class="nb"&gt;install &lt;/span&gt;ember-fetch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Add a set of commands needed to build &amp;amp; deploy the application&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Builds the Ember app&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Runs a local server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploys to Firebase Hosting&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/7de88b9b4dbb448e3c3103d993af594196800a1f/package.json &lt;span class="nt"&gt;-o&lt;/span&gt; package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Add Fastboot host whitelist to environment config&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/23de6376bb2f6bb5d839d93796c105f52dee4ab0/config%2520%257C%2520environment.js &lt;span class="nt"&gt;-o&lt;/span&gt; config/environment.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Add option to include the welcome page in production&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/63e94551c6cc6dda827b4dd1cd83d37b5d9ffd2b/ember-cli-build.js &lt;span class="nt"&gt;-o&lt;/span&gt; ember-cli-build.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ensure the right package versions are installed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Firebase
&lt;/h2&gt;

&lt;p&gt;Setup Firebase project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;firebase login
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;firebase init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Follow prompts to set up a new project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select each option by using the space bar, navigating to the next option with the down arrow. Then press enter after all options selected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QIJCHd1d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A7c5eNIXvz0NMNgK6XzMOdA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QIJCHd1d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A7c5eNIXvz0NMNgK6XzMOdA.png" alt="Firebase Prompts"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Firebase Prompts&lt;/i&gt;&lt;/center&gt;

&lt;ul&gt;
&lt;li&gt;When you get to the next set of questions. Press enter to choose each default option&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add Firebase config for SSR and caching&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="o"&gt;[&lt;/span&gt;https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/d3a7fd29af85fcc25c3fedff1d2729058d4154f9/firebase.json]&lt;span class="o"&gt;(&lt;/span&gt;https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/d3a7fd29af85fcc25c3fedff1d2729058d4154f9/firebase.json&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; firebase.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Remove index file that may have been created on firebase init&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We don’t need this as the Ember app will provide us with its own index file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; public/index.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Firebase Functions
&lt;/h2&gt;

&lt;p&gt;Setup Firebase Functions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;functions/
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;fastboot
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;fetch
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;ember-fetch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update index file to export SSR cloud function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl https://gist.githubusercontent.com/devotox/94e56ee31adff980d148506f2368a0d1/raw/e446fd671489a5bafb86373c3ccef7da8d4d3b20/functions%2520%257C%2520index.js &lt;span class="nt"&gt;-o&lt;/span&gt; index.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Return to the root directory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Since we are in the functions subdirectory. We need to go back to the root of the project to run the next commands
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Start Application
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm run build:firebase
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;firebase serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Launch app in your default browser&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;open &lt;span class="o"&gt;[&lt;/span&gt;http://localhost:5000]&lt;span class="o"&gt;(&lt;/span&gt;http://localhost:5000&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Compile and build the application (production ready)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build cloud functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zip it all up and upload the artefact to Firebase&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm run deploy:firebase
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Go to URL provided in your terminal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Project ID you noted down earlier will be used as the subdomain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;URL should look something like: &lt;em&gt;&lt;code&gt;https://&amp;lt;project-id&amp;gt;.firebaseapp.com&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hJhNh-od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AqdotVrYslAmY3S3aSRWBMg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hJhNh-od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AqdotVrYslAmY3S3aSRWBMg.png" alt="Get Hosting URL"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Get Hosting URL&lt;/i&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  Expectations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the developer tools and click on the network tab&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find the index page URL: &lt;em&gt;&lt;code&gt;https://&amp;lt;project-id&amp;gt;.firebaseapp.com&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should notice that the full HTML is rendered for the page without the need for javascript to be executed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You should also notice that after the first hit most of the assets should now be retrieved from &lt;br&gt;
&lt;em&gt;&lt;code&gt;memory cache&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cPorpEJt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AxDy08QZrpgOpnDi8wHY-hA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cPorpEJt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AxDy08QZrpgOpnDi8wHY-hA.png" alt="Memory Cache"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;center&gt;&lt;i&gt;Memory Cache&lt;/i&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;With the massive reach of Google servers as your content delivery network and extensive use of caching, you now have the ability to build &lt;em&gt;fast&lt;/em&gt;, &lt;em&gt;efficient&lt;/em&gt;, &lt;em&gt;scalable&lt;/em&gt;, and &lt;em&gt;ambitious&lt;/em&gt; web applications without going bankrupt before the money starts rollin’ in.&lt;/p&gt;

&lt;p&gt;Now go forth and conquer the web app landscape!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In part 2 of this series, we will delve deeper into how to turbocharge your app by converting it into a PWA (Progressive Web App) and adding service workers allowing you to run your app offline!&lt;/em&gt;&lt;/p&gt;



&lt;center&gt;&lt;/center&gt;
&lt;br&gt;&lt;br&gt;
&lt;center&gt;&lt;i&gt;Vooza&lt;/i&gt;&lt;/center&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://zero-cost-web-app.web.app/"&gt;Finished Product&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/devotox/zero-cost-web-app"&gt;Github Repo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/devotox/94e56ee31adff980d148506f2368a0d1"&gt;Github Gists&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt;: Used as our hosting &amp;amp; SSL provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://firebase.google.com/docs/functions"&gt;Firebase Functions&lt;/a&gt;: Allows us to have SSR without a server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://emberjs.com/"&gt;Ember&lt;/a&gt;: Javascript framework used to create our SPA&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ember-cli.com/"&gt;Ember CLI&lt;/a&gt;: Command line utility that builds the application&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ember-fastboot.com/"&gt;Ember Fastboot&lt;/a&gt;: Adds server-side rendering to the application&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zerocostwebapp</category>
      <category>ember</category>
      <category>firebase</category>
    </item>
  </channel>
</rss>
