Je veux utiliser l’arbre shake lodash
ainsi que ma fonction multiply
inutilisée à partir du paquet généré à partir de webpack
J'ai 2 fichiers principaux app.js
& math.js
Il contient le code suivant -
import map from "lodash/map";
import { sum } from "./math";
console.log("????");
console.log(`2 + 3 = ${sum(2, 3)}`);
map([1, 2, 3], x => {
console.log(x);
});
export const sum = (a, b) => a + b;
export const multiply = (m, n) => m * n;
const path = require("path");
const webpack = require("webpack");
const UglifyJSPlugin = require("uglifyjs-webpack-plugin");
const Jarvis = require("webpack-jarvis");
let plugins = [new Jarvis()];
if (process.env.NODE_ENV === "production") plugins.Push(new UglifyJSPlugin());
const config = {
entry: "./app.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js"
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: "babel-loader"
}
]
},
plugins
};
module.exports = config;
Mon script npm
ressemble à -
"scripts": {
"dev": "webpack --optimize-minimize --mode development",
"dev:watch": "webpack --watch --optimize-minimize --mode development",
"prod": "webpack -p --optimize-minimize --mode production",
"prod:watch": "webpack -p --watch --optimize-minimize --mode production",
"start": "npm run prod",
"clean": "rm -rf dist"
}
Le code complet est disponible sur https://github.com/deadcoder0904/webpack-treeshake
J'ai essayé d'utiliser UglifyJSPlugin, mais dans le paquet généré, ma fonction multiply
inutilisée de math.js
est toujours affichée. De plus, le paquet production
généré à partir de npm run prod
reste 20kB
, ce qui est beaucoup et je vois beaucoup de choses lodash
incluses également.
J'ai trouvé la réponse
Pour utiliser lodash
en secouant l’arbre, nous devons d’abord installer lodash-es
& supprimer ensuite la dépendance lodash
De plus, il ne devrait pas être transpilé en premier, alors nous créons notre fichier .babelrc
comme suit -
{
"presets": [
[
"env",
{
"modules": false
}
]
]
}
Notez que le réglage de modules
sur false
ne le transpile pas
Et maintenant, le paquet se réduit à 16.2kB & 5.79kB gzip
Certains codes du module lodash
seront toujours utilisés car il est nécessaire d'exécuter lodash
lui-même, à l'exception de la fonction multiply
de ./math.js
qui n'a pas été ajoutée au paquet résultant.
J'avais aussi besoin de lodash-webpack-plugin pour que cela fonctionne
Treeshaking fonctionne ????
J'ai fait quelques pensions de base pour résoudre le problème énoncé -
En vous basant sur la réponse de @ deadcoder0904, voici comment procéder de la même manière avec babel-loader
dans le Webpack 4 (au lieu d'utiliser .babelrc):
...
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
plugins: ['lodash'],
presets: [['env', { modules: false }]]
}
}
},
Remarque: je n’ai pas réussi à faire fonctionner ceci sans importer explicitement de 'lodash-es' (même si j’ai pointé lodash-es vers lodash dans mon tsconfig (j’utilise TypeScript). Si quelqu'un peut le faire sans avoir utiliser le import { map } from 'lodash-es';
spécial et au lieu de import { map } from 'lodash';
il serait bon de savoir comment!