Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Rich-Harris/agadoo
Check whether a package is tree-shakeable
https://github.com/Rich-Harris/agadoo
Last synced: 3 months ago
JSON representation
Check whether a package is tree-shakeable
- Host: GitHub
- URL: https://github.com/Rich-Harris/agadoo
- Owner: Rich-Harris
- License: mit
- Created: 2018-08-20T18:40:27.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-08-02T16:06:51.000Z (over 1 year ago)
- Last Synced: 2024-04-24T12:24:56.449Z (7 months ago)
- Language: JavaScript
- Size: 16.6 KB
- Stars: 528
- Watchers: 9
- Forks: 17
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# agadoo
*[Ag-a-doo-doo-doo, push pineapple, shake the tree](https://www.youtube.com/watch?v=POv-3yIPSWc)*
## What this does
Tells you whether the JavaScript library you're building is tree-shakeable.
## What it doesn't do
Tell you why tree-shaking fails, if it does. Maybe in a future version.
## Hold up — tree what now?
With the advent of JavaScript modules (`import` and `export`), it's possible to build libraries that are *tree-shakeable*. This means that a user of your library can import just the bits they need, without burdening their users with all the code you're *not* using.
For example, the [eases-jsnext](https://github.com/Rich-Harris/eases-jsnext) library contains a grab-bag of [Robert Penner's easing equations](http://robertpenner.com/easing/), presented as a JavaScript module. I can use it like this in my code...
```js
import * as eases from 'eases-jsnext';for (let t = 0; t <= 1; t += 0.05) {
const eased = eases.cubicInOut(t)
const str = repeat('*', eased * 20);
console.log(str);
}function repeat(str, num) {
let result = '';
num = Math.round(num);
while (num--) result += str;
return result;
}
```...and all the easing functions that I *haven't* used will get removed during bundling, if I'm using a modern bundler such as Rollup, webpack or Parcel. Here's what that bundle would look like with Rollup:
```js
'use strict';function cubicInOut(t) {
return t < 0.5
? 4.0 * t * t * t
: 0.5 * Math.pow(2.0 * t - 2.0, 3.0) + 1.0
}for (let t = 0; t <= 1; t += 0.05) {
const eased = cubicInOut(t);
const str = repeat('*', eased * 20);
console.log(str);
}function repeat(str, num) {
let result = '';
num = Math.round(num);
while (num--) result += str;
return result;
}
```...and here's the result of running it:
```
*
*
**
***
*****
*******
**********
*************
***************
*****************
******************
*******************
*******************
********************
********************
********************
```But I digress. The point is that this works because eases-jsnext is a tree-shakeable library.
## Using agadoo
Inside your project folder, run Agadoo like so:
```bash
npx agadoo
```You can install it as a development dependency and run it each time you `npm publish` — if tree-shaking fails, publishing will be aborted:
```bash
npm install -D agadoo
``````js
// package.json
{
"scripts": {
"prepublishOnly": "agadoo"
}
}
```You can specify the module if necessary:
```bash
agadoo dist/my-library.js
```## Help! My library isn't tree-shakeable and I'm not sure why
Firstly, make sure you're exposing a JavaScript module using the "module" field of your package.json (aka [pkg.module](https://github.com/rollup/rollup/wiki/pkg.module)).
If tree-shaking still fails, it's because Rollup thinks that there are side-effects somewhere in your code. Follow these guidelines:
* Avoid transpilers like Babel and Bublé (and if you're using TypeScript, target a modern version of JavaScript)
* Export plain functions
* Don't create instances of things on initial evaluation — instantiate lazily, when the functions you export are called## License
[LIL](LICENSE).