Tree shaking with Webpack 2

Tree shaking is an important concept which is gaining a lot of coverage in the past few months.Webpack2 was recently released and tree shaking is one of the most exciting and highly anticipated features of this release.

This article will give you a basic understanding of the concepts with the help of an example.

What is Tree shaking?

Tree shaking basically removes unused code from your code thus providing a highly optimized bundle.It essentially reduces the size of the payload which could be a performance boost as well as makes it easier to maintain.

It supports native ES6 modules without converting them to CommonJS format.This is a big plus as tree shaking is not possible with Common JS modules.

What is the process like ?

The process is divided in to 2 steps

  1. Single bundle file :Webpack2 first creates a single bundle file of all the ES6 modules in your code and if a export is not imported anywhere it is removed.
  2. Minification: Next the bundle is minified and all the dead code is removed.As a result of the first step, dead code elimination can remove the unused exports.


Webpack2 can parse and understand all of ES6 and only tree-shakes if it detects an ES6 module. However, only imports and exports are transpiled to ES5. If you want all of the bundle to be in ES5, you need a transpiler for the remaining parts of ES6.

First step is to install webpack2

npm install --save webpack@2.0.1-beta

Next install es2015-native-modules Babel preset for the transpiling part

npm install --save es2015-native-module

Add the plugin to .babelrc file

presets: ["es2015-native-modules"]

Add the optmize-minimize flag to the build script for the 2 step process we talked about before

"scripts" : {
"build" : "webpack-optimize-minimize"

Lets write a greetings library which has different types of greetings.

export function sayHello(){
return "Hello there";
export function sayHi() {
return 'Hi there';

lets import this in our index.js.We will only import sayHi() for our project.

import { sayHi } from './greetings.js';
 let elem = document.getElementById('greeting');

elem.innerHTML = '${(sayHi())};

Next lets build the code.

npm run build

Below is the bundle after we build the code.

function (t, n, r) {
function e() {
return "Hi there"

n.sayHi = e

Success !! The function sayHello() is not a part of the bundle as we did not import it and it was removed as part of dead code elimination.

I see tree shaking to be of a lot of value when we import huge libraries like lodash,jquery and end up using only a few functions and bloat up our bundle for no reason.

I am excited to see how this concept evolves and becomes a part of the central ecosystem with Webpack being a popular choice amongst a lot of developers.


  1. Webpack2 :
  2. Babel :