Here is an example repository that shows an example of the issue reported in this thread: https://github.com/Eux86/tree-shaking-barrel-test/blob/master/README.md
I'm trying to understand what's the effect of using a Barrel file to export functions and classes from a library project when importing it into another project that use webpack and should be able to treeshake the bundle.
Imagine I have a project:
library
index.ts
libA.ts
libB.ts
index.ts has this code:
export { LibAMain } from 'LibA';
export { LibBMain } from 'LibB';
So I'm using index as a barrel file to export all the functions I'm going to develop in my library.
The second project will be:
library-user
Index.ts has this code:
import { LibAMain } from 'library'
LibAMain();
Now: library-user is builded using webpack, which I expect to be able to treeshake the unused libraries in MyLib, but when I look into the generated bundle I see that it contains boot LibA.js and LibB.js, which shouldn't be there:
If I change index.ts to:
import { LibAMain } from 'library/lib/LibA'
LibAMain();
then webpack does its job well and I only see LibA in the final bundle:
TL;DR: How can I keep using the barrel index file and just import everything from 'library' but still have the treeshaking working?
Thank you for any help :)
Tree shaking is a term commonly used within a JavaScript context to describe the removal of dead code. It relies on the import and export statements to detect if code modules are exported and imported for use between JavaScript files.
In Node. js, for example, you can conditionally run require with a variable to load a random script. Webpack can't possibly know all of your imports and exports at build time, so it will attempt to tree shake a handful of constructs and bail as soon as things get too dynamic.
Tree Shaking is a way to remove unused modules from the final bundle file of the application. Angluar CLI by default uses WebPack bundler for bundling the script files which supports Tree Shaking from WebPack2.
It looks like a module problem in your code, not webpack.
tsconfig.json
...
"module": "commonjs",
...
Commonjs modules system doesn't support tree shaking in webpack (only direct imports like you did it above works mylib/libA
).
To fix tree shaking in your github repo you should use module
: es2015
or esnext
in tsconfig.json
.
...
"module": "esnext",
...
But you are right - unfortunetely treeshaking is not webpack's best side.
There are several approaches how to shake your tree better:
webpack
to rollup
. Rollup has first-class tree shaking by default (I don't recommend to do it for large projects).If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With