到目前为止,我们都是手动将所有资产包含在 index.html
文件中,但随着应用程序的增长,一旦您开始在文件名中使用哈希并输出多个 bundle,手动管理 index.html
文件将变得困难。然而,有一些插件可以使这个过程更容易管理。
首先,让我们稍微调整一下项目
项目
webpack-demo
|- package.json
|- package-lock.json
|- webpack.config.js
|- /dist
|- /src
|- index.js
+ |- print.js
|- /node_modules
让我们在 src/print.js
文件中添加一些逻辑
src/print.js
export default function printMe() {
console.log('I get called from print.js!');
}
并在我们的 src/index.js
文件中使用该函数
src/index.js
import _ from 'lodash';
+import printMe from './print.js';
function component() {
const element = document.createElement('div');
+ const btn = document.createElement('button');
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
+ btn.innerHTML = 'Click me and check the console!';
+ btn.onclick = printMe;
+
+ element.appendChild(btn);
+
return element;
}
document.body.appendChild(component());
我们还要更新 dist/index.html
文件,为 webpack 分割入口做准备
dist/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
- <title>Asset Management</title>
+ <title>Output Management</title>
+ <script src="./print.bundle.js"></script>
</head>
<body>
- <script src="bundle.js"></script>
+ <script src="./index.bundle.js"></script>
</body>
</html>
现在调整配置。我们将把 src/print.js
添加为一个新的入口点(print
),并且还会改变输出,使其根据入口点名称动态生成 bundle 名称
webpack.config.js
const path = require('path');
module.exports = {
- entry: './src/index.js',
+ entry: {
+ index: './src/index.js',
+ print: './src/print.js',
+ },
output: {
- filename: 'bundle.js',
+ filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
我们运行 npm run build
看看会生成什么
...
[webpack-cli] Compilation finished
asset index.bundle.js 69.5 KiB [emitted] [minimized] (name: index) 1 related asset
asset print.bundle.js 316 bytes [emitted] [minimized] (name: print)
runtime modules 1.36 KiB 7 modules
cacheable modules 530 KiB
./src/index.js 406 bytes [built] [code generated]
./src/print.js 83 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 1996 ms
我们可以看到 webpack 生成了 print.bundle.js
和 index.bundle.js
文件,这些文件我们也已经在 index.html
文件中指定了。如果您在浏览器中打开 index.html
,就可以看到点击按钮时会发生什么。
但是如果我们更改了一个入口点的名称,甚至添加了一个新的入口点,会发生什么呢?生成的 bundle 在构建时会被重命名,但我们的 index.html
文件仍然会引用旧名称。让我们用 HtmlWebpackPlugin
来解决这个问题。
首先安装插件并调整 webpack.config.js
文件
npm install --save-dev html-webpack-plugin
webpack.config.js
const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
print: './src/print.js',
},
+ plugins: [
+ new HtmlWebpackPlugin({
+ title: 'Output Management',
+ }),
+ ],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
在进行构建之前,您应该知道 HtmlWebpackPlugin
默认会生成自己的 index.html
文件,即使我们已经在 dist/
文件夹中有一个。这意味着它将用新生成的文件替换我们的 index.html
文件。让我们看看运行 npm run build
时会发生什么
...
[webpack-cli] Compilation finished
asset index.bundle.js 69.5 KiB [compared for emit] [minimized] (name: index) 1 related asset
asset print.bundle.js 316 bytes [compared for emit] [minimized] (name: print)
asset index.html 253 bytes [emitted]
runtime modules 1.36 KiB 7 modules
cacheable modules 530 KiB
./src/index.js 406 bytes [built] [code generated]
./src/print.js 83 bytes [built] [code generated]
./node_modules/lodash/lodash.js 530 KiB [built] [code generated]
webpack 5.4.0 compiled successfully in 2189 ms
如果您在代码编辑器中打开 index.html
,您会看到 HtmlWebpackPlugin
已经为您创建了一个全新的文件,并且所有 bundle 都已自动添加。
如果您想了解 HtmlWebpackPlugin
提供的所有功能和选项,那么您应该在 HtmlWebpackPlugin
仓库中查阅。
/dist
文件夹正如您在过去的指南和代码示例中可能已经注意到的那样,我们的 /dist
文件夹变得相当混乱。Webpack 会为您生成文件并将它们放入 /dist
文件夹中,但它不会跟踪哪些文件实际上正在被您的项目使用。
通常,在每次构建之前清理 /dist
文件夹是一个好习惯,这样就只生成使用的文件。让我们使用 output.clean
选项来处理这个问题。
webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
print: './src/print.js',
},
plugins: [
new HtmlWebpackPlugin({
title: 'Output Management',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
+ clean: true,
},
};
现在运行 npm run build
并检查 /dist
文件夹。如果一切顺利,您现在应该只看到构建生成的文件,而没有旧文件了!
您可能想知道 webpack 及其插件是如何“知道”正在生成哪些文件的。答案在于 webpack 用于跟踪所有模块如何映射到输出 bundle 的清单(manifest)。如果您有兴趣以其他方式管理 webpack 的输出
,清单会是一个很好的起点。
清单数据可以使用 WebpackManifestPlugin
提取到 JSON 文件中以供使用。
我们不会详细介绍如何在您的项目中使用此插件的完整示例,但您可以在概念页面和缓存指南中查阅,了解它如何与长期缓存结合。
既然您已经学会了如何将 bundle 动态添加到 HTML 中,接下来让我们深入了解开发指南。或者,如果您想深入探讨更高级的主题,我们建议您前往代码分割指南。