怎样合理地配置 Webpack,提升应用速度?

阅读时长 8 分钟读完

前端应用开发中,Webpack已经成为了必不可少的工具。它可以将众多各式各样的代码打包成一个或多个文件,以提供能够在浏览器中执行的最小化代码版本。然而,Webpack的配置可能会变得非常混乱,会对构建时间产生严重的不良影响。因此,理性配置Webpack可以大大提升前端应用的速度。

步骤1:优化代码拆分

前段应用通常包含许多小的 JavaScript 文件和库,Webpack默认情况下将所有的代码放在一个输出文件中,带来了很多不必要的性能问题。我们应该通过代码拆分策略,将大的代码块分解成小的不同文件。

Webpack 4已经默认支持了代码拆分,但是我们可以进一步进行代码拆分优化。

可以使用Webpack 提供的以下配置和插件,以实现代码拆分优化。

1)optimization.splitChunks:可以配置使用code splitting的块的最小大小,并且可以定义哪个块需要被拆分。

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

解释:

  • minSize:拆分前最小文件大小
  • maxSize:拆分后最大文件大小
  • minChunks:拆分前被引入的最少次数
  • maxAsyncRequests:最多异步拆分请求数
  • maxInitialRequests:最多同时加载的入口文件数
  • name:割出块文件的名称,可以使用占位符
  • cacheGroups:分割块的缓存组

2)SplitChunksPlugin:将具有许多公共依赖的代码块提取成新的块。

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

解释:

  • chunks:用于选择哪些块进行优化,可选的值有 initial(初始块)、async(按需加载块)和 all(全部块)
  • minSize:块的最小大小
  • minChunks:被拆分的块最小被使用的次数,如果某个块的被其他块引用的次数少于这个数字,那么该块不会被提取到公共代码块中。
  • maxAsyncRequests:最多是同步加载的块数
  • maxInitialRequests:最多初始化加载的库数
  • name:提供函数返回块的名字作为参数
  • cacheGroups :扩展splitChunks的配置,达到分离多视图,多页面的目的。

步骤2:优化Webpack Dev Server

Webpack Dev Server是一款服务于Webpack的静态服务器,主要是为浏览器提供开发服务器。

对其进行优化可以达到减少访问时间、加速打包时间,达到更快的速度。

可以使用Webpack Dev Server的以下配置和插件,以实现优化。

1)disableHostCheck:允许web应用程序从一个URL访问另一个URL,因为在生产模式下是不被允许的。

2)contentBase:提供给服务器的服务内容,可以是一个或多个文件夹(如静态文件)。

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

解释:

  • contentBase:提供给服务器的服务内容,可以是一个或多个文件夹。
  • hot:启动热替换功能。
  • compress:优化webpack打包文件时的压缩策略。
  • clientLogLevel:始终将日志记录器的级别设为silent,减少console日志的数量。
  • watchOptions:监听文件变化的内容,用于优化编译时间。
  • quiet:打包时只在命令行打印错误和警告,不输出其他内容。

步骤3:使用MiniCssExtractPlugin插件

在Webpack 5之前,常用的替换ExtractTextPlugin的插件为MiniCssExtractPlugin,可以在打包过程中将项目中的CSS文件提取出来,减少了文件体积的同时,还可以使得文件更加可读可维护。

可以使用MiniCssExtractPlugin插件,以实现优化。

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

解释:

  • test:正则表达式,匹配需要使用加载器的文件
  • exclude:排除不需要匹配的文件夹或文件
  • loader:加载器,用于处理文件
  • use:使用的加载器列表,从后往前执行
  • css-loader:CSS加载器
  • MiniCssExtractPlugin.loader:CSS提取插件

步骤4:使用DllPlugin和DllReferencePlugin

DllPlugin和DllReferencePlugin是Webpack中的两个插件,职责实现了构建缓存和提高编译速度。用来对公共库或者框架进行编译打包,提前编译打包后的文件可以通过缓存来提高构建速度,减小每次构建时的压力,对于使用率较高的第三方库,可以生成单独的编译构建,只需要编译一次即可。

可以使用DllPlugin和DllReferencePlugin插件,以实现优化。

1)在选项中配置DllPlugin插件。

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

解释:

  • path:指定manifest文件的输出位置及名称
  • name:设置dll的全局变量名

2)在entry文件中配置DllReferencePlugin插件。

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

解释:

  • manifest:使用DllPlugin生成的manifest文件用于找到对应的动态链接库

结论

在进行前端应用开发时,Webpack已经成为了必不可少的工具,理性配置Webpack可以大大提升前端应用的速度,提供用户的体验,切记优化速度不应该是逐字逐句的,还必须结合实际情况进行分析,综合考虑,做出最适合自己的决策。

示例代码

示例代码请参考以下仓库:Webpack-config-demo

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6728e54a2e7021665e2204ae

纠错
反馈