<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Frontend on David Lang</title>
    <link>https://www.davidlang.tech/tags/frontend/</link>
    <description>Recent content in Frontend on David Lang</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 08 Feb 2022 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.davidlang.tech/tags/frontend/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Vite vs Webpack: Why Developers Are Switching</title>
      <link>https://www.davidlang.tech/posts/vite-vs-webpack-why-developers-are-switching/</link>
      <pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://www.davidlang.tech/posts/vite-vs-webpack-why-developers-are-switching/</guid>
      <description>&lt;p&gt;Vite uses native ES modules in development for near-instant cold starts. Webpack remains ubiquitous in enterprise codebases-but Vite won the greenfield race by 2022.&lt;/p&gt;&#xA;&lt;h2 id=&#34;development-experience&#34;&gt;Development Experience&lt;/h2&gt;&#xA;&lt;p&gt;Vite serves source files directly; the browser requests modules on demand. Webpack bundles the entire graph before serving-slower as projects grow.&lt;/p&gt;&#xA;&lt;h2 id=&#34;production-builds&#34;&gt;Production Builds&lt;/h2&gt;&#xA;&lt;p&gt;Vite uses Rollup for optimized production bundles. Tree-shaking, code splitting, and asset handling are comparable to Webpack 5.&lt;/p&gt;&#xA;&lt;h2 id=&#34;migration-tips&#34;&gt;Migration Tips&lt;/h2&gt;&#xA;&lt;p&gt;Replace &lt;code&gt;webpack.config.js&lt;/code&gt; with &lt;code&gt;vite.config.ts&lt;/code&gt;. Use &lt;code&gt;import.meta.env&lt;/code&gt; instead of &lt;code&gt;process.env&lt;/code&gt; for env variables. Check plugins-most popular React libraries ship Vite templates.&lt;/p&gt;</description>
    </item>
    <item>
      <title>React 18: Concurrent Features and the New Root API</title>
      <link>https://www.davidlang.tech/posts/react-18-concurrent-features-and-the-new-root-api/</link>
      <pubDate>Sat, 15 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://www.davidlang.tech/posts/react-18-concurrent-features-and-the-new-root-api/</guid>
      <description>&lt;p&gt;React 18 introduced concurrent rendering, automatic batching, and a new root API. These changes improve perceived performance without rewriting your entire app.&lt;/p&gt;&#xA;&lt;h2 id=&#34;createroot&#34;&gt;createRoot&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;import&lt;/span&gt; { createRoot } from &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;react-dom/client&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;import&lt;/span&gt; App from &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;./App&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; root &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; createRoot(&lt;span style=&#34;color:#b58900&#34;&gt;document&lt;/span&gt;.getElementById(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;root&amp;#39;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.render(&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;App&lt;/span&gt; /&amp;gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The legacy &lt;code&gt;ReactDOM.render&lt;/code&gt; is deprecated. &lt;code&gt;createRoot&lt;/code&gt; enables concurrent features.&lt;/p&gt;&#xA;&lt;h2 id=&#34;suspense-and-transitions&#34;&gt;Suspense and Transitions&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;useTransition&lt;/code&gt; marks updates as non-urgent-keeping the UI responsive during heavy re-renders:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; [isPending, startTransition] &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; useTransition();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; handleTab(tab) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  startTransition(() =&amp;gt; setActiveTab(tab));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;strict-mode-changes&#34;&gt;Strict Mode Changes&lt;/h2&gt;&#xA;&lt;p&gt;Strict Mode double-invokes effects in development to surface side-effect bugs. Audit &lt;code&gt;useEffect&lt;/code&gt; cleanup functions before upgrading.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tailwind CSS: Rapid UI Development</title>
      <link>https://www.davidlang.tech/posts/tailwind-css-rapid-ui-development/</link>
      <pubDate>Fri, 05 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://www.davidlang.tech/posts/tailwind-css-rapid-ui-development/</guid>
      <description>&lt;p&gt;Tailwind CSS is a utility-first framework-you compose designs from small classes in markup instead of writing custom CSS files for every component.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-teams-adopt-tailwind&#34;&gt;Why Teams Adopt Tailwind&lt;/h2&gt;&#xA;&lt;p&gt;Development speed increases when you do not context-switch between JSX and separate stylesheets. Design tokens (spacing, colors, typography) stay consistent through configuration. PurgeCSS removes unused classes in production builds.&lt;/p&gt;&#xA;&lt;h2 id=&#34;example-component&#34;&gt;Example Component&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;function&lt;/span&gt; Card({ title, children }) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;return&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; className&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;rounded-lg border border-gray-200 bg-white p-6 shadow-sm hover:shadow-md transition-shadow&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;h2&lt;/span&gt; className&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;text-lg font-semibold text-gray-900&amp;#34;&lt;/span&gt;&amp;gt;{title}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;h2&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; className&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;mt-2 text-gray-600&amp;#34;&lt;/span&gt;&amp;gt;{children}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;customizing-the-theme&#34;&gt;Customizing the Theme&lt;/h2&gt;&#xA;&lt;p&gt;Extend &lt;code&gt;tailwind.config.js&lt;/code&gt; with brand colors and fonts. Use &lt;code&gt;@apply&lt;/code&gt; sparingly in CSS modules for repeated patterns.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Modern JavaScript ES2020: Top Features You Should Know</title>
      <link>https://www.davidlang.tech/posts/modern-javascript-es2020-top-features-you-should-know/</link>
      <pubDate>Sat, 28 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.davidlang.tech/posts/modern-javascript-es2020-top-features-you-should-know/</guid>
      <description>&lt;p&gt;ECMAScript 2020 added practical features that reduce boilerplate and improve null-safety. If you are still avoiding optional chaining, now is the time to adopt it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;optional-chaining-and-nullish-coalescing&#34;&gt;Optional Chaining and Nullish Coalescing&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;const&lt;/span&gt; city &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; user&lt;span style=&#34;color:#719e07&#34;&gt;?&lt;/span&gt;.address&lt;span style=&#34;color:#719e07&#34;&gt;?&lt;/span&gt;.city &lt;span style=&#34;color:#719e07&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;Unknown&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;?.&lt;/code&gt; short-circuits on &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;. &lt;code&gt;??&lt;/code&gt; returns the right side only when the left is &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;-unlike &lt;code&gt;||&lt;/code&gt;, it preserves &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;&#39;&#39;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;bigint-and-globalthis&#34;&gt;BigInt and globalThis&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;BigInt&lt;/code&gt; handles integers beyond &lt;code&gt;Number.MAX_SAFE_INTEGER&lt;/code&gt;. &lt;code&gt;globalThis&lt;/code&gt; provides a standard way to access the global object in browsers and Node.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CSS Grid Layout: Building Responsive Designs</title>
      <link>https://www.davidlang.tech/posts/css-grid-layout-building-responsive-designs/</link>
      <pubDate>Sun, 14 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://www.davidlang.tech/posts/css-grid-layout-building-responsive-designs/</guid>
      <description>&lt;p&gt;CSS Grid is a two-dimensional layout system-rows and columns together-making it ideal for page layouts, dashboards, and card grids that Flexbox alone struggles with.&lt;/p&gt;&#xA;&lt;h2 id=&#34;defining-a-grid&#34;&gt;Defining a Grid&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#268bd2&#34;&gt;page&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;display&lt;/span&gt;: &lt;span style=&#34;color:#719e07&#34;&gt;grid&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;grid-template-columns&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;240&lt;/span&gt;&lt;span style=&#34;color:#dc322f&#34;&gt;px&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;fr;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;grid-template-rows&lt;/span&gt;: &lt;span style=&#34;color:#cb4b16&#34;&gt;auto&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;fr &lt;span style=&#34;color:#cb4b16&#34;&gt;auto&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;min-height&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#dc322f&#34;&gt;vh&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;gap&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#dc322f&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#268bd2&#34;&gt;sidebar&lt;/span&gt; { &lt;span style=&#34;color:#719e07&#34;&gt;grid-column&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#719e07&#34;&gt;grid-row&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;    { &lt;span style=&#34;color:#719e07&#34;&gt;grid-column&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;; &lt;span style=&#34;color:#719e07&#34;&gt;grid-row&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;responsive-patterns&#34;&gt;Responsive Patterns&lt;/h2&gt;&#xA;&lt;p&gt;Use &lt;code&gt;repeat(auto-fit, minmax(280px, 1fr))&lt;/code&gt; for card layouts that reflow without media queries. Named grid areas improve readability:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#268bd2&#34;&gt;layout&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;display&lt;/span&gt;: &lt;span style=&#34;color:#719e07&#34;&gt;grid&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;grid-template-areas&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;header header&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;nav    main&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;footer footer&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;grid-vs-flexbox&#34;&gt;Grid vs Flexbox&lt;/h2&gt;&#xA;&lt;p&gt;Use Grid for page-level structure; use Flexbox for aligning items inside a component (nav links, button groups). They complement each other.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
