webpack5 - 查漏补缺 2

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack5 - 查漏补缺 2相关的知识,希望对你有一定的参考价值。

webpack5 - 查漏补缺 2

MPA 设置

MPA (Single Page Application)指的是多页面应用,这里修改基本也针对 MPA 而不是 SPA。

打包成多个 chunk

目前本地代码如下:

修改方法就是将 entry 从字符串改成对象即可,每个键值对对应不同页面的入口。


  entry:  home: './src/index.js', lion: './src/lion.js' ,
  output: 
    filename: '[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'build/'),
    // default for webpack5: publicPath: 'auto'
    // default for webpack4: publicPath: ''
    publicPath: '',
    clean: true,
  ,

只是进行这样的修改的话,webpack 最终还是会将所有的 bundle 打包到一个 html 中去。

生成多个 HTML 文件

这里主要用的就是多个 HtmlWebpackPlugin 对象,每个对象指代的是一个页面,同时,chunks 中需要制定对应的 js 入口:

module.exports = 
  entry:  home: './src/index.js', lion: './src/lion.js' ,
  output: 
    filename: '[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'dist/'),
    // default for webpack5: publicPath: 'auto'
    // default for webpack4: publicPath: ''
    publicPath: '',
    clean: true,
  ,
  // ...
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin(
      filename: 'hello-world.html',
      template: 'src/page-template.hbs',
      title: 'Title from HBS',
      description: 'description loaded from template file',
      chunks: ['home'], // => must be identical to entry
    ),
    new HtmlWebpackPlugin(
      filename: 'lion.html',
      template: 'src/page-template.hbs',
      title: 'Cute lion',
      description: 'Very cute lion cub',
      chunks: ['lion'], // => must be identical to entry
    ),
  ],
;

提取共享包

这里引包使用了 lodash,所以打包后两个 bundle chunk 都引入了 lodash:

对于两个页面来说,lodash 的代码是比较大,同时也是相同的,如果两个页面都引用的话,会影响用户体验感,因此这里可以通过 optimization 去让 webpack 自动提取共享的代码,并且单独打包:


  // ...
  optimization: 
    splitChunks: 
      chunks: 'all',
    ,
  ,
  // ...

webpack 对于优化的默认大小为 30kb,因此小于 30kb 的共享包不会分开打包,如果要修改这个值的话,可以指定 minSize 进行修改:


  // ...
  optimization: 
    splitChunks: 
      chunks: 'all',
      minSize: 3000 // ~3kb
    ,
  ,
  // ...

SSR

找了下,最简单的方式是使用 express 读取打包好的静态文件从而实现 SSR,这里贴一下 express 的配置:

const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();

app.use('/static', express.static(path.resolve(__dirname, '../dist')));

app.get('/lion', (req, res) => 
  const pathToHtmlFile = path.resolve(__dirname, '../dist/lion.html');
  const contentFromHtmlFile = fs.readFileSync(pathToHtmlFile, 'utf-8');

  res.send(contentFromHtmlFile);
);

app.get('/hello-world', (req, res) => 
  const pathToHtmlFile = path.resolve(__dirname, '../dist/hello-world.html');
  const contentFromHtmlFile = fs.readFileSync(pathToHtmlFile, 'utf-8');

  res.send(contentFromHtmlFile);
);

app.listen(3000, () => 
  console.log('Application is running on port 3000');
);

wepback 部分将 publicPath 修改为 express 中对应的静态文件:


  output: 
    filename: '[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'dist/'),
    // default for webpack5: publicPath: 'auto'
    // default for webpack4: publicPath: ''
    publicPath: '/static/',
    clean: true,
  ,

如果 express 不设置 static,那么无法对 css、图片进行解析,也就没办法正常渲染图片。

另外,static 这个只是对外暴露的一个路由,目前的配置并没有说将文件写入到 dist/static 文件夹下。实际上所有的 assets 还是直接在 dist 这个根目录下的。

以上是关于webpack5 - 查漏补缺 2的主要内容,如果未能解决你的问题,请参考以下文章

webpack5 - 查漏补缺 2

webpack5 - 查漏补缺 2

微前端之 Webpack5 的 module federation

微前端之 Webpack5 的 module federation

查漏补缺1

JavaScript查漏补缺 —数组中reduce()方法