lodash
から生成されたバンドルからの未使用のmultiply
関数と同様にwebpack
をツリーシェイクしたい
2つのメインファイルapp.js
&math.js
があります
次のコードが含まれています-
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;
私のnpm
スクリプトは次のようになります-
"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"
}
完全なコードは https://github.com/deadcoder0904/webpack-treeshake で入手できます。
UglifyJSPluginを使用してみましたが、生成されたバンドルには、math.js
からの未使用のmultiply
関数が表示されます。また、npm run prod
から生成されたproduction
バンドルは20kB
のままです。これはたくさんあり、lodash
のものもたくさん含まれています。
私は答えを見つけました
ツリーシェイクでlodash
を使用するには、最初にlodash-es
をインストールしてから、lodash
依存関係を削除する必要があります
また、最初にトランスパイルしないでください。そのため、.babelrc
ファイルを次のように作成します-
{
"presets": [
[
"env",
{
"modules": false
}
]
]
}
modules
をfalse
に設定すると、トランスパイルされないことに注意してください
そして今、バンドルは16.2kB&5.79kB gzipに減少します
./math.js
のlodash
関数が追加されていないことを除いて、lodash
自体を実行する必要があるため、multiply
モジュールの一部のコードは引き続き使用されます。結果のバンドル
私もそれが機能するために lodash-webpack-plugin が必要でした
ツリーシェイクは機能しますか????
私は述べられた問題を解決するいくつかの基本的なリポジトリを作成しました-
@ deadcoder0904の回答に基づいて、webpack4のbabel-loader
で同じことを行う方法を次に示します(.babelrcを使用する代わりに)。
...
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
plugins: ['lodash'],
presets: [['env', { modules: false }]]
}
}
},
注:「lodash-es」から明示的にインポートしないと、これを機能させることができませんでした(tsconfigでlodash-esをlodashにポイントした場合でも(TypeScriptを使用しています)、誰かがこれを機能させることができれば特別なimport { map } from 'lodash-es';
を使用し、代わりにimport { map } from 'lodash';
を使用するには、その方法を知っておくと便利です。