webpack chunk 中包含多个 entry 的方案

当我们构建前端应用时,打包工具 webpack 是不可或缺的。webpack 不仅可以将多个文件打包成一个文件,而且还可以支持按需加载(code splitting)和按照模块的依赖关系异步加载模块(chunk)。

在 webpack 中,每个 entry(入口)都会生成一个 chunk。通常情况下,一个 entry 对应一个 chunk,但是在某些场景下,我们希望将多个 entry 合并成一个 chunk,这时候就需要使用 webpack 提供的多 entry 功能。

多 entry

webpack 支持同时配置多个 entry,例如:

-------------- - -
  ------ -
    ---- ---------------
    ------- ---------- ---------
  --
  -- ---
-

上面的配置表示,我们有两个 entry:appvendor。其中 app 是一个普通的 entry,而 vendor 是一个数组形式的 entry,我们称之为库(library entry)。vendor entry 会被处理成一个单独的 chunk。

在打包完成后,我们可以通过打印 stats 查看生成的 chunk:

可以看到,有两个 named chunk,app chunk 包含 app.jslodash,而 vendor chunk 只包含了 jquery

动态 library

上面的示例中,我们在配置文件中手动将库的依赖关系写死了。然而,在实际开发中,库的依赖关系是随时发生变化的,我们需要一种动态的方式来处理这种变化。

为了解决这个问题,我们可以使用 dependency-cruiser 这样的工具来分析项目中的依赖关系。例如,在我们的项目中,我们使用了 jquerylodash 两个库,而 lodash 又依赖了 jquery

--- ------------
 -- --------------
   --- ------------

基于这个信息,我们可以编写一个简单的脚本来生成 library entry:

----- -- - -------------
----- ---- - ---------------
----- - ----- - - -----------------------------

----- ------ - -------------------- ------
----- --------- - ----------------- ---------

----- ---- - ------------- -
  -------- -----------------
  ----------- -------
  --------------------- -----
--

----- ---- - --
--- ------ --- -- ------------------ -
  -- ------------------------------------ -
    ----- ---- - ------------------------ ------------------------------ ---
    ---------- - ------------
  -
-

-----------------
  -------------------- -------------------
  --------------- - ---------------------- ----- ------
-

这个脚本会遍历项目中的依赖关系,只保留子目录为 vendor 的依赖,并将它们组装成一个对象。例如,当我们运行这个脚本后,会生成以下的配置:

-------------- - -
  --------- -
    --------
  --
  -------------- -
    -------------
  --
  --------- -
    --------
  --
  ------------ -
    -----------
  -
-

我们可以在 webpack 配置文件中引入这个配置,这样每次打包时就会自动生成对应的 library entry 了:

----- ---- - -------------------------

-------------- - -
  ------ -
    ---- ---------------
    -------
  --
  -- ---
-

总结

使用 webpack 处理具有多个 entry 的应用程序,能够更灵活地处理应用程序的代码分割和顺序加载。在前端开发中,动态分离代码是必不可少的功能,而 webpack 的多 entry 功能正好可以满足这一需求。通过本文的介绍,读者不仅能够了解到如何使用 webpack 的多 entry,还能掌握如何使用工具自动处理多 entry 的依赖关系,更好的解耦代码。

完整示例代码:https://github.com/ruanyf/webpack-multi-entry

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6645abc7d3423812e43b013f