Webpack学习简单汇总

100 阅读4分钟

一 基础

1、Webpack 常规配置项有哪些?

  • mode: "development"|"production"|"none" 打包模式
  • entry: 入口文件
  • ouput:fileName,path 输出文件名和路径目录
  • module:webpack 默认支持处理 JS 与 JSON 文件,其他类型借助loader。将不认识的文件,转换成可认识的文件
  • plugins:可以贯穿 Webpack 打包的生命周期,执行不同的任务
  • devtool:为了更容易地追踪 error 和 warning,JavaScript 提供了 source maps 功能
  • devServer 配置热替换
  • optimization:配置构建性能

2、常用 Loader 有哪些?如何配置?

常用loader:

  • style-loader(将处理好的css,通过style标签加入到html中)、css-loader(识别.css),postcss-loader(css兼容),sass-loader,less-loader。
  • file-loader:解决图片引入问题,并将图片 copy 到指定目录,默认为 dist
  • url-loader:解依赖 file-loader,当图片小于 limit 值的时候,会将图片转为 base64 编码,大于 limit 值的时候依然是使用 file-loader 进行拷贝;
  • image-loader:压缩图片
  • babel-loader:解决js兼容性,如es6,es-next。解决臃肿,可配置babelrc.js

3、常用插件(Plugin)有哪些?如何配置?

  • html-webpack-plugin:将打包后的js或css文件自动引入到html文件中;
  • clean-webpack-plugin:自动清空上次打包的文件

常量引入require,CJS plugins:进行配置, new *Plugin(params)

4、Babel 的如何配置?Babel 插件如何使用?

  • babel-loader 使用 Babel 加载 ES2015+ 代码并将其转换为 ES5
  • @babel/core Babel 编译的核心包
  • @babel/preset-env Babel 编译的预设,可以理解为 Babel 插件的超集,其他常见预设@babel/preset-flow @babel/preset-react @babel/preset-typescript

两种方式:1、配置babel-loader 2、通过预设文件babelrc.js

5、devtool熟悉配置?关于source-map

  • 本地开发: eval-cheap-module-source-map
  • 生产环境:none

6、解决缓存问题?

  • hash :任何一个文件改动,整个项目的构建 hash 值都会改变;
  • chunkhash:文件的改动只会影响其所在 chunk 的 hash 值;
  • contenthash:每个文件都有单独的 hash 值,文件的改动只会影响自身的 hash 值;

Webpack进阶

一 优化构建速度

1、构建费时分析

speed-measure-webpack-plugin

2、resolve配置别名 alias

3、externals

排除依赖库的打包,如:jQuery;大大节省打包构建的时间。

4、缩小范围

loader合理运用exclude,include

5、noParse

不需要解析依赖的第三方大型类库等,可以通过这个字段进行配置,以提高构建速度 使用 noParse 进行忽略的模块文件中不会解析 import、require 等语法

6、IgnorePlugin

将插件中的非中文语言排除掉

7、多进程配置

使用thread-loader(happypack webpack5已经弃用)

8、利用缓存

  • babel 在转译 js 过程中时间开销比价大,将 babel-loader 的执行结果缓存起来,重新打包的时候,直接读取缓存
  • 缓存位置: node_modules/.cache/babel-loader

二 优化构建结果

1、构建结果分析

webpack-bundle-analyzer

2、压缩 CSS

OptimizeCssAssetsPlugin

3、压缩 JS

terser-webpack-plugin

4、清除无用的 CSS

purgecss-webpack-plugin

5、Tree-shaking

  • Tree-shaking 作用是剔除没有使用的代码,以降低包的体积
  • webpack 默认支持,需要在 .bablerc 里面设置 model:false,即可在生产环境下默认开启

6、Scope Hoisting

Scope Hoisting 即作用域提升,原理是将多个模块放在同一个作用域下,并重命名防止命名冲突,通过这种方式可以减少函数声明和内存开销。

  • webpack 默认支持,在生产环境下默认开启
  • 只支持 es6 代码

三 优化运行时体验

1、入口点分割

配置多个打包入口,多页打包

2、splitChunks 分包配置

optimization.splitChunks 是基于 SplitChunksPlugin 插件实现的 webpack 将根据以下条件自动拆分 chunks:

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

3、代码懒加载

import('./')引入js代码后then处理, 和Vue路由懒加载有异曲同工之妙。

4、prefetch和preload配置

参考总结知识点。