Turborepo - node modules not being tree shaken even though not being used

Viewed 32

Trying to wrap my head around Turborepo so I might be doing something wrong here.
Here is my current turborepo setup (you can see the full code in this repo)

I have two components in my ui package:

Button - uses styled-components and framer-motion
Loader - uses neither..

Button.tsx

import * as React from "react";
import styled from "styled-components";
import { motion } from "framer-motion";

export const Button = () => {
  return (
    <ButtonContainer
      initial={{ opacity: 0, scale: 0.5 }}
      animate={{ opacity: 1, scale: 1 }}
      transition={{ duration: 0.5 }}
    >
      Boop
    </ButtonContainer>
  );
};

const ButtonContainer = styled(motion.button)``;

Loader.tsx

import * as React from "react";

export const Loader = () => {
  return <div>MyLoader</div>;
};

and this is the package.json for the ui library:

{
 "devDependencies": {
    "@types/react": "^17.0.37",
    "@types/react-dom": "^17.0.11",
    "@types/styled-components": "^5.1.25",
    "eslint": "^7.32.0",
    "eslint-config-custom": "workspace:*",
    "react": "^17.0.2",
    "styled-components": ">=5.3.3",
    "tsconfig": "workspace:*",
    "typescript": "^4.5.2"
  },
  "dependencies": {
    "framer-motion": "^2.9.4"
  }
}

My docs app only imports the Loader component (that uses no libraries).
and the web app only imports the Button component (that uses both styled and framer)

Is it correct to expect the docs app not to include these libraries in it's bundle? Should I define the dependencies in a different way? (Let's assume framer motion will only be used inside the ui library, so I wouldn't want it as a peer dependency)

When I build the apps, their bundle is exactly the same size (IE, their both getting both 3rd party libraries in the bundle?)

Build output:

docs:build: Page                                       Size     First Load JS
docs:build: ┌ ○ /                                      44.3 kB         115 kB
docs:build: └ ○ /404                                   192 B          71.3 kB
docs:build: + First Load JS shared by all              71.2 kB
docs:build:   ├ chunks/framework-18dbf282fc9f86dd.js   42 kB
docs:build:   ├ chunks/main-7adb95b49d154e8e.js        26.9 kB
docs:build:   ├ chunks/pages/_app-5e74c22d5551a606.js  1.37 kB
docs:build:   └ chunks/webpack-49b6f2937c9ce9f4.js     838 B
docs:build:
docs:build: ○  (Static)  automatically rendered as static HTML (uses no initial props)
docs:build:
web:build: Page                                       Size     First Load JS
web:build: ┌ ○ /                                      44.3 kB         115 kB
web:build: └ ○ /404                                   192 B          71.3 kB
web:build: + First Load JS shared by all              71.2 kB
web:build:   ├ chunks/framework-18dbf282fc9f86dd.js   42 kB
web:build:   ├ chunks/main-7adb95b49d154e8e.js        26.9 kB
web:build:   ├ chunks/pages/_app-5e74c22d5551a606.js  1.37 kB
web:build:   └ chunks/webpack-49b6f2937c9ce9f4.js     838 B

PS - I do see that tree shaking works for the components (IE - The Loader component doesn't appear in the web app's bundle, and the Button component doesn't appear in the docs app bundle). But the lib's don't seem to be tree shaking.

Thanks!

0 Answers
Related