【发布时间】:2018-11-21 00:43:54
【问题描述】:
我正在尝试利用 SplitChunksPlugin 为 MPA 中的每个页面/模板生成单独的包。当我使用 HtmlWebpackPlugin 时,我会为每个页面获取一个 html 文件,其中包含指向正确包的脚本标记。这太棒了!但是,我遇到的问题是我的供应商文件。我希望单独的 html 文件仅指向他们需要的供应商捆绑包。当 SplitChunksPlugin 创建多个供应商捆绑包时,我无法让每个单独的 html 文件指向正确的供应商捆绑包。生成的捆绑包是:
home.bundle.js
product.bundle.js
cart.bundle.js
vendors~cart~home~product.bundle.js
vendors~cart~product.bundle.js
所以基本上 home 模板应该引用 home.bundle.js、vendors~cart~home~product.bundle.js,而不是第二个 vendor bundle。只有购物车和产品模板应该引用这两个供应商捆绑包。我正在使用 HtmlWebpackPlugin 的 chunks 选项,但除非我像这样明确引用它的名称,否则无法让它提取正确的供应商包:
chunks: ['vendors~cart~home~product.bundle','home']
但这有点违背了动态呈现脚本标签的目的。我尝试创建一个供应商入口点,但这将我所有的供应商聚集在一起。 我缺少一些简单的配置吗?
我的 webpack.config.js:
const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const Visualizer = require('webpack-visualizer-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devtool: 'cheap-module-eval-source-map',
entry: {
home: './src/js/page-types/home.js',
product: './src/js/page-types/product.js',
cart: './src/js/page-types/cart.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist/js')
},
optimization: {
splitChunks: {
chunks: 'all'
}
},
plugins: [
new CleanWebpackPlugin(['dist']),
new Visualizer(),
new HtmlWebpackPlugin({
filename: 'home.html',
chunks: ['vendors','home']
}),
new HtmlWebpackPlugin({
filename: 'product.html',
chunks: ['vendors','product']
}),
new HtmlWebpackPlugin({
filename: 'cart.html',
chunks: ['vendors~cart~product','cart']
}),
], ...
我的 js 模块:
/* home.js */
import jQuery from 'jquery';
import 'bootstrap';
cart 和 product 也引用了 react 库:
/* cart.js */
import jQuery from 'jquery';
import 'bootstrap';
import React from 'react';
import ReactDOM from 'react-dom';
/* product.js */
import jQuery from 'jquery';
import 'bootstrap';
import React from 'react';
import ReactDOM from 'react-dom';
示例html输出home.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack App</title>
</head>
<body>
<script type="text/javascript" src="home.bundle.js"></script></body>
</html>
【问题讨论】:
-
不是每个块都会有 react、jquery 和 bootstrap 吗?理想情况下,我们希望它们位于单独的供应商文件中,这样它就不会被复制到每个块中?
-
@anvarik 非常好的问题。我知道我最初有同样的问题,因为我们不希望浏览器不得不一遍又一遍地重复下载库。这将与我们试图实现的性能背道而驰。幸运的是,webpack 已经通过 SplitChunksPlugin 自动处理了这个问题。它会智能地将您的所有供应商拆分为单独的捆绑包,并根据您导入它们的方式将一些供应商组合成一个捆绑包。您可以在此处查看相关文档:webpack.js.org/guides/code-splitting/#splitchunksplugin
标签: javascript webpack build-tools html-webpack-plugin webpack-4