<?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: Stephen Fluin</title>
    <description>The latest articles on DEV Community by Stephen Fluin (@stephenfluin).</description>
    <link>https://dev.to/stephenfluin</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%2F176424%2Faea9d84a-2d6f-4b01-a93c-679bba7b5e67.jpeg</url>
      <title>DEV Community: Stephen Fluin</title>
      <link>https://dev.to/stephenfluin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stephenfluin"/>
    <language>en</language>
    <item>
      <title>I give up on AngularFire</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Sat, 25 May 2024 21:56:09 +0000</pubDate>
      <link>https://dev.to/stephenfluin/i-give-up-on-angularfire-4hof</link>
      <guid>https://dev.to/stephenfluin/i-give-up-on-angularfire-4hof</guid>
      <description>&lt;p&gt;I just worked really hard to rip AngularFire (&lt;code&gt;@angular/fire&lt;/code&gt;) out of my codebase.&lt;/p&gt;

&lt;p&gt;If you don't know, AngularFire used to be awesome. This was best around 2019-2020, but after being under-served and failing to fully finish several migrations (the Firebase SDK now uses a modular approach), it's kind of a mess.&lt;/p&gt;

&lt;p&gt;I tried and failed to update from v6 up to v16, v17, and beyond, because I wanted to use Angular 18. This didn't work (&lt;code&gt;ng update&lt;/code&gt; would refuse to update to v16 because it forces only updating one major at a time, which is a bit silly), so I ended up deciding to rip it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to remove
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remove &lt;code&gt;@angular/fire&lt;/code&gt; from your package.json&lt;/li&gt;
&lt;li&gt;Swap out the &lt;code&gt;AngularFireModules&lt;/code&gt;for your own keys
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;providers: [
  { provide: BUCKET, useValue: '...'},
  { provide: FIREBASE_APP, useFactory: () =&amp;gt; initializeApp({...})}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a service that calls &lt;code&gt;initializeApp&lt;/code&gt; from &lt;code&gt;firebase/app and save your&lt;/code&gt;FirebaseApp&lt;code&gt;. 
&lt;/code&gt;&lt;code&gt;
constructor(@Inject(FIREBASE_APP) private fbApp: FirebaseApp) {
&lt;/code&gt;`&lt;/li&gt;
&lt;li&gt;Create (or use the same) a service for each of the Firebase modules you want to use, and then get a persistent handle on the service you want.
&lt;code&gt;&lt;/code&gt;&lt;code&gt;typescript
db = getDatabase(this.fbApp);
storage = getStorage(this.fbApp);
auth = getAuth(this.fbApp);
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's &lt;a href="https://github.com/StephenFluin/fluin.io/commit/2d14ebb82fd47ac0b217267847ed48ca3c379cc0"&gt;the commit on the fluin.io repo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>v18</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Introduction to i18n for Angular</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Sun, 08 Dec 2019 07:46:28 +0000</pubDate>
      <link>https://dev.to/stephenfluin/introduction-to-i18n-for-angular-15o8</link>
      <guid>https://dev.to/stephenfluin/introduction-to-i18n-for-angular-15o8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eQRPVtTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fintroduction-to-i18n-for-angular%252FIMG_20160830_104245.jpg%3Falt%3Dmedia%26token%3D025048f2-a7e2-45a8-97cd-72cabf4dcb95" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eQRPVtTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fintroduction-to-i18n-for-angular%252FIMG_20160830_104245.jpg%3Falt%3Dmedia%26token%3D025048f2-a7e2-45a8-97cd-72cabf4dcb95" alt="France" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written for version 9.0 of Angular or later&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;English is the most common language for the web, but if you ignore other languages and locales, you're missing out on &lt;strong&gt;80% of the planet&lt;/strong&gt;. In my experience at companies like &lt;a href="https://trello.com/"&gt;Trello&lt;/a&gt; and Google, I saw first hand that localization (l10n) and internationalization (i18n) can be a competitive advantage.&lt;/p&gt;

&lt;p&gt;Supporting customers in other regions by understanding their language and expectations can have great rewards. Every user prefers an application that treats you like a first class citizen?&lt;/p&gt;

&lt;h2&gt;
  
  
  I18n in Angular
&lt;/h2&gt;

&lt;p&gt;Angular was built with internationalization in mind. There are built-in capabilities for localizing dates, currency, numbers, and more, but part of the magic comes from the declarative templates.&lt;/p&gt;

&lt;p&gt;The way you build applications in Angular is to create a tree of components, each with an HTML template. In that template you'll see normal HTML, as well as custom Angular components.&lt;/p&gt;

&lt;p&gt;In this intro, I'm going to momentarily ignore pipes and complexities like genders, plurals, and focus on the basics of i18n.  There's an awesome &lt;a href="https://next.angular.io/guide/i18n"&gt;full i18n guide&lt;/a&gt;  on angular.io.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VMuFPIRA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fintroduction-to-i18n-for-angular%252FIMG_2685.JPG%3Falt%3Dmedia%26token%3D225d3c7b-d5c6-48e9-910f-365691632351" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VMuFPIRA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fintroduction-to-i18n-for-angular%252FIMG_2685.JPG%3Falt%3Dmedia%26token%3D225d3c7b-d5c6-48e9-910f-365691632351" alt="Alexander Nevsky Cathedral" width="500" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1:&lt;code&gt;i18n&lt;/code&gt; markers in elements
&lt;/h2&gt;

&lt;p&gt;Angular has built-in support for translations and i18n as part of the template syntax.&lt;/p&gt;

&lt;p&gt;Let's imagine we have a &lt;code&gt;span&lt;/code&gt; and a &lt;code&gt;my-component&lt;/code&gt;. Both are marked for internationalization the same way. Add what looks like an &lt;code&gt;i18n&lt;/code&gt; attribute. This will be stripped away by the build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;i18n&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello!&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;my-component&lt;/span&gt; &lt;span class="na"&gt;i18n&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Goodbye!&lt;span class="nt"&gt;&amp;lt;my-component&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For both of these, the &lt;code&gt;i18n&lt;/code&gt; markers indicate that the strings within the tags should be translated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2:&lt;code&gt;i18n-X&lt;/code&gt; markers in properties/attributes
&lt;/h2&gt;

&lt;p&gt;Similarly we can mark properties/attributes for translation. Let's imagine a simple image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img alt="Hello world" i18n-alt src="my-image.jpg"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;i18n-alt&lt;/code&gt; marker indicates that the "alt" attribute should be translated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Install @angular/localize
&lt;/h2&gt;

&lt;p&gt;Add a dependency on &lt;code&gt;@angular/localize&lt;/code&gt; in your package.json. The version number should match the rest of the Angular framework packages&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Extract Strings
&lt;/h2&gt;

&lt;p&gt;The CLI has the capability of extracting all of the marked strings into an industry-standard format, such as &lt;a href="https://en.wikipedia.org/wiki/XLIFF"&gt;&lt;code&gt;XLIFF&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng xi18n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;x18n refers to 'extract internationalization". This will render a new file located at&lt;code&gt;src/messages.xlf&lt;/code&gt;. Open this messages file in a translation tool (eg &lt;a href="https://virtaal.translatehouse.org/"&gt;Virtaal&lt;/a&gt;) or pass it to a &lt;a href="https://www.onehourtranslation.com/"&gt;translation house&lt;/a&gt; for translation.&lt;/p&gt;

&lt;p&gt;What you should get back is a translated XLIFF file. Let's imagine I get back a french file and store it at &lt;code&gt;src/messages.fr.xlf&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Configure &lt;code&gt;angular.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As of 9.0 and Ivy, multiple translated builds can be quickly produced as part of the CLI's standard build process.  This used to be really slow and somewhat manual.&lt;/p&gt;

&lt;p&gt;Within your &lt;em&gt;project key&lt;/em&gt; in &lt;code&gt;angular.json&lt;/code&gt;, add an &lt;code&gt;i18n&lt;/code&gt; key and specify the source locale and locales you would like translated, along with their translated XLIFF file. The original strings in this example were written in English (&lt;code&gt;en-US&lt;/code&gt;), and the the new language is French (&lt;code&gt;fr&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nl"&gt;"i18n"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"sourceLocale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"locales"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"fr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/messages.fr.xlf"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll also have to set "localize" to &lt;code&gt;true&lt;/code&gt; in your &lt;code&gt;angular.json&lt;/code&gt; configuration options. This belongs, for example, within &lt;code&gt;angular.json&lt;/code&gt;, look for&lt;code&gt;/projects/my-project/architect/build/configurations/production/localize&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nl"&gt;"localize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Run a build
&lt;/h2&gt;

&lt;p&gt;Based on the newly configured &lt;code&gt;angular.json&lt;/code&gt; file, every time you run a production build with &lt;code&gt;ng build --prod&lt;/code&gt;, you'll get two (or more) folders in your &lt;code&gt;/dist/&lt;/code&gt; directory, one for each locale and the original locale.&lt;/p&gt;

&lt;p&gt;With build-time i18n, there's NO performance overhead at runtime, as each set of static files is entirely dedicated to a single language. Runtime i18n, where messages are loaded as part of application bootstrap, will be made available in the future.&lt;/p&gt;

&lt;p&gt;To see your site live, just host each version of the site in a different folder or different domain. This could be &lt;code&gt;example.org/en-US/&lt;/code&gt; and &lt;code&gt;example.org/fr/&lt;/code&gt;, or it could be &lt;code&gt;example.org&lt;/code&gt; and &lt;code&gt;fr.example.org&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>internationalization</category>
      <category>webdev</category>
      <category>templates</category>
    </item>
    <item>
      <title>What to Do If You Are Trapped on Angular v4?</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Sat, 07 Dec 2019 07:39:34 +0000</pubDate>
      <link>https://dev.to/stephenfluin/what-to-do-if-you-are-trapped-on-angular-v4-5g0j</link>
      <guid>https://dev.to/stephenfluin/what-to-do-if-you-are-trapped-on-angular-v4-5g0j</guid>
      <description>&lt;p&gt;This article is for anyone still on Angular versions 2.x, 4.x, or 5.x.&lt;/p&gt;

&lt;p&gt;Since May of 2018 and the release of version 6.0, it's been easy to stay up to date with Angular. That was the release where the CLI, framework, and material packages were all synchronized on their major versions. The 6.0 release introduced a version of &lt;code&gt;ng update&lt;/code&gt; that would automatically migrate your applications, keeping them up to date by using Schematics.&lt;/p&gt;

&lt;p&gt;If you are on version 6 or later, you get all of these benefits, but what if your application is on version 5, 4, or 2? You could manually move from 2-&amp;gt;4 by updating your package.json, then move from 4-&amp;gt;5 the same way. You could finally use the 6.0 CLI version of &lt;code&gt;ng update&lt;/code&gt; to move to 6.0, but this isn't my recommendation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from scratch
&lt;/h2&gt;

&lt;p&gt;My core recommendation is to start from scratch. Not restarting your code (components, modules, etc), but only the build system and other files that the Angular CLI creates. This includes things like &lt;code&gt;polyfills.ts&lt;/code&gt;, &lt;code&gt;tsconfig.json&lt;/code&gt; files, your &lt;code&gt;angular.json&lt;/code&gt; (formerly &lt;code&gt;angular-cli.json&lt;/code&gt;) and other build configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Start a new CLI project
&lt;/h2&gt;

&lt;p&gt;Since we're starting from scratch, let's start with the latest version of Angular. You can either install it globally, or just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx @angular/cli new my-new-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a blank project, following all of the latest and greatest best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Migrate your application code
&lt;/h2&gt;

&lt;p&gt;You should basically be able to copy and paste all of your TypeScript code from your &lt;code&gt;src/app&lt;/code&gt; folder into the new &lt;code&gt;src/app&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;This should virtually work out of the box, but you should double-check things at this point. open VS Code and look for errors and make sure the major functionality of your app works.&lt;/p&gt;

&lt;p&gt;If you have any dependencies, you'll have to add them back into your package.json.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Fix any Angular changes
&lt;/h2&gt;

&lt;p&gt;Versions 4, 5, 6, 7, 8, and 9 don't include a ton of breaking changes, but there's a chance that something isn't compatible. &lt;/p&gt;

&lt;p&gt;Take a look at &lt;a href="https://update.angular.io"&gt;update.angular.io&lt;/a&gt; and see the list of changes that have happened within Angular. This should give you some high-level guidance for fixing anything that might have changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Migrate your assets and other files
&lt;/h2&gt;

&lt;p&gt;Now that the application works, make it complete by migrating assets, favicons, and anything else that you might have to update pointers for in your &lt;code&gt;angular.json&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Double-check everything
&lt;/h2&gt;

&lt;p&gt;At this point, you should be all set. There might be some final cleanup necessary. Things like dependencies should be updated. Make sure your linting and end to end tests work. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Fix your git history
&lt;/h2&gt;

&lt;p&gt;This is a little bit complex, but I recommend blowing away the &lt;code&gt;my-new-app&lt;/code&gt; git configuration located in &lt;code&gt;.git&lt;/code&gt; and then copy the &lt;code&gt;.git&lt;/code&gt; folder from the old project.&lt;/p&gt;

&lt;p&gt;When you run &lt;code&gt;git status&lt;/code&gt;, you should be able to run &lt;code&gt;git add .&lt;/code&gt; to stage a large single diff, moving your application from your old version to the new version of Angular. Then you can &lt;code&gt;git commit&lt;/code&gt; and finalize and push the changes back to your repository.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>versioning</category>
      <category>updates</category>
    </item>
    <item>
      <title>Host Your Angular Project With GitHub</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Fri, 06 Dec 2019 06:36:06 +0000</pubDate>
      <link>https://dev.to/stephenfluin/host-your-angular-project-with-github-2p05</link>
      <guid>https://dev.to/stephenfluin/host-your-angular-project-with-github-2p05</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; is one of the central places that developers go to share, collaborate, and host the code for their projects.  One of the most overlooked capabilities of GitHub is that since all the way back in 2009, GitHub has offered really &lt;a href="https://pages.github.com/"&gt;simple free hosting for web applications&lt;/a&gt; to let users access the built version of your app.&lt;/p&gt;

&lt;p&gt;Normally to use GitHub hosting, you'd setup a custom branch and commit and push static assets (and optionally &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; configuration). This was kind of a pain, and I think this was the main thing preventing most developers from using their hosting. &lt;/p&gt;

&lt;p&gt;The Angular community and the new &lt;code&gt;builders&lt;/code&gt; API have come to the rescue now though, and it's almost trivial to setup and use GitHub pages for hosting your small Angular App.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage Limits
&lt;/h2&gt;

&lt;p&gt;This isn't for everyone, but their limits are pretty high. Their &lt;a href="https://help.github.com/en/github/working-with-github-pages/about-github-pages#usage-limits"&gt;limits&lt;/a&gt; include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1GB of disk space&lt;/strong&gt;  - I've NEVER seen an Angular app need this much storage, typically big files go in a backend or bucket or cloud storage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100GB&lt;/strong&gt; of bandwidth per month  - If your app is 6MB (which is crazy high, but &lt;a href="https://fluin.io/blog/is-my-angular-performance-normal"&gt;pretty normal&lt;/a&gt;), you could host an app with 25,000 monthly visits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 builds per hour&lt;/strong&gt; - I think we'll be okay :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So while we couldn't host &lt;a href="https://angular.io"&gt;angular.io&lt;/a&gt; on there, I'd argue there are hundreds of thousands of apps that could be hosted just fine on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to deploy to GitHub pages in Angular
&lt;/h2&gt;

&lt;p&gt;To do this we're going to configure a new dependency in our project with &lt;code&gt;ng add&lt;/code&gt;. This new dependency is going to setup a builder that will do all of the heavy lifting for us.&lt;/p&gt;

&lt;p&gt;These steps already assume you have Git setup and connected to your origin on GitHub.&lt;/p&gt;

&lt;p&gt;Simply run the following in your app to set it up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng add angular-cli-ghpages

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

&lt;/div&gt;



&lt;p&gt;That's it. Now to actually do the build and deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng deploy &lt;span class="nt"&gt;--base-href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;REPOSITORY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;base-href&lt;/code&gt; option makes it so the application can work when being served from that subdirectory. This will cause a path like &lt;code&gt;/about&lt;/code&gt; to resolve to &lt;code&gt;/REPOSITORY/about&lt;/code&gt;, which is what you want.&lt;/p&gt;

&lt;p&gt;Your site will now be live at &lt;code&gt;https://USERNAME.github.io/REPOSITORY/&lt;/code&gt; (eg &lt;a href="https://stephenfluin.github.io/angular-minesweeper/"&gt;https://stephenfluin.github.io/angular-minesweeper/&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;Back in my day we had to deploy by walking 14 miles in the snow, uphill both ways. You whippersnappers have it so easy.&lt;/p&gt;

&lt;p&gt;Running the deploy command will trigger several steps: the builder will initiate a production build, commit only the results into the gh-pages branch, and push it up to GitHub. Your app will be live instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it awesome
&lt;/h2&gt;

&lt;p&gt;To really make your app shine, you should probably move it to a custom domain name. Let's give that a try.&lt;/p&gt;

&lt;p&gt;Open the settings for the repository.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q1RoHiPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhost-your-angular-project-with-github%252FScreenshot_20191205_214842.png%3Falt%3Dmedia%26token%3Db79dd47a-d4b9-48d7-985d-50a496a24d27" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q1RoHiPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhost-your-angular-project-with-github%252FScreenshot_20191205_214842.png%3Falt%3Dmedia%26token%3Db79dd47a-d4b9-48d7-985d-50a496a24d27" alt="settings screenshot" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now scroll down to the "GitHub Pages" section. This is where the controls are for setting up the branch the site is hosted from. You'll only need to customize the "Custom domain" section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p90yBCzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhost-your-angular-project-with-github%252FScreenshot_20191205_214909.png%3Falt%3Dmedia%26token%3D0fcd3104-bb18-4b62-ae3f-ce363aaa66b6" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p90yBCzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhost-your-angular-project-with-github%252FScreenshot_20191205_214909.png%3Falt%3Dmedia%26token%3D0fcd3104-bb18-4b62-ae3f-ce363aaa66b6" alt="settings screenshot - github pages" width="328" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter a domain like &lt;code&gt;app.mydomain.com&lt;/code&gt;, then go and create the records in your DNS provider. You'll need to create a CNAME record pointing at &lt;code&gt;USERNAME.github.io&lt;/code&gt;, and things should just work.&lt;/p&gt;

&lt;p&gt;Want to make it ever better? You'll want a bare custom domain; this is when you want to host without a subdomain. These are called apex domains by GitHub.&lt;/p&gt;

&lt;p&gt;To do this, you'll change the repository's GitHub Pages setting to the new domain, and then setup A records pointing at &lt;a href="https://help.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-an-apex-domain"&gt;185.199.108.153, 185.199.109.153, 185.199.110.153, and 185.199.111.153&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>github</category>
      <category>hosting</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Is My Angular Performance Normal?</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Thu, 05 Dec 2019 03:44:21 +0000</pubDate>
      <link>https://dev.to/stephenfluin/is-my-angular-performance-normal-35g5</link>
      <guid>https://dev.to/stephenfluin/is-my-angular-performance-normal-35g5</guid>
      <description>&lt;p&gt;One of the most common things I do when encountering a new Angular app or team, is to take a look at their application in &lt;a href="https://developers.google.com/web/tools/chrome-devtools"&gt;DevTools&lt;/a&gt;. There isn't a ton you can do to see the underlying code or architecture, but there's a a couple things you can do.&lt;/p&gt;

&lt;p&gt;You can check to see what version of Angular they are using. Just search for &lt;code&gt;ng-version&lt;/code&gt; in the elements tab. You could also just have installed my &lt;a href="https://chrome.google.com/webstore/detail/angular-inspector/odkdoekijebogaiopbjgkgogkgifjfnk"&gt;Angular Inspector extension&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The other thing you can do is to see how big and fast the application is. Just switch over to the network tab and look at how much your browser has to download to run and display the first page of an application. To me, this is one of the most important performance considerations as the initial load time of your users is almost entirely determined by your initial bundle size. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J-ctJZsu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fis-my-angular-performance-normal%252FScreenshot_20191204_193731.png%3Falt%3Dmedia%26token%3D0af38e89-a288-4d89-83e2-a8b9f3327523" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J-ctJZsu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fis-my-angular-performance-normal%252FScreenshot_20191204_193731.png%3Falt%3Dmedia%26token%3D0af38e89-a288-4d89-83e2-a8b9f3327523" alt="Network tab can show JS resources size and transfers" width="393" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You could have as much code as you wanted if you lazy loaded it at the right time, and users would never know, but the initial load is what could cost you millions if your site is too slow for your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Normal?
&lt;/h2&gt;

&lt;p&gt;Here's a few example Angular apps (from successful companies) that you can see in the wild and their inital bundle size as reported by DevTools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delta.com: 4.2MB&lt;/li&gt;
&lt;li&gt;Forbes.com: 5.7MB&lt;/li&gt;
&lt;li&gt;Android Messages: 1.1MB&lt;/li&gt;
&lt;li&gt;Grubhub: 3.4MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For comparison, here's some non-Angular JavaScript bundle sizes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;microsoft.com is 1.4MB&lt;/li&gt;
&lt;li&gt;amazon.com is 7.5MB&lt;/li&gt;
&lt;li&gt;theverge.com is 9.6MB&lt;/li&gt;
&lt;li&gt;Wikipedia pages are 223KB&lt;/li&gt;
&lt;li&gt;reddit.com is 4.9MB&lt;/li&gt;
&lt;li&gt;netflix.com is 4.2MB (for logged in users)&lt;/li&gt;
&lt;li&gt;twitter.com is 3.5MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep in mind that for some of these, it's not as bad as it sounds. Server side rendering or prerendering can mean that a lot of this JS is not in the critical path for page rendering, which is one GREAT way to partially get around initial JS size. Some of these also conditionally serve JS based on heuristics about anticipated user activity, which is another great strategy. Serving different bundles to different user types (fast network, slow network, powerful device, slow device) is also another advanced strategy that will change these numbers.&lt;/p&gt;

&lt;p&gt;Looking at how big the top web properties are getting today... Yeah, &lt;strong&gt;your app is probably normal&lt;/strong&gt;. But is that who you want to be?&lt;/p&gt;

&lt;h2&gt;
  
  
  Normal is not good enough
&lt;/h2&gt;

&lt;p&gt;It's worth noting that the moment you start pushing past a few hundred kilobytes, your users (especially on mobile) are going to have to start to wait for you. Waiting kills user experience, it kills engagement, it kills sales. &lt;/p&gt;

&lt;p&gt;If you used almost every single feature of Angular on your home page, including browser animations, forms, the router, http, and some Angular Material components (by the way, don't load everything on your home page), but wrote no code yourself, your entire application would be less than 400kb, which means that any time your application exceeds 800 or 900kb, it's because you are asking your users to run lots of &lt;strong&gt;your&lt;/strong&gt; code to generate your pages.&lt;/p&gt;

&lt;p&gt;If you look at the coverage report available in the bottom pane, the situation is almost dismal. Most of the time, &lt;strong&gt;LESS&lt;/strong&gt; than 50% of the JavaScript sent down with a page is executed on initial load. A bunch of this code is for is error handling, and some of it can be Angular's fault, but a lot of the unused JavaScript comes from us just not being aware of the problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jHnetbal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fis-my-angular-performance-normal%252FScreenshot_20191203_230949.png%3Falt%3Dmedia%26token%3D3887b9f5-edd5-4ff3-b937-19adeb8b9527" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jHnetbal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fis-my-angular-performance-normal%252FScreenshot_20191203_230949.png%3Falt%3Dmedia%26token%3D3887b9f5-edd5-4ff3-b937-19adeb8b9527" alt="delta.com code coverage shows 64% unused code in main.js" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FYI this blog is about 482KB today, and sometimes benefits from prerendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Culprits
&lt;/h2&gt;

&lt;p&gt;How does this happen? How do we go from a blank application with all of the platform features at 400KB to a real application in the several megabytes range? The most common cause is marketing and advertising tools. Everything from your analytics package, to your user tracking, to your help desk tools can end up costing your usres and harming user experience, when they were built to try to help. &lt;/p&gt;

&lt;p&gt;Here's some of the top offenders I've seen polluting bundle size and performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SiteCatalyst&lt;/li&gt;
&lt;li&gt;fbevents&lt;/li&gt;
&lt;li&gt;ruxit&lt;/li&gt;
&lt;li&gt;LivePerson&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are hundreds more, but these are ones that I've seen multiple times when inspecting large applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do I do?
&lt;/h2&gt;

&lt;p&gt;Decide when, where, and how you want to set the balance between user experience, load performance, customer engagement, and intelligence.&lt;/p&gt;

&lt;p&gt;Analyze your bundles ruthlessly. Generate source maps for every chunk and every bundle, and look to see what's in them? I recommend &lt;code&gt;source-map-explorer&lt;/code&gt;. Don't be afraid to ask why you are making your users pay for certain features, capabilities, and dependencies.&lt;/p&gt;

&lt;p&gt;If you really want a single button a user can press to get a live person, why not separate the actual functionality into a lazy route, and only render the button until a user requests it?&lt;/p&gt;

&lt;p&gt;Hopefully this post has made you feel better and worse at the same time. If you have small bundles, congratulations! Keep it up! If you have large bundles, you're probably in good company, but we all need to strive to do better for our users.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>performance</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>State of Angular Design Tools</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Wed, 04 Dec 2019 06:28:44 +0000</pubDate>
      <link>https://dev.to/stephenfluin/state-of-angular-design-tools-2d5k</link>
      <guid>https://dev.to/stephenfluin/state-of-angular-design-tools-2d5k</guid>
      <description>&lt;p&gt;In 2018 I gave a talk titled "&lt;a href="https://www.youtube.com/watch?v=LP-fNM8OITI"&gt;Angular for Designers&lt;/a&gt;". It's been one of the talks that I get asked about most often, so I want to give an update.&lt;/p&gt;

&lt;p&gt;In the talk, I lay out that the Angular team cares about designers, this is true! A lot of the simplifications to Angular over the last couple of years have been focused on making it easier for anyone to pick up and go with Angular, but beyond the changes within Angular, the ecosytem has been doing an awesome job of rising to this challenge.&lt;/p&gt;

&lt;p&gt;Here are a few of the tools out that that might be interesting to those of us with a design slant.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ionicframework.com/studio"&gt;Ionic Studio&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tbwv2LuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ionicframework.com/img/products/studio/screenshot-main-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tbwv2LuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ionicframework.com/img/products/studio/screenshot-main-2.png" alt="Ionic Studio Screenshot" width="800" height="480"&gt;&lt;/a&gt;&lt;br&gt;
I consider the direction Ionic Studio is headed to be the closest thing to "unified design and development". The ionic team are working on enabling designers to load existing projects and create new ones in a way that will keep working after development has begun. &lt;/p&gt;

&lt;p&gt;By getting rid of the handoff step from design to development, it enables both Designers and Developers to take advantage of each others tooling and to grow their skillsets, it creates more collaboration across the lifetime of a project, and it means that you don't have the churn of going back and forth reproducing similar work when the direction changes from one team or another.&lt;/p&gt;

&lt;p&gt;This is a paid tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://angularconsole.com/"&gt;Angular Console&lt;/a&gt; &amp;amp; &lt;a href="https://code.visualstudio.com/"&gt;VS Code&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--krI0R-P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fstate-of-angular-design-tools-2019%252FScreenshot_20191202_233647.png%3Falt%3Dmedia%26token%3Dcc5664de-3427-4192-b57b-3674e029f57b" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--krI0R-P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fstate-of-angular-design-tools-2019%252FScreenshot_20191202_233647.png%3Falt%3Dmedia%26token%3Dcc5664de-3427-4192-b57b-3674e029f57b" alt="Angular Console in VS Code Screenshot" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of running terminal commands, but want to get comfortable with Angular? &lt;a href="https://angularconsole.com/"&gt;Angular Console&lt;/a&gt; is a great tool from the folks over at Narhwal that wraps the Angular CLI with a bunch of simple GUI interfaces that allow you to create, scale, serve, and build individual Angular projects and libraries.&lt;/p&gt;

&lt;p&gt;This is a free tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://uibakery.io/"&gt;UI Bakery&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rbH4n6gT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fstate-of-angular-design-tools-2019%252FScreenshot_20191202_234245.png%3Falt%3Dmedia%26token%3D9411a973-e43b-4c26-a88e-b8aecf7be0e1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rbH4n6gT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fstate-of-angular-design-tools-2019%252FScreenshot_20191202_234245.png%3Falt%3Dmedia%26token%3D9411a973-e43b-4c26-a88e-b8aecf7be0e1" alt="Ui Bakery Screenshot" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A paid tool from the folks at Nebular, they are trying to solve the challenge of giving designers a WYSIWYG editor that can use their Nebular component library to design real Angular apps and components. &lt;/p&gt;

&lt;p&gt;At any time, you can hit the "get code" button to export your project to a real Angular CLI project, giving you a very strong jumping off point for development, and giving designers the ability to design within the bounds of HTML/CSS/Componentry.&lt;/p&gt;

&lt;p&gt;This is a paid service.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.infragistics.com/products/indigo-design"&gt;Indigo Design&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you like the Indigo component library, they actually give you Sketch componentry that you can use to create realistic mockups. The magic for Indigo is that they have a web based code generation service that will take the components you assemble in sketch and it will spit out an Angular CLI project.&lt;/p&gt;

&lt;p&gt;Design in sketch with their components, get a real project.&lt;/p&gt;

&lt;p&gt;This is a paid service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codesign
&lt;/h2&gt;

&lt;p&gt;The Google-built tool I mentioned (and has sinced been shared more broadly at other conferences) is currently called Codesign, and right now it's internal to Google, so external folks can't access it. The Codesign folks are hoping to do a public launch at some point in the future, but they don't have a timeline.&lt;/p&gt;

&lt;p&gt;Codesign is really good at dragging and dropping components and has a fantastic WYSIWYG editor. It has an internal data model that used to be HTML but isn't any more (designers didn't find it useful). The magic of codesign is in their ability to import other component libraries.&lt;/p&gt;

&lt;p&gt;This tool is not released.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>design</category>
      <category>tools</category>
      <category>wysiwyg</category>
    </item>
    <item>
      <title>How to Give Great Technical Presentations</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Tue, 03 Dec 2019 06:35:43 +0000</pubDate>
      <link>https://dev.to/stephenfluin/how-to-give-great-technical-presentations-2j76</link>
      <guid>https://dev.to/stephenfluin/how-to-give-great-technical-presentations-2j76</guid>
      <description>&lt;p&gt;I talk a lot. In 2018 I gave 45 presentations (&lt;a href="https://www.youtube.com/playlist?list=PLkZLBHjxfgssv4X0Bcw6I9O4s5XBUvX5x"&gt;many were recorded&lt;/a&gt;!) Most of my presentations are uniquely crafted for the topic, the event, and the audience I'm speaking to. I have also reviewed several hundred technical presentations for events I've been involved in. Here are some of the things I've learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand Yourself
&lt;/h2&gt;

&lt;p&gt;Every time I work with a speaker I ask the most important question of all:&lt;/p&gt;

&lt;p&gt;"&lt;strong&gt;After my talk, what do I want my audience to think/feel/do?&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;This is the most important question because it gets at the WHY of your presentation. If you don't have a WHY or a goal, then there's no world where you can be successful.&lt;/p&gt;

&lt;p&gt;For some folks, this is "inspire the audience to try my technology", which is okay, but can come across a little salesy. Often times talks like "build faster applications" or "start a conversation with their neighbor about X" or "can be far more impactful.&lt;/p&gt;

&lt;p&gt;Remember that human beings almost never change their behavior, so keeping your goal in mind and keeping all of the points and topics you cover connected to your central mission will help drive the right outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand Your Audience
&lt;/h2&gt;

&lt;p&gt;Who are you speaking to? Are you speaking to a homogenous crowd of experts who have the same frame of reference as you? NO! This never has and never will be the case. &lt;/p&gt;

&lt;p&gt;You should seek to put yourself in the shoes of your audience before you write your talk, to make sure you are sharing something that is of value to them in a way that makes sense.  You should ask yourself at least the following questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are there subgroups among this audience, like beginners and experts that might want different content? How do I balance between these groups?&lt;/li&gt;
&lt;li&gt;What assumptions am I making in this talk that might be different from the perspective of the audience?&lt;/li&gt;
&lt;li&gt;What are the other presentations or materials might this audience have seen?&lt;/li&gt;
&lt;li&gt;What's the right pace for this audience?&lt;/li&gt;
&lt;li&gt;How can I make my presentation stand out for this audience? More live coding or more funny cat gifs?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eDUxBzkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-give-great-technical-presentations%252FIMG_20160914_174552.jpg%3Falt%3Dmedia%26token%3De9eec6c9-87c9-4ed3-acc4-92bd5d0bb7c1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eDUxBzkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-give-great-technical-presentations%252FIMG_20160914_174552.jpg%3Falt%3Dmedia%26token%3De9eec6c9-87c9-4ed3-acc4-92bd5d0bb7c1" alt="Balloons at the release of Angular 2.0" width="800" height="598"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Tell a Story
&lt;/h2&gt;

&lt;p&gt;Let me compare three ways of conveying information:&lt;/p&gt;

&lt;p&gt;"Angular released 2.0 on September 14th, 2019."&lt;/p&gt;

&lt;p&gt;"The Angular team held a big party in September 2019 to celebrate a moment they had been waiting for, the 2.0 release."&lt;/p&gt;

&lt;p&gt;"In September 2019, Jules had this crazy idea to order a giant pack of balloons that we would drop from the ceiling as part of the 2.0 release of Angular. David East volunteered to pull the string, but when the time came live on stage, the bag wouldn't open, and David almost cut his hands trying to get it open in front of the live audience."&lt;/p&gt;

&lt;p&gt;The first conveyed information, and the information is easily forgotten and the specifics don't really matter.&lt;/p&gt;

&lt;p&gt;The second started to share a moment in time, but it's shared in an abstract way without humanity or personal connection.&lt;/p&gt;

&lt;p&gt;The third shared a place, a time. You can picture David East at the front of the room fighting with the bag of balloons, and you're hundreds of times more likely to remember the story and connect emotionally to the feeling the team had during the 2.0 release of Angular.&lt;/p&gt;

&lt;p&gt;Be a human and be yourself. Your audience will appreciate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Read Slides
&lt;/h2&gt;

&lt;p&gt;DO NOT READ SLIDES VERBATIM. If you were going to read to me your presentation, I'd much rather just have a download link. I can read slides faster than anyone can speak them. Even reading a script from speaker notes means that you're not going to be having an emotional connection to the audience. Everyone has different ways of accomplishing this, but my preferred technique has two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don't use speaker notes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My slides tell me the right stories to tell and the major points to hit. Find a point you can already talk about for 30-60 seconds, and make a simple slide that reminds you to hit that point.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User Fewer words on slides&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll often start with a bullet point (bullet points can be boring, avoid them if you can) like: "Don't forget to update to the latest version" and then look at it again and slice it to say "update to the latest version" and hopefully end on something even shorter and simpler. like "stay up to date".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w0e7s7EA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-give-great-technical-presentations%252FIMG_20161214_103635.jpg%3Falt%3Dmedia%26token%3D94b4744c-7b79-4997-8f69-45b5e5efc3c7" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w0e7s7EA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-give-great-technical-presentations%252FIMG_20161214_103635.jpg%3Falt%3Dmedia%26token%3D94b4744c-7b79-4997-8f69-45b5e5efc3c7" alt="Angular presentation in China" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep It Short
&lt;/h2&gt;

&lt;p&gt;Short talks are much easier than longer talks. If you have a choice, go for 20 minutes or less. It's far easier to keep an audience's attention for 20 minutes than to structure a talk for 60 minutes where you will inevitably end up speaking first thing in the morning or right after lunch, and you'll enter the battle of your life trying to keep the audience engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice delivery
&lt;/h2&gt;

&lt;p&gt;People are going to pay far more attention to the WAY you say things, than WHAT you say.&lt;/p&gt;

&lt;p&gt;One of my favorite exercises to push you beyond your normal way of speaking and to increase your vocal variety is to grab a children's book and practice reading it. Read it through aloud a few times, and each time vary a different skill.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pace - go really fast and then really slow&lt;/li&gt;
&lt;li&gt;Volume - yell some words and sentences and whisper others&lt;/li&gt;
&lt;li&gt;Pitch - high pitch like a tiny mouse, low pitch like a giant drum&lt;/li&gt;
&lt;li&gt;Pauses - don't talk for 20 seconds between two sentences, and don't stop talking at all&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key here is EXTREMES. Go CRAZY! The further you take yourself out of your comfort zone, the more variety you'll end up adding to your actual talk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skip the Q&amp;amp;A
&lt;/h2&gt;

&lt;p&gt;Some conferences love Q&amp;amp;A, but I recommend you reject it or don't leave time for it. Most of the time the questions you get are going to be poorly prepared, poorly explained, and only apply to a tiny subset of the audience. Instead you should make it clear how people can get a hold of you, or share their thoughts on your ideas.&lt;/p&gt;

&lt;p&gt;Often times you'll need to change locations, so if you can say "meet me outside after the presentation if you want to get involved" this can be a great way to take control and build further engagement with your audience after the talk is done.&lt;/p&gt;

</description>
      <category>speaking</category>
      <category>techtalks</category>
      <category>angular</category>
      <category>communication</category>
    </item>
    <item>
      <title>How to Become an Angular GDE</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Mon, 02 Dec 2019 17:55:48 +0000</pubDate>
      <link>https://dev.to/stephenfluin/how-to-become-an-angular-gde-378e</link>
      <guid>https://dev.to/stephenfluin/how-to-become-an-angular-gde-378e</guid>
      <description>&lt;p&gt;Today, there are over 100 Angular Google Developer Experts (GDEs) &lt;a href="https://developers.google.com/community/experts/directory"&gt;across the globe&lt;/a&gt;. These folks are impactful for the community, well versed in the world of building great web experiences, and experts in the technologies that make up &lt;a href="https://angular.io"&gt;Angular&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We receive applications every day with new folks wanting to join the program, and this is one of the best parts of my job. Every week I get to meet new people that are passionate about sharing with, empowering, and engaging with others via technology. I get to meet people that are much smarter than me, and people that are building some of the coolest technology on the planet.&lt;/p&gt;

&lt;p&gt;One of the toughest parts of my job is that there are literally &lt;em&gt;thousands&lt;/em&gt; of people doing this at local meetups, regional events, and in local and online communities, but not everyone can be called a GDE. We save that designation for the TOP experts, who are pushing the limits of the technology, who are the best teachers and sharers, and those out there who are having the biggest impact on their communities.&lt;/p&gt;

&lt;p&gt;To help those that think the Angular GDE designation might might be for them, I want to break down the criteria, the process, and give some general tips.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PozAGUet--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-become-an-angular-gde%252FMVIMG_20190506_164645.jpg%3Falt%3Dmedia%26token%3De664f3b5-dcf5-4cda-ba61-58be435b7d80" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PozAGUet--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-become-an-angular-gde%252FMVIMG_20190506_164645.jpg%3Falt%3Dmedia%26token%3De664f3b5-dcf5-4cda-ba61-58be435b7d80" alt="Angular GDEs visiting the Google office to provide feedback" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Criteria
&lt;/h2&gt;

&lt;p&gt;Every GDE is different. Some are heavy content-authors, writing viral content that engages and enlightens millions of developers. Others are speakers, presenting at the biggest tech events. Others are pushing new communities forward, creating events and opportunities for people to come together and collaborate.&lt;/p&gt;

&lt;p&gt;In general, we're looking for people with accurate skills and knowledge about specific technologies like Angular and the web who combine this knowledge with great community impact and reach, leaving their mark on the world every month.&lt;/p&gt;

&lt;p&gt;We generally look at Angular GDEs based on their activities in 5 categories (not all GDEs are active in all categories).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speaking&lt;/li&gt;
&lt;li&gt;Organizing&lt;/li&gt;
&lt;li&gt;Content&lt;/li&gt;
&lt;li&gt;Developing&lt;/li&gt;
&lt;li&gt;Mentoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also look at your technology understanding and your ability to communicate about technology. You should be able to have a conversation and convey how you teach and explain Angular concepts, and show you have the technical grounding necessary to represent the technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Be Awesome&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pretty simple, right? Not exactly. It can be hard to be heard above the cacophony of internet noise. It's hard to write blog posts that people want to read, it's hard to create repositories developers want to fork and learn from. It's hard to get accepted at top conferences. All of these things are hard to do, but you need to be doing really well in at least one of these to be considered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Get Referred&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The easiest way to submit an application is to be referred by an existing GDE. If the program is currently accepting new candidates, a GDE referral should let you fill out an application. You should look through the criteria and determine that you are good fit before applying, because we ask for a lot of details and the application process can take a lot of time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Fill out a CV&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CV process has you sharing the metrics for your activities. You'll be asked to include links and evidence of your impact. This will be used throughout the process to measure and understand the awesome things you are doing for the community. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Interviews &amp;amp; Checks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you have filled our your CV, you might get rejected right away, or you might be asked to do one or several interviews. These interviews typically cover a lot of what you put in your CV, as well as how you deal with interactions with the others, thoughts on current events. You'll be asked questions and opinions about technology and Angular. This is your opportunity to explain your impact, and show your expertise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Determination&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you have made it through all of the checks and interviews, the full story of your activities will be reviewed again, and you'll receive a determination. &lt;/p&gt;

&lt;p&gt;Typically if you have made it through several of the interviews but are rejected near the end, you'll be invited to try again in the future if your impact and skills look likely to continue to grow. &lt;/p&gt;

&lt;p&gt;If you are accepted, welcome to the program!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Maintain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GDE status is generally awarded yearly, so make sure you are continuing the awesome things that you were doing when you became a GDE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OeimOl6a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-become-an-angular-gde%252FIMG_20191027_115618_1.jpg%3Falt%3Dmedia%26token%3Df3a19e16-283c-4a9e-a70e-39ec70d2a81d" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OeimOl6a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252Fhow-to-become-an-angular-gde%252FIMG_20191027_115618_1.jpg%3Falt%3Dmedia%26token%3Df3a19e16-283c-4a9e-a70e-39ec70d2a81d" alt="Angular GDEs hearing about the upcoming program updates" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Remember
&lt;/h2&gt;

&lt;p&gt;The GDE program isn't currently doing enough to represent local communities around the globe .  There are millions of developers in places like China, Russia, and India but we only have relatively few GDEs there compared to places where we have lots of GDEs, like in the US. We often have to consider different expectations based on different regions and cultural differences.&lt;/p&gt;

&lt;p&gt;GDEs aren't only sharing technology with the world, they must be active listeners as well. We value a unique insight about technology or people far more than we value the act of taking existing concepts and explaining them to the world. We frequently ask our GDEs for thoughts and opinions on new APIs, and for feedback about our releases and efforts.&lt;/p&gt;

&lt;p&gt;Finally, if you want to become a GDE because you think it will change your life and your career, you might be doing it for the wrong reason. We like to say that we don't create GDEs, we merely recognize them.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>gde</category>
      <category>webdev</category>
      <category>community</category>
    </item>
    <item>
      <title>5 Things to Do After `ng new`</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Tue, 20 Aug 2019 17:48:08 +0000</pubDate>
      <link>https://dev.to/stephenfluin/5-things-to-do-after-ng-new-1nd7</link>
      <guid>https://dev.to/stephenfluin/5-things-to-do-after-ng-new-1nd7</guid>
      <description>&lt;p&gt;The Angular CLI is the recommended approach for starting new Angular applications, because it gives you an awesome app out of the box. But let's imagine you've run &lt;code&gt;ng new&lt;/code&gt; already. What should you do next? How can you help ensure you build an awesome app that scales?&lt;/p&gt;

&lt;p&gt;For the purposes of this article, I'm going to assume you already chose to use &lt;a href="https://sass-lang.com/"&gt;SCSS&lt;/a&gt; and the &lt;a href="https://angular.io/guide/router"&gt;router&lt;/a&gt; when prompted, because both of those are &lt;strong&gt;very&lt;/strong&gt; good ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Setup naive continuous integration with CircleCI
&lt;/h2&gt;

&lt;p&gt;I call this a naive configuration, because it's not truly "continuous integration" until you have a much more robust system, but it's been a great starting point for applications I've worked on. I used to use TravisCI but it looks like the world is moving towards &lt;a href="https://circleci.com"&gt;CircleCI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a file called &lt;code&gt;.circleci/config.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you know how to configure CircleCI, great! Go ahead and do that. If you don't? Just use my most basic config here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;working_directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/my-project&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;circleci/node:12-browsers&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;restore_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Restore Yarn Package Cache&lt;/span&gt;
          &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yarn-packages-{{ checksum "yarn.lock" }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Dependencies&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn install --frozen-lockfile&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;save_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Save Yarn Package Cache&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn-packages-{{ checksum "yarn.lock" }}&lt;/span&gt;
          &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;~/.cache/yarn&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xvfb-run -a npm run lint&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xvfb-run -a npm run build --prod --progress=false&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This config will automatically lint your project, and run a production build. It assumes you want Node 12, and to use &lt;a href="https://yarnpkg.com/"&gt;yarn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why not run tests? You should probably run your tests too! I don't include them here because I have found that at least on day 1 of a new project, maintaining tests can often be a distraction from figuring out how your application should be architected, but every app should ALWAYS pass lint checks, and be buildable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add a design system
&lt;/h2&gt;

&lt;p&gt;The easiest way to start making your app look better is to add a design system like &lt;a href="https://material.io/"&gt;Material Design&lt;/a&gt;. The Angular team provides a set of components that embody Material Design in the library &lt;a href="https://material.angular.io"&gt;Angular Material&lt;/a&gt;. You can add it into your app via the CLI, and then create a navigation component for your app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng add @angular/material
ng generate @angular/material:nav app-nav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create an &lt;code&gt;app-nav&lt;/code&gt; component with many of the features you'll need to start your app in the right direction, from a responsive sidenav to a top toolbar.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Add offline support and PWA superpowers
&lt;/h2&gt;

&lt;p&gt;Offline support is a really desirable feature in web applications that can make your app much more capable than traditional web apps. Angular's Progressive Web App (PWA) support makes this much easier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng add @angular/pwa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this command will create a web app manifest (&lt;code&gt;manifest.webmanifest&lt;/code&gt;) which you should customize along with your &lt;code&gt;favicon.ico&lt;/code&gt; and icons files. It also creates an &lt;code&gt;ngsw-config.json&lt;/code&gt; which configures how your application should behave offline. Which files should be cached, when should they be cached (&lt;code&gt;lazy&lt;/code&gt; vs &lt;code&gt;prefetch&lt;/code&gt;)? Should you prefer the latest content (&lt;code&gt;freshness&lt;/code&gt;) or the fastest content (&lt;code&gt;performance&lt;/code&gt;) for a &lt;code&gt;strategy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Read all about the various &lt;a href="https://angular.io/guide/service-worker-config"&gt;options for the service worker config&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add Firebase Authentication
&lt;/h2&gt;

&lt;p&gt;Almost every application I've ever built needed to know something about my users, and to offer customizations and data for them over time. Often this leads us to build custom auth systems, or manually integrate with Google, Facebook, etc. &lt;a href="https://firebase.google.com"&gt;Firebase&lt;/a&gt; gives us a better way. A single integration with Firebase's auth system means we can get access to all of the social logins we need, and we never have to manage passwords, and eliminates much of the worry over the security of our users.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ng add @angular/fire&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You'll want to create a Firebase project on &lt;a href="https://console.firebase.google.com/"&gt;the console&lt;/a&gt; and add a Web App. It will give you a screen with a configuration that will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6UiBJJk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252F5-things-to-do-after-ng-new%252FScreenshot_20190818_064841.png%3Falt%3Dmedia%26token%3D6519c072-a0d4-41b4-8e63-d13708766b4a" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6UiBJJk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://firebasestorage.googleapis.com/v0/b/fluindotio-website-93127.appspot.com/o/posts%252F5-things-to-do-after-ng-new%252FScreenshot_20190818_064841.png%3Falt%3Dmedia%26token%3D6519c072-a0d4-41b4-8e63-d13708766b4a" alt="firebase configuration screenshot" width="800" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ignore the instructions and copy the JSON configuration object. You'll place this in your app module as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;imports: [
...
AngularFireModule.forRoot({.. THE COPIED OBJECT...}),
...
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there I typically create some sort of &lt;code&gt;auth.service.ts&lt;/code&gt; that wraps the Firebase authentication methods and provides helpful Observables I use throughout my app like "is the user currently logged in?"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
this.isUser = auth.authState.pipe(map(authState =&amp;gt; (authState ? authState.uid : null)));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Add a server &amp;amp; backend
&lt;/h2&gt;

&lt;p&gt;This one is newer, but very cool. When you get big enough, you might start reaching for more traditional database tools like Mongo/MySQL/PostgreSQL, and when you want to take full control of your backend, it's possible to do so in the same Angular project via a cool framework called NestJS.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ng add @nestjs/ng-universal&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This one command will update your Angular application with a &lt;code&gt;server&lt;/code&gt; folder where you can &lt;code&gt;nest generate&lt;/code&gt; new APIs or backend tools, and also adds in built-in server side rendering, which can improve the feeling of speed in your application.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>cli</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Single Component Angular Apps</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Thu, 04 Jul 2019 02:44:29 +0000</pubDate>
      <link>https://dev.to/stephenfluin/single-component-angular-apps-gjd</link>
      <guid>https://dev.to/stephenfluin/single-component-angular-apps-gjd</guid>
      <description>&lt;p&gt;The Angular documentation outlines best practices and patterns that most developers will need when creating large scalable applications. &lt;/p&gt;

&lt;p&gt;But what if there were a whole class of apps that didn't need this power and flexibility? I call these &lt;strong&gt;Single Component Apps&lt;/strong&gt;, and I build them every day.&lt;/p&gt;

&lt;p&gt;Here's two examples that I built or worked on recently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://update.angular.io/"&gt;update.angular.io&lt;/a&gt; - the interactive Angular update guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://baby.fluin.io/"&gt;baby.fluin.io&lt;/a&gt; - an app I built for tracking my infant son&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm also working on several others (like my Hex grid game) that will ship eventually.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they work
&lt;/h2&gt;

&lt;p&gt;Generally I have a &lt;a href="https://github.com/StephenFluin/angular-update-guide/blob/master/src/app/app.component.html"&gt;single template&lt;/a&gt; with a lot of containers and divs that look like this: &lt;code&gt;&amp;lt;ng-container *ngIf="data | async as result"&amp;gt;&lt;/code&gt;. With &lt;code&gt;ng-template&lt;/code&gt;, &lt;code&gt;ng-container&lt;/code&gt;, and a liberal use of &lt;code&gt;*ngIf&lt;/code&gt; and &lt;code&gt;*ngFor&lt;/code&gt;, you can probably build most single screen applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignoring parts of Angular
&lt;/h2&gt;

&lt;p&gt;Each of these applications uses a single component, meaning it's ignoring &lt;a href="https://angular.io/api/core/Input"&gt;huge&lt;/a&gt; &lt;a href="https://angular.io/guide/router"&gt;swaths&lt;/a&gt; of the Angular API.&lt;/p&gt;

&lt;p&gt;I can use any of the features I want, but I don't feel compelled to use them until they make sense. This helps me avoid over engineering. I can naturally create services, pipes, queries only when I feel the need, creating an application that I can iterate quickly on in the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better than Vanilla JS
&lt;/h2&gt;

&lt;p&gt;These apps aren't sophisticated, and I could have built them with Vanilla JS, but then I would be writing a custom DOM manipulation / rendering methods, when the look and feel of a declarative template really meets my needs and make sense to me.&lt;/p&gt;

&lt;p&gt;Angular is valuable in these apps due to the template syntax, change detection, pipes.  It's also valuable simply due to the awesome build system that you get out of the box with the &lt;a href="https://angular.io/cli"&gt;Angular CLI&lt;/a&gt;. TypeScript, minification/uglification, great live reload, and more all come by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  But why not use multiple components?
&lt;/h2&gt;

&lt;p&gt;If you need multiple components, go for it! As each of these applications grow, I expect I will eventually want to extract out some of my rendering logic and in the long run, components are fantastic for isolating parts of your application and making your code more reusable, and easier to reason able.&lt;/p&gt;

&lt;p&gt;I generally like to start with a single component until its template violates &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY principles&lt;/a&gt;, or until it starts being a couple hundred lines of code.&lt;/p&gt;

&lt;p&gt;If I ever want routing in these apps, I'll also go for components, as the Angular Router is wired for this functionality out of the box. Additionally, file level separation between routes is very logical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feel free to disagree
&lt;/h2&gt;

&lt;p&gt;Don't like single component apps? That's okay! Most of these apps have a single developer, meaning they face very different challenges than any true enterprise or scaled app. But I think that we need to acknowledge that a lot of the apps we all write look like this, or at least start like this. By acknowledging they exist and look like this for a valid reason, maybe we create space where writing this type of app is OK.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The Differences Between function and Arrow Functions</title>
      <dc:creator>Stephen Fluin</dc:creator>
      <pubDate>Wed, 19 Jun 2019 16:32:19 +0000</pubDate>
      <link>https://dev.to/stephenfluin/the-differences-between-function-and-arrow-functions-4663</link>
      <guid>https://dev.to/stephenfluin/the-differences-between-function-and-arrow-functions-4663</guid>
      <description>&lt;p&gt;I was asked the difference between a classical &lt;code&gt;function&lt;/code&gt; and the new modern &lt;code&gt;arrow function&lt;/code&gt; syntax, but it's a little bit hard to explain without examples, so here's the two major differences.&lt;/p&gt;

&lt;p&gt;Let's imagine we have a class called &lt;code&gt;Data&lt;/code&gt;, and let's imperatively create two functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;saveFunction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Classic Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrow Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&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;These two look identical, but let's dig into the two major differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Syntax Differences
&lt;/h2&gt;

&lt;p&gt;So first of all,  modern one is shorter, hurray! There's even a bunch of shorthand you can use, such as dropping the parentheses when you have only one parameter, and dropping the curly brackets when you want to return the results of a single expression.&lt;/p&gt;

&lt;p&gt;These syntax differences become EXTREMELY useful when you start passing functions around, which happens a lot when we write asynchronous code using Promises, Observables, or even when we need to write callbacks.&lt;/p&gt;

&lt;p&gt;Consider the following two implementations. Both are trying to take a list and return the odd numbers.&lt;/p&gt;

&lt;p&gt;Classic function style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&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;Arrow function style&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lack of parentheses and the automatic return of the value of the expression really help cut down the length here.&lt;/p&gt;

&lt;p&gt;The brevity increases the clarity of what's going on, once you know how arrow functions work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic Differences
&lt;/h2&gt;

&lt;p&gt;There's one more important difference, which is that arrow functions and classical functions actually work slightly different. Classic functions create an "object" and a scope with its own definition of &lt;code&gt;this&lt;/code&gt;, whereas &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this"&gt;arrow functions don't&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This becomes important in our original example, where we were creating functions inside of our Data class. Within classic functions, &lt;code&gt;this&lt;/code&gt; probably don't refer to the instance you were probably expecting, but arrow functions do.&lt;/p&gt;

&lt;p&gt;We can see this by popping the following code is an ES5 transpiler and looking at the classic JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;saveFunction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;currentValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Classic Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrow Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the transpiler on the &lt;a href="https://www.typescriptlang.org/play/"&gt;TypeScript Playground&lt;/a&gt; we get the following ES5:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/** @class */&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// Classic Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrow Function&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saveFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// save my data&lt;/span&gt;
            &lt;span class="nx"&gt;_this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentValue&lt;/span&gt; &lt;span class="o"&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Data&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;Because the modern version is using a specifically mapped &lt;code&gt;_this&lt;/code&gt; that it creates, the call to &lt;code&gt;this.currentValue&lt;/code&gt; does exactly what we expect, updating the property of the instance. In the classic function , it creates a new property on the function, which is quickly thrown away.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>angular</category>
      <category>functional</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
