【问题标题】:Lodash not TreeShaking with Webpack with Webpack 4?Lodash 不使用 Webpack 和 Webpack 4 进行 TreeShaking?
【发布时间】:2018-07-26 18:26:38
【问题描述】:

我想从webpack 生成的包中摇树lodash 以及我未使用的multiply 函数

我有 2 个主要文件 app.jsmath.js

它包含以下代码-

app.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);
});

math.js

export const sum = (a, b) => a + b;
export const multiply = (m, n) => m * n;

webpack.config.js

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 的东西也包括在内。

【问题讨论】:

    标签: javascript webpack webpack-2 uglifyjs uglifyjs2


    【解决方案1】:

    以@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'; 知道如何工作会很棒!

    【讨论】:

      【解决方案2】:

      我找到了答案

      要将lodash 与tree shaking 一起使用,我们应该首先安装lodash-es,然后删除lodash 依赖项

      另外,它不应该先被转译,所以我们将我们的.babelrc文件如下 -

      {
        "presets": [
          [
            "env",
            {
              "modules": false
            }
          ]
        ]
      }
      

      注意,将 modules 设置为 false 使其无法转译

      现在捆绑包减少到 16.2kB5.79kB gzip

      lodash 模块中的一些代码仍将被使用,因为它需要运行 lodash 本身,除了 ./math.js 中的 multiply 函数未添加到生成的包中

      我还需要lodash-webpack-plugin 才能正常工作

      摇树工作?

      我已经做了一些基本的 repos 来解决上述问题 -

      https://github.com/deadcoder0904/webpack-exam

      https://github.com/deadcoder0904/webpack-treeshake

      【讨论】:

      • 在我尝试使用服务器端渲染开始表达后,我得到了Unexpected token import
      • @Tomasz 因为你需要使用类似babel 的东西将它转换成require,否则使用require
      • 我发现了一篇关于如何通过 babel 或 typescript 配置它的有趣文章:medium.com/@martin_hotell/…
      猜你喜欢
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 2019-12-29
      • 2018-08-30
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多