<?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: Franck Abgrall</title>
    <description>The latest articles on DEV Community by Franck Abgrall (@kefranabg).</description>
    <link>https://dev.to/kefranabg</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%2F160055%2F57f5d7e1-1523-43ba-aea8-45e6e5d98ff3.jpeg</url>
      <title>DEV Community: Franck Abgrall</title>
      <link>https://dev.to/kefranabg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kefranabg"/>
    <language>en</language>
    <item>
      <title>🛠✨ Demystifying SSR, CSR, universal and static rendering with animations </title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Wed, 04 Mar 2020 12:59:49 +0000</pubDate>
      <link>https://dev.to/kefranabg/demystifying-ssr-csr-universal-and-static-rendering-with-animations-m7d</link>
      <guid>https://dev.to/kefranabg/demystifying-ssr-csr-universal-and-static-rendering-with-animations-m7d</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;📖 Parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1) Server Side Rendering
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2) Client Side Rendering
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3) Universal Rendering
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4) Static Rendering
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5) Comparisons
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sometimes it might be hard to understand the differences between the different web rendering solutions. If you're a web developer, you've probably heard these words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server Side Rendering (SSR)&lt;/li&gt;
&lt;li&gt;Client Side Rendering (CSR)&lt;/li&gt;
&lt;li&gt;Universal Rendering (sometimes simplified to "SSR")&lt;/li&gt;
&lt;li&gt;Static Rendering (or JAMStack depending on the tool you're using)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are 4 videos explaining in a simplified manner the process of each solution from a user's perspective. Know that the user scenario is the exact same in the 4 videos.&lt;/p&gt;

&lt;p&gt;In the last section you'll find a comparison listing benefits and drawbacks of each solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server Side Rendering (SSR) &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Note:&lt;/strong&gt; Here I'm talking about full server side rendered websites (you know, old SSR websites 😉). This architecture was widely used before Single Page Apps were introduced.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0bvo6UKkNDA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Client Side Rendering (CSR) &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frameworks using CSR:&lt;/strong&gt; Vue, React, Angular&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4-Lel1oaV7M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Universal Rendering &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frameworks using Universal Rendering:&lt;/strong&gt; Nuxt.js, Next.js, Angular Universal&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/y5CpKiH-3J8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Static Rendering &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frameworks/Tools using Static Rendering:&lt;/strong&gt; Gatsby, VuePress, Gridsome, Next.js, Hugo, Jekyll&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1zhT23VDVDc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparisons &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Server Side Rendering&lt;/th&gt;
&lt;th&gt;Client Side Rendering&lt;/th&gt;
&lt;th&gt;Universal Rendering&lt;/th&gt;
&lt;th&gt;Static Rendering&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👎&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast initial load to show the full content of the page&lt;/td&gt;
&lt;td&gt;⚡️⚡️&lt;/td&gt;
&lt;td&gt;⚡️&lt;/td&gt;
&lt;td&gt;⚡️⚡️&lt;/td&gt;
&lt;td&gt;⚡️⚡️⚡️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full page reload when navigating&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;it depends on the tool you're using&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires server hosting&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fluid seamless user experience on page navigation&lt;/td&gt;
&lt;td&gt;👎&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrates well with websites based on frequent/real-time updates&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;👍&lt;/td&gt;
&lt;td&gt;😕&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Feel free to contact me on &lt;a href="https://twitter.com/FranckAbgrall"&gt;twitter&lt;/a&gt; if you have questions!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🐦 &lt;a href="https://twitter.com/FranckAbgrall"&gt;Twitter&lt;/a&gt;
&lt;/th&gt;
&lt;th&gt;💻 &lt;a href="https://github.com/kefranabg"&gt;GitHub&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Vue3 composition API: a list of good resources</title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Mon, 04 Nov 2019 17:12:57 +0000</pubDate>
      <link>https://dev.to/kefranabg/vue3-composition-api-a-list-of-good-resources-2jpa</link>
      <guid>https://dev.to/kefranabg/vue3-composition-api-a-list-of-good-resources-2jpa</guid>
      <description>&lt;p&gt;Vue3 is coming soon! And one of the most exciting feature of this new version is the composition API 🙌&lt;/p&gt;

&lt;p&gt;I created an open source list of cool resources you should check if you want to learn about it:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/kefranabg/awesome-vue-composition-api"&gt;Awesome Vue Composition API&lt;/a&gt; 👈&lt;/p&gt;

&lt;p&gt;Hope it will help, feel free to contribute to improve the list 🙏&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>📄 Cheat sheet - How to promote your open-source project? </title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Wed, 04 Sep 2019 16:51:40 +0000</pubDate>
      <link>https://dev.to/kefranabg/cheat-sheet-how-to-promote-your-open-source-project-4flh</link>
      <guid>https://dev.to/kefranabg/cheat-sheet-how-to-promote-your-open-source-project-4flh</guid>
      <description>&lt;p&gt;You've created an open-source project? Great. But what happens when your project is mature enough to be used? You've put a lot of effort building an awesome project that could help the open-source community, but the reality is that if you don't spread the word about it, almost no one will see or use it.&lt;/p&gt;

&lt;p&gt;Some colleagues and I went through a lot of open-source projects promotion these last months, and we found some good practices that helped our open-source projects gain popularity. And guess what? We created a cheat sheet to summarize everything we learned 😎.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/zenika-open-source/open-source-promotion-cheat-sheet"&gt;Click here to check out the cheat sheet on Github&lt;/a&gt;&lt;/strong&gt; 👈&lt;/p&gt;

&lt;p&gt;Is this article a way to promote this Github cheat sheet? Yes. See, you learn fast 😜.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want to get started with open-source?
&lt;/h3&gt;

&lt;p&gt;If you're new to the open-source world, I strongly recommend you to read these two articles first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/bpetetot/getting-started-in-open-source-2pf2"&gt;Getting started in open-source&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/yvonnickfrin/preparing-your-project-being-open-sourced-5bdp"&gt;Preparing your project to be open-sourced&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Show your support
&lt;/h3&gt;

&lt;p&gt;Do not hesitate to support us if this helped you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/intent/tweet?text=How%20to%20promote%20your%20open-source%20projects%20@ZenikaOSS&amp;amp;url=https://github.com/zenika-open-source/open-source-promotion-cheat-sheet&amp;amp;hashtags=OpenSource,CheatSheet"&gt;Share the cheat sheet on twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zenika-open-source/open-source-promotion-cheat-sheet/blob/master/CONTRIBUTING.md"&gt;Contribute to the cheat sheet to improve it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zenika-open-source/open-source-promotion-cheat-sheet"&gt;⭐️ the github repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Generate beautiful README in 10 seconds</title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Thu, 13 Jun 2019 20:00:01 +0000</pubDate>
      <link>https://dev.to/kefranabg/generate-beautiful-readme-in-10-seconds-38i2</link>
      <guid>https://dev.to/kefranabg/generate-beautiful-readme-in-10-seconds-38i2</guid>
      <description>&lt;p&gt;Hi 👋&lt;/p&gt;

&lt;p&gt;A well structured and beautiful README is very important, especially for opensource projects. This is the first thing that visitors will see when they discover your project.&lt;/p&gt;

&lt;p&gt;This is why I created &lt;a href="https://github.com/kefranabg/readme-md-generator" rel="noopener noreferrer"&gt;readme-md-generator&lt;/a&gt;, a tool that generates beautiful basic &lt;code&gt;README.md&lt;/code&gt; files with less efforts !&lt;/p&gt;

&lt;p&gt;All you need to do is answer a few questions, and &lt;a href="https://github.com/kefranabg/readme-md-generator" rel="noopener noreferrer"&gt;readme-md-generator&lt;/a&gt; will do the rest 👌&lt;/p&gt;

&lt;p&gt;&lt;code&gt;readme-md-generator&lt;/code&gt; is able to read your environment (package.json, git config...) to suggest you default answers during the &lt;code&gt;README.md&lt;/code&gt; creation process :&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%2Fuser-images.githubusercontent.com%2F9840435%2F59462324-cca6e500-8e23-11e9-8399-1372492c123b.jpg" 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%2Fuser-images.githubusercontent.com%2F9840435%2F59462324-cca6e500-8e23-11e9-8399-1372492c123b.jpg" alt="demo"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Generated &lt;code&gt;README.md&lt;/code&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%2Fuser-images.githubusercontent.com%2F9840435%2F59458494-d7a94780-8e1a-11e9-9103-42639c347c38.jpg" 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%2Fuser-images.githubusercontent.com%2F9840435%2F59458494-d7a94780-8e1a-11e9-9103-42639c347c38.jpg" alt="cli output"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Feel free to check out the &lt;a href="https://github.com/kefranabg/readme-md-generator" rel="noopener noreferrer"&gt;github repos&lt;/a&gt; if you're interested !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bento-starter v1.0.0 is out ✨ (#PWA, #boilerplate, #vue.js, #firebase)</title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Tue, 11 Jun 2019 07:03:34 +0000</pubDate>
      <link>https://dev.to/kefranabg/bento-starter-v1-0-0-is-out-pwa-boilerplate-vue-js-firebase-4ile</link>
      <guid>https://dev.to/kefranabg/bento-starter-v1-0-0-is-out-pwa-boilerplate-vue-js-firebase-4ile</guid>
      <description>&lt;p&gt;🍱 &lt;a href="https://github.com/kefranabg/bento-starter"&gt;&lt;strong&gt;bento-starter&lt;/strong&gt;&lt;/a&gt; is an Open-Source Full-Stack boilerplate solution that helps you to build fast and maintainable web applications using tools like Vue.js, Firebase, Progressive Web Apps support, dynamic offline support... The goal of this project is to provide a powerful and well configured stack (with CI/CD, hosting...) so you can focus on writing your web application very quickly. &lt;/p&gt;

&lt;p&gt;If you want more information about the bento-starter stack, please refer to this article : &lt;a href="https://dev.to/kefranabg/a-productive-stack-for-pwa-development-27o"&gt;https://dev.to/kefranabg/a-productive-stack-for-pwa-development-27o&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some news about the v1.0.0 : &lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✨ Update service worker workflow has been improved
&lt;/li&gt;
&lt;li&gt;✨ A setup command has been added to make install step easier&lt;/li&gt;
&lt;li&gt;✨ A bento-starter slack has been created : &lt;a href="https://join.slack.com/t/bento-starter/shared_invite/enQtNjE5OTI5MzQyMTE3LTVjYjM3YjMzMGQ4NjgzYzY5YWMwNDkyY2VmMzg4ODg0OTkwZDRhMzg3OWU0MGY1MGYwMmVjYThiMmU2YzBjODY"&gt;join here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 3 bug fixes&lt;/li&gt;
&lt;li&gt;Full changelog is available &lt;a href="https://github.com/kefranabg/bento-starter/blob/master/CHANGELOG.md"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links :
&lt;/h2&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/kefranabg/bento-starter"&gt;https://github.com/kefranabg/bento-starter&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://bento-starter.netlify.com/%E2%80%A8"&gt;https://bento-starter.netlify.com/ &lt;/a&gt;&lt;br&gt;
Demo : &lt;a href="https://bento-starter.firebaseapp.com"&gt;https://bento-starter.firebaseapp.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>vue</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A productive stack for PWA development</title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Thu, 25 Apr 2019 18:42:53 +0000</pubDate>
      <link>https://dev.to/kefranabg/a-productive-stack-for-pwa-development-27o</link>
      <guid>https://dev.to/kefranabg/a-productive-stack-for-pwa-development-27o</guid>
      <description>&lt;p&gt;“Write once, use everywhere”. I love this philosophy and I think this is the dream of every web developer: build an application that would be fully supported by all platforms (mobile, browser, desktop), without installation steps. This is a complex idea that Progressive Web Apps are trying to solve.&lt;/p&gt;

&lt;p&gt;In this article, I will talk about a complete full-stack environment that helps me to kick off my PWA projects very quickly.&lt;/p&gt;

&lt;p&gt;Before starting, I would like to share &lt;a href="https://github.com/kefranabg/bento-starter"&gt;this github repository&lt;/a&gt;. This open-source project is a starter template that perfectly illustrates the points I will raise subsequently. So, if you need a concrete integration example, feel free to take a look. This stack is very opinionated, but it’s also what makes it powerful.&lt;/p&gt;

&lt;p&gt;Here are my needs:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I want a complete full-stack environment that helps me to focus on my developing skills to build Progressive Web Apps very quickly without compromising the best practices."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s do it step by step!&lt;/p&gt;

&lt;h2&gt;
  
  
  Database + REST API
&lt;/h2&gt;

&lt;p&gt;I will be very brief. We don’t want any database or REST API. Let me be more specific: We don’t want to manage them on our own. Why? Because it’s hard to host them and it’s more code to maintain. Nor do we want to deal with problematics like scaling etc. Keep in mind that what we want is to be fast during development!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/docs/firestore/"&gt;Firestore&lt;/a&gt; from firebase seems to be a pretty good option! Thanks to a client API, we will be able to read and write data from a cloud NoSQL database and &lt;a href="https://firebase.google.com/docs/firestore/security/get-started"&gt;firestore security rules&lt;/a&gt; will help us to provide access control and data validation. In addition, Firestore offers an &lt;a href="https://firebase.google.com/docs/firestore/manage-data/enable-offline"&gt;offline support&lt;/a&gt; for data persistence which is really interesting for PWAs. Firestore is also a realtime database. It means that I can listen to specific part of my data structure and get realtime updates on my application.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if you need to run code in a secure context (not on client side)? For example trigger business logic when a client do a CRUD operation?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To deal with these specific cases, we can use &lt;a href="https://firebase.google.com/docs/functions/"&gt;firebase cloud functions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cool! We’re done with a huge part of our stack, and be sure that we’ve just eliminated a huge amount of code. That’s what we want!&lt;/p&gt;

&lt;h2&gt;
  
  
  User authentication
&lt;/h2&gt;

&lt;p&gt;You really should use a third party (email, phone, social) to authenticate your user. It’s less code for developers to write, and it’s simpler for our users to authenticate.&lt;/p&gt;

&lt;p&gt;Once again, we can use firebase to save some development time. &lt;a href="https://firebase.google.com/docs/auth/"&gt;Firebase authentication&lt;/a&gt; provides a lot of methods to handle authentication:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social networks sign-in (Google, Facebook, Twitter, Github …)&lt;/li&gt;
&lt;li&gt;Phone authentication&lt;/li&gt;
&lt;li&gt;Email with authentication link&lt;/li&gt;
&lt;li&gt;Classic email/password&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frontend
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💚 Javascript framework:
&lt;/h3&gt;

&lt;p&gt;Why choose &lt;a href="https://vuejs.org/"&gt;Vue.js&lt;/a&gt;? Because I really like the philosophy of this framework and I am very productive using it. It’s simple, provides a great developer experience, and it’s probably the easiest javascript framework to learn today.&lt;/p&gt;

&lt;p&gt;In my opinion, there is no “best javascript framework”. The most important is to use the one you like to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  💅 UI component framework / CSS:
&lt;/h3&gt;

&lt;p&gt;In a PWA context, I would recommend to write your own CSS and UI components. I think it’s hard to find a good lightweight UI component framework and our PWA needs to load fast. So if you decides to use a framework, be careful on how it will impact your application size.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔁 Frontend state management:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vuex.vuejs.org/"&gt;Vuex&lt;/a&gt; is the default state manager of Vue.js and it’s really simple to use. It comes with &lt;a href="https://github.com/vuejs/vue-devtools"&gt;vue-devtools&lt;/a&gt; which is an amazing browser extension to debug your application, trace events, and have a global view of what your data structure looks like in your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Tests frameworks:
&lt;/h3&gt;

&lt;p&gt;I personally like to use Cypress (Chrome only) for e2e tests and Jest for unit tests, but the most important is to use tests frameworks you like to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  👨‍✈️ Frontend quality tools:
&lt;/h3&gt;

&lt;p&gt;One of our prerequisite is to produce quality code because a PWA must be fast and lightweight. Here are the tools we can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/siddharthkp/bundlesize"&gt;BundleSize&lt;/a&gt;: Code splitting is something you should care about. This is the easiest way to increase your website performances. Your PWA needs to be fast on initial load, even with a bad network connection. This is why your app should be splitted into several javascript bundles. BundleSize helps to keep a permanent control over the different bundle sizes that compose your application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developers.google.com/web/tools/lighthouse/"&gt;Lighthouse&lt;/a&gt; (browser extension / chrome devtools): A great audit tool that generates reports for your web app pages. A lighthouse report will rate your web pages on several topics (performance, accessibility, best practices and progressive web app). These reports will also give you advises to improve the negative points you might obtain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code Coverage (chrome devtools): This tool will display how much code was executed vs. how much was loaded on a web page. This will help you to see which part of your code you could lazyload, and ship only the code a user needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt;: Code format is something really important in my opinion. I don’t mind using semi-colon or not. The only thing that is important to me is having the code uniform so anyone can read it the same way. Wether you like it or not, Prettier will format the code its way, and that’s what is great about Prettier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://eslint.org/"&gt;Eslint&lt;/a&gt;: Use as many linter rules as you can (within reasonable limits), this will structure your code and helps you to go over best practices. If you don’t want to write your own set of rules, I suggest to use existing eslint configurations. I love the airbnb one because it’s very strict and complete.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PWA support
&lt;/h2&gt;

&lt;p&gt;If you’re not familiar with PWA, I suggest you to read &lt;a href="https://developers.google.com/web/progressive-web-apps/"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this part I am not going to talk about how service workers works, or how to create a web app manifest. There is already great articles and documentation about it, so I’ll focus on tools you can use for a good start and give you some advices based on my experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/GoogleChromeLabs/pwacompat"&gt;PWACompat&lt;/a&gt;:
&lt;/h3&gt;

&lt;p&gt;This library brings the Web App Manifest to non-compliant browsers for better Progressive Web Apps. It also comes with some other cool features like creating dynamic splash screen images for IOS (not supported by default on IOS yet).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa"&gt;vue-cli-plugin-pwa&lt;/a&gt;:
&lt;/h3&gt;

&lt;p&gt;This plugin will help you to configure your PWA with Workbox, which is today the best way to handle service workers. By default, your service worker file is generated from a basic JSON configuration (you have access to) for more simplicity. But if you want more control over your service worker configuration, you’ll have to write a service worker file yourself (refer to &lt;a href="https://developers.google.com/web/tools/workbox/modules/workbox-cli#injectmanifest"&gt;the official documentation for more details&lt;/a&gt;).&lt;br&gt;
Vue-cli-plugin-pwa comes with the library &lt;a href="https://github.com/yyx990803/register-service-worker"&gt;register-service-worker&lt;/a&gt; that simplify service worker registration and exposes hooks for common service worker events like “updateFound” (when new content is available), “registered” (when service worker has been registered) etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Offline:
&lt;/h3&gt;

&lt;p&gt;A PWA is not a good PWA if it cannot works properly without network connection. A clean offline management requires two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Static files caching: This is a required step if you want your application to just start without network connection. Hopefully you won’t have anything to configure if you’re using vue-cli-plugin-pwa. Otherwise you’ll have some workbox configuration to do.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dynamic caching: The easiest way would be to show an offline page, to tell the user he cannot access data without network connection, but we can do better. What we want is that the user can access data he already fetched before. If your data is coming from a firestore database, you can just enable &lt;a href="https://firebase.google.com/docs/firestore/manage-data/enable-offline"&gt;offline persistence&lt;/a&gt; and firestore will take care of the rest. Otherwise you’ll have to cache requests responses with workbox.&lt;br&gt;
Now we’re done with the basic configuration!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But remember that you can still improve your PWA user experience. Here is some examples of improvements you could add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Encouraging your IOS users to install your PWA:&lt;br&gt;
IOS does not automatically prompt user for web app installation as Chrome would do on Android devices. But you can easily overcome this shortcoming by displaying a modal prompt with clear and easy steps to install the app. &lt;a href="https://dockyard.com/blog/2017/09/27/encouraging-pwa-installation-on-ios"&gt;Here is a great article about this&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Display a “new version is available” for your PWA:&lt;br&gt;
Have you ever been on a website and noticed a popup notification which informs you that there is a new version of the site available? This is exactly what I’m talking about. Thanks to this popup, the user will understand that he is not on the last version of your app, so he needs to reload to get the last one.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerendering
&lt;/h2&gt;

&lt;p&gt;In many cases, Server Side Rendering is overkill. What I like about pre-rendering is that it won’t affect the way I’m writing my front-end app code or the architecture of my project, while getting almost all advantages of SSR. If you don’t know what pre-rendering is or when you should (not) use it, I suggest you to read &lt;a href="https://github.com/chrisvfritz/prerender-spa-plugin#what-is-prerendering"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To pre-render our app pages, we can use &lt;a href="https://github.com/chrisvfritz/prerender-spa-plugin#what-is-prerendering"&gt;prerender-spa-plugin&lt;/a&gt;. In short, this plugin fire up a headless browser, load your app’s routes and save the result to static HTML files. It means that all of my application will remain static, so we could easily host it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting
&lt;/h2&gt;

&lt;p&gt;Now we need to host our static website, and I think that you start to understand that I do like firebase 😉.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/docs/hosting/"&gt;Firebase hosting&lt;/a&gt; will help us to quickly deploy our PWA to a CDN that will serve our content over a secure connection (HTTPS is required to use service workers in production).&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuous integration/delivery
&lt;/h2&gt;

&lt;p&gt;Cool! We’re almost done. But we are lazy, and there is some parts that we can automate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kefranabg/bento-starter/blob/master/.circleci/config.yml"&gt;CircleCI&lt;/a&gt; is a great platform that will help us to run our tests, check code with our quality tools and deploy to firebase hosting when we push code to the remote repository. Here is the workflow we want:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install our project dependencies.&lt;/li&gt;
&lt;li&gt;When install dependencies step is complete, we will parallelize the following&lt;/li&gt;
&lt;li&gt;jobs: run e2e tests, run units tests, run linter and check our code format with prettier.&lt;/li&gt;
&lt;li&gt;If all of the previous jobs ended with success, we will build our app (with pre-rendering).&lt;/li&gt;
&lt;li&gt;Once the build step has ended, we will check our javascript bundles sizes with BundleSize.&lt;/li&gt;
&lt;li&gt;Finally, if the targeted branch is the release one, we will deploy to firebase hosting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/kefranabg/bento-starter/blob/master/.circleci/config.yml"&gt;Here&lt;/a&gt; is the CircleCI configuration file that corresponds to the above workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With this full-stack solution, the only thing we need to care about is writing our PWA code, and this is exactly what we were looking for. To summarize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firebase platform saves us A LOT of time, and takes care of the PWA hosting.&lt;/li&gt;
&lt;li&gt;Frontend quality tools help us to keep our code clean, fast and performant. Remember that it’s really important in a PWA context.&lt;/li&gt;
&lt;li&gt;A good CI/CD configuration allows to keep a permanent control over the code quality and spare time for app deployments.&lt;/li&gt;
&lt;li&gt;Consider using pre-rendering over SSR, because it’s easier to implement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As already mentioned, checkout &lt;a href="https://github.com/kefranabg/bento-starter"&gt;this github repository&lt;/a&gt; if you’re interested in building a PWA and don’t know where to start, or if you just want a concrete example of the stack I presented in this article.&lt;/p&gt;

&lt;p&gt;Feel free to contact me on &lt;a href="https://twitter.com/FranckAbgrall"&gt;twitter&lt;/a&gt; if you have questions!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>vue</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A full-stack solution for fast PWA development !</title>
      <dc:creator>Franck Abgrall</dc:creator>
      <pubDate>Wed, 24 Apr 2019 12:07:02 +0000</pubDate>
      <link>https://dev.to/kefranabg/a-full-stack-solution-for-fast-pwa-development-4105</link>
      <guid>https://dev.to/kefranabg/a-full-stack-solution-for-fast-pwa-development-4105</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UuoP8o-p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ems8jjrgvtvi18m6rlrk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UuoP8o-p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ems8jjrgvtvi18m6rlrk.jpg" alt="bento-starter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hi 👋,&lt;/p&gt;

&lt;p&gt;If you’re interested in building Progressive Web Apps, I would like to share an open source project we've been working on for few months : &lt;strong&gt;&lt;a href="https://bento-starter.netlify.com/"&gt;bento-starter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🍱bento-starter is an Open-Source Full-Stack solution that helps you to build fast and maintainable web applications using tools like Vue.js, Firebase, Progressive Web Apps support, dynamic offline support...&lt;/p&gt;

&lt;p&gt;The goal of this project is to provide a powerful and well configured stack (with CI/CD, hosting...) so you can focus on writing your web application very quickly.&lt;/p&gt;

&lt;p&gt;As this project is a template project and not a CLI, you have access to the entire app configuration so you can change it according to your needs.&lt;/p&gt;

&lt;p&gt;If you interested, fell free to take a look !&lt;/p&gt;

&lt;p&gt;👉 Github &lt;a href="https://github.com/kefranabg/bento-starter"&gt;https://github.com/kefranabg/bento-starter&lt;/a&gt;&lt;br&gt;
 👉 Doc &lt;a href="https://bento-starter.netlify.com/"&gt;https://bento-starter.netlify.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please tweet me if you have questions ! &lt;a href="https://twitter.com/FranckAbgrall"&gt;@FranckAbgrall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope it will help !&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>pwa</category>
      <category>webdev</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
