webpack常见配置字段及优化方案

一:SPA是什么?
单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时,通过js动态更新该页面的Web应用程序。

优点:

良好的用户体验
采用前后端分离的方式进行开发,开发体验更友好
减少服务器的请求,请求一次html及可
缺点:

复杂的、数据量大的应用首页,加载会比较缓慢
浏览器seo不友好(js实现动态交互)

二:常见的前端构建工具
前端构建工具有很多,例如:webpack,vite,rollup,gulp等等

1,webpack
webpack是facebook公司推出的一款致力于前端应用打包的工具,webpack采用模块化的思想,通过esModule生成模块依赖图,然后通过loader、plugins等插件编译依赖图中的模块,生成浏览器可识别的js、json类型的文件。

2,vite
vite是基于esm的前端构建工具,与webpack先全局构建打包并生成bundle产物不同,vite是通过拦截浏览器端的请求,通过middlewares根据请求加载并解析请求所需要的资源文件。

三:webpack字段及其作用
1,模式

mode:‘production’ / ‘development’ / ‘none’

作用:用来指定打包的环境,生产环境还是开发环境

2,入口

entry: string | object | array

作用:指定打包入口,可以指定项目是单页面打包还是多页面打包,通常一个html模版对应一个入口文件

3,输出

output: object

作用:用来定义打包输出的结果,包括文件位置、name、type等

4,模块

module:object

作用:包含多个模块,每个模块用来处理特定类型的文件

5,模块解析

resolve:object

作用:一般常用来配置文件后缀、模块导入的别名解析

6,代码映射

devTool:string

作用:用来指定是否打包生成对应的map映射文件,以及map文件类型

7,热更新

devServer: object

作用:开发环境下的静态资源服务器

8,插件

plugins:array

作用:通过插件机制可以丰富webpack的功能

9,目标产物

target:string

作用:告知 webpack 为目标(target)指定一个环境。默认值为 browserslist,如果没有找到 browserslist 的配置,则默认为 web

10,优化

optimization:object

作用:webpack4提出的webpack优化方案,包含webpack默认优化方式,可手动覆盖

四:webpack打包优化
1,css压缩

// css压缩
const OptimizeCssAssetsWebpackPlugin = require(\'optimize-css-assets-webpack-plugin\')

module.exports = {
...
 optimization: {
    // 覆盖webpack默认的优化压缩方案
    minimizer: [
      new OptimizeCssAssetsWebpackPlugin({})
    ]
  },
...
}

问题:分离并压缩css后,项目还可以开启css module ?

2,js压缩

// js压缩
const TerserWebpackPlugin = require(\'terser-webpack-plugin\')

module.exports = {
...
  optimization: {
    // 覆盖webpack默认的优化压缩方案
    minimizer: [
      new TerserWebpackPlugin({}),
    ]
  },
...
}

3,多进程打包
HappyPack

const HappyPack = require(\'happypack\')

module.exports = {
...
module: {
rules: [
 {
        test: /.js$/,
        exclude: /node_modules/,
        use: \'happypack/loader?id=happy\'
      },
]
}
...
plugins: [
    // happypack实例
    new HappyPack({
      id: \'happy\',
      loaders: [\'babel-loader\']
    })
]
}

Thread-loader

module.exports = {
...
module: {
rules: [
      {
        test: /.(js|mjs|jsx|ts|tsx)$/,
        exclude: /(node_modules|bower_components)/,
        use: [
          {
            loader: \'babel-loader\',
            options: {
              presets: [\'@babel/preset-env\', \'@babel/preset-react\']
            }
          },
          /*
            开启多进程打包。
            进程启动大概为600ms,进程通信也有开销。
            只有工作消耗时间比较长,才需要多进程打包
          */
          {
            loader: \'thread-loader\',
            options: {
              // 进程数量
              workers: 2
            }
          }
        ]
      },
}
...
}

Parallel-Webpack

4,dll打包
流程:

在这里插入图片描述

代码示例:

webpack.config.js
...
 // 映射公共文件打包生成的dll文件,减少打包时间
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require(isPro ? \'./pro-dll/manifest.json\' : \'./dev-dll/manifest.json\')
    }),
    // pro环境下必须确认当前的dll文件的hash
    new AddAssetHtmlWebpackPlugin({
      filepath: path.resolve(__dirname, isPro ? \'./pro-dll/dll.264ae4dc.js\' : \'./dev-dll/dll.js\')
    })
...

webpack.dll.config.js
...
    new webpack.DllPlugin({
      path: path.join(__dirname, `${dllPathName}`, \'manifest.json\'),
      name: \'[name]_[hash]\',
      context: __dirname
    }),
...

未使用dll打包

在这里插入图片描述

使用dll打包
在这里插入图片描述

对比:dll方案比原始方案快3000ms,所以采用dll方案打包基础的,版本不改变的组件库是可以提升打包构建速度的。当项目是多页面应用时,效果更佳明显。

5,splitChunk分包
splitChunk是webpack4推出的避免模块复用的解决方案,避免了相同模块重复打包编译。webpack默认会进行splitChunk分包。

webpack 将根据以下条件自动拆分 chunks:

新的 chunk 可以被共享,或者模块来自于 node_modules 文件夹
新的 chunk 体积大于 20kb(在进行 min+gz 之前的体积)
当按需加载 chunks 时,并行请求的最大数量小于或等于 30
当加载初始化页面时,并发请求的最大数量小于或等于 30
参考链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值