我想从lodash
multiply
以及我未使用的webpack
函数
我有两个主要文件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,但在生成的包中,它仍会显示multiply
中未使用的math.js
函数。此外,production
生成的npm run prod
捆绑包仍然是20kB
,这是很多&我也看到了很多lodash
内容。
答案 0 :(得分:10)
我找到了答案
要使用lodash
树摇晃,我们应先安装lodash-es
&然后删除lodash
依赖项
此外,它不应该首先进行转换,因此我们将.babelrc
文件设置如下 -
{
"presets": [
[
"env",
{
"modules": false
}
]
]
}
请注意,将modules
设置为false
会使其无法转换
现在捆绑减少到 16.2kB & 5.79kB gzip
lodash
模块中的某些代码仍会被使用,因为除lodash
以外的multiply
函数之外,还需要运行./math.js
本身在结果包中
我还需要lodash-webpack-plugin才能正常工作
Treeshaking工作
我做了一些解决所述问题的基本回购 -
答案 1 :(得分:0)
以@ deadcoder0904的答案为基础,以下是在webpack 4中使用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(我正在使用打字稿)。无需使用特殊的import { map } from 'lodash-es';
即可工作,而可以使用import { map } from 'lodash';
来工作,那么知道如何做将是很棒的!