Webpack实用功能:Overlay、代码分割与DLL优化详解

作者:缓存笔记时间:2026-10-22 11:29:36浏览:527

本文介绍Webpack的四个实用功能:devServer.overlay用于在页面直接显示编译错误;require.ensure实现SPA应用的代码分割与按需加载;webpack-bundle-analyzer可视化分析打包体积;DllPlugin结合DllReferencePlugin预编译第三方依赖以显著缩短构建时间,并解决Vue版本冲突问题。

此前曾分享过Vue2与Webpack3的基础内容,本期将继续介绍Webpack中一些较为实用的进阶功能。

开发服务器错误提示:overlay

1. overlay

overlay是devServer的一个属性,具体的配置示例如下:


devServer: {
 overlay: {
  errors: true,
  warnings: true
 }
}

该配置非常简单,其核心作用是在浏览器打开的页面中直接显示终端编译时产生的错误。通过启用此属性,开发人员在编写代码时,若编译出错,无需再打开终端查看报错信息,即可直接在页面中看到错误详情,这极大地提升了开发体验。

单页面应用代码分割:require.ensure

2. require.ensure

与overlay相比,require.ensure的功能更为实用。在之前介绍的Vue2与Webpack3多页面应用配置中,我们处理的是多个HTML入口。但如果项目是单页面应用(SPA),情况会有所不同。

在SPA应用中,我们最常遇到的问题是将所有代码打包成一个巨大的JS文件,导致该文件体积过大,进而使得应用首次加载时的等待时间过长。如何解决这一问题?require.ensure正是为了解决此问题而设计的。

具体该如何使用?

使用方法同样简单,只需按照以下方式配置Vue的router即可:


const Layout = require('../Layout')
const Home = r => require.ensure([], () => r(require('../home'), home)
export default [{
 path: '/',
 component: Layout,
 children: [{
  path: '',
 component: Home
 }]
}]

从代码中可以看到,require.ensure接收三个参数。

第一个参数用于配置依赖列表,被依赖的模块会与当前模块打包在一起;第二个参数是一个函数,用于将需要单独打包的模块传入回调中;第三个参数是chunkname,可用于配置生成的JS文件名。配置完成后,当加载该页面时,属于每个页面特有的代码部分就会单独加载。

打包资源分析:webpack-bundle-analyzer

3. webpack-bundle-analyzer

这是一个Webpack插件,主要用于分析模块打包后的资源情况,其展示效果非常直观且实用。首先我们来看一下它的效果图:

开发服务器错误提示:overlay 

那么该如何进行配置呢?首先需要通过npm安装该插件,然后进行如下配置:


const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins = [
 new BundleAnalyzerPlugin({
 // Can be `server`, `static` or `disabled`.
 // In `server` mode analyzer will start HTTP server to show bundle report.
 // In `static` mode single HTML file with bundle report will be generated.
 // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`.
 analyzerMode: 'server',
 // Host that will be used in `server` mode to start HTTP server.
 analyzerHost: '127.0.0.1',
 // Port that will be used in `server` mode to start HTTP server.
 analyzerPort: 8888,
 // Path to bundle report file that will be generated in `static` mode.
 // Relative to bundles output directory.
 reportFilename: 'report.html',
 // Module sizes to show in report by default.
 // Should be one of `stat`, `parsed` or `gzip`.
 // See "Definitions" section for more information.
 defaultSizes: 'parsed',
 // Automatically open report in default browser
 openAnalyzer: true,
 // If `true`, Webpack Stats JSON file will be generated in bundles output directory
 generateStatsFile: false,
 // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`.
 // Relative to bundles output directory.
 statsFilename: 'stats.json',
 // Options for `stats.toJson()` method.
 // For example you can exclude sources of your modules from stats file with `source: false` option.
 // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
 statsOptions: null,
 // Log level. Can be 'info', 'warn', 'error' or 'silent'.
 logLevel: 'info'
 })
]

配置过程简单且实用。

依赖预编译优化:DllPlugin与DllReferencePlugin

4. DllPlugin+DllReferencePlugin

在使用Webpack进行开发时,许多人可能会发现项目启动编译的时间过长。原因在于随着项目规模扩大,依赖模块越来越多,每次启动项目都需要重新编译打包所有代码,从而导致构建时间显著增加。如何解决这一问题?

解决思路如下:通常情况下,node_modules文件夹中的依赖包基本不会频繁变动,因此没有必要每次编译都重新打包。我们可以将这些依赖提前打包好,之后即可重复使用。

DllPlugin正是用于提前打包依赖包的插件。DllPlugin包含两个部分:DllPlugin和DllReferencePlugin。

首先,DllPlugin的作用是提前打包好依赖,具体步骤如下:

新建一个vendor.js文件,用于引入所有需要依赖的模块:


import Vue from 'vue';
import ElementUI from 'element-ui';
import VouRouter from 'vue-router';

新建一个webpack.config.dll.js配置文件,配置内容如下:


const path = require('path');
const webpack = require('webpack');
module.exports = {
 entry: {
  vendor: [path.resolve(__dirname, 'vendor')]
 },
 output: {
  path: path.resolve(__dirname, './dll'),
 filename: 'dll.[name].js',
 library: '[name]'
 },
 plugins: [
 new webpack.DllPlugin({
 path: path.join(__dirname, "./dll", "[name]-manifest.json"),
 name: "[name]"
 })
 ],
 resolve: {
 extensions: ['js']
 }

配置完成后,在终端运行webpack --config webpack.config.dll.js命令。此时,在dist/dll目录下会生成dll.vendore.js和vendor-manifest.json两个文件,至此DllPlugin提取依赖的步骤即告完成。

接下来是DllReferencePlugin的配置,该配置更为简单。找到项目原本的webpack.config.js文件,进行如下配置:


module.exports = {
 plugins: [
  new webpack.DllReferencePlugin({
   context: path.join(__dirname, "src"),
   manifest: require("./dll/vendor-manifest.json")
  })
 ]
}

虽然配置看似完成,但在运行项目时,可能会遇到如下提示:

You are using the runtime-only build of Vue...

该提示的大意是:由于使用了vue的template,但使用的Vue版本不正确。因此,我在webpack.config.dll.js中对Vue进行了如下设置:


alias: {
 'vue$': 'vue/dist/vue.common.js'
}

若不进行此设置,默认会打包vue.runtime.common.js,而正确的做法应该是打包vue.common.js文件。完成上述配置后,本以为一切正常,但结果仍报出相同错误。

随后,我在webpack.config.js中也做了同样的配置,问题才得以解决。但这会导致Vue被打包两次,因此目前只能暂时放弃在vendor中引入Vue。导致该问题的具体原因尚不明确。

作者最新文章
相关文章
更多