<?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: Hoang Nguyen</title>
    <description>The latest articles on DEV Community by Hoang Nguyen (@zysd836).</description>
    <link>https://dev.to/zysd836</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%2F1007553%2Fc439e100-2e35-486a-8de9-5a53bf04af2e.webp</url>
      <title>DEV Community: Hoang Nguyen</title>
      <link>https://dev.to/zysd836</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zysd836"/>
    <language>en</language>
    <item>
      <title>Tree-Shaking Friendly Import/Export Patterns for Modern Frontend Projects</title>
      <dc:creator>Hoang Nguyen</dc:creator>
      <pubDate>Sat, 12 Jul 2025 10:12:47 +0000</pubDate>
      <link>https://dev.to/zysd836/tree-shaking-friendly-importexport-patterns-for-modern-frontend-projects-g68</link>
      <guid>https://dev.to/zysd836/tree-shaking-friendly-importexport-patterns-for-modern-frontend-projects-g68</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In modern frontend development, tree shaking is essential for keeping bundles lean. Yet many developers unknowingly break it with subtle mistakes in import and export usage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tree shaking is one of the most effective ways to reduce your JavaScript bundle size — but only if your code is written in a way that allows it.&lt;/p&gt;

&lt;p&gt;Unfortunately, a few common export and import patterns can silently prevent tree shaking from working at all.&lt;/p&gt;

&lt;p&gt;This guide covers the best practices to keep your code tree-shakable in modern frontend stacks (React, Vite, Webpack, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Named Exports Instead of default
&lt;/h2&gt;

&lt;p&gt;Named exports make it easier for bundlers to remove unused code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Not tree-shakable
export default {
  add,
  subtract,
};

// ✅ Tree-shakable
export const add = () =&amp;gt; {};
export const subtract = () =&amp;gt; {};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Tree shakers like Rollup and Webpack can’t shake off unused properties of a default-exported object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Avoid Exporting Object Literals
&lt;/h2&gt;

&lt;p&gt;Exporting a single object with all your functions may feel clean, but it bundles everything, even unused parts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Everything in utils is included
export const utils = {
  toDate,
  formatPrice,
};

// ✅ Only what’s used is bundled
export const toDate = () =&amp;gt; {};
export const formatPrice = () =&amp;gt; {};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don’t Export Destructured Variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const config = {
  API_URL: '...',
  TIMEOUT: 3000,
};

// ❌ Not tree-shakable
export const { API_URL, TIMEOUT } = config;

// ✅ Better
export const API_URL = '...';
export const TIMEOUT = 3000;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Destructuring hides the actual bindings from the bundler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Use Direct Re-exports
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// utils/index.js

// ✅ Good
export * from './math';
export * from './date';

// ✅ Even better (explicit)
export { add, subtract } from './math';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Avoid logic-based re-exports or dynamic code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Avoid Wildcard Imports
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Not tree-shakable
import * as utils from './utils';

// ✅ Tree-shakable
import { formatDate } from './utils';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wildcard imports bring in everything — even what you don’t use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mark sideEffects: false in package.json
&lt;/h2&gt;

&lt;p&gt;This lets the bundler safely remove unused files/modules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "sideEffects": false
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If some files (like CSS) do have side effects, specify them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "sideEffects": ["./styles/global.css"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid Dynamic Aggregation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ Cannot be tree-shaken
const all = {
  ...require('./module1'),
  ...require('./module2'),
};

export default all;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tree shaking only works with static imports/exports that bundlers can analyze at build time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Writing tree-shakable code is about making your modules predictable and explicit. It's not just about saving bytes — it's about better performance, better dev experience, and cleaner architecture.&lt;/p&gt;

&lt;p&gt;Your imports and exports are the first line of defense against bloat.&lt;/p&gt;

&lt;p&gt;If you're optimizing a large codebase and want to refactor for better tree shaking, start by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replacing default object exports&lt;/li&gt;
&lt;li&gt;Flattening utility files&lt;/li&gt;
&lt;li&gt;Removing wildcard imports&lt;/li&gt;
&lt;li&gt;Splitting large shared files into named modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💬 Have more tips? Share them in the comments.&lt;/p&gt;

&lt;p&gt;Follow me for more performance tips and frontend architecture insights.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#JavaScript&lt;/code&gt; &lt;code&gt;#Frontend&lt;/code&gt; &lt;code&gt;#TreeShaking&lt;/code&gt; &lt;code&gt;#ESModules&lt;/code&gt; &lt;code&gt;#React&lt;/code&gt; &lt;code&gt;#Vite&lt;/code&gt; &lt;code&gt;#Webpack&lt;/code&gt; &lt;code&gt;#TypeScript&lt;/code&gt; &lt;code&gt;#CleanCode&lt;/code&gt; &lt;code&gt;#WebPerformance&lt;/code&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>react</category>
      <category>webpack</category>
    </item>
  </channel>
</rss>
