webpack打包流程

打包流程

  1. 初始化
  • 读取config配置
  • 创建compiler实例
  • 加载插件
  1. 编译阶段 从入口文件递归解析依赖关系分析,生成依赖图
  2. 模块处理 通过loader转译,比如balel,sass-loader处理等。
  3. 输出chunk 将各个依赖文件生成对应的chunk代码块,此时会走插件逻辑。
  4. 生成文件 根据输出配置filename、path等生成最终的bundle

常用的面试题

Webpack 的 Loader 和 Plugin 有什么区别

  • loader: loader的功能是将特定的文件转译成浏览器能识别的js文件。如 babel-loaderfile-loader
  • Plugin: 插件,属于是拓展的功能,可以在webpack各个打包流程的生命周期函数中做特殊处理。 如HtmlWebpackPluginMiniCssExtractPlugin

如何优化 Webpack 构建速度?

优化方案:

  • 编译阶段
    • 缓存 cache: { type: 'filesystem' }
    • 优化loader作用范围 :比如使用exclude,精确loader作用范围,以提高效率。
  • 开发阶段
    • 代码分割 treehShaking 等
    • 开启多线程等:happyPack
  • 压缩代码体积
    • 比如图片给一个maxSize
js 复制代码
{
        test: /\.(jpe?g|png|svg|gif)$/i,
        type: "asset",
        parser: {
          dataUrlCondition: {
            maxSize: 25 * 1024, // 25kb
          },
        },
        generator: {
          filename: "assets/imgs/[name].[hash:8][ext]",
        },
      },

什么是 Tree Shaking?如何生效?

package.json 配置 sideEffects:false;会将没有使用的代码去掉 treeshaking的限制:只支持esm语法。

js 复制代码
// 原始代码(问题:全量引入lodash)
import _ from 'lodash';
export const deepClone = (obj) => _.cloneDeep(obj);

// 优化后(按需引入 + 纯函数标记)
import { cloneDeep } from 'lodash-es';
export const deepClone = /*#__PURE__*/ (obj) => cloneDeep(obj);

如何实现按需加载(懒加载)?

使用动态导入的方法

相关推荐
飞翔的熊blabla9 小时前
# Webpack 5 + Jenkins 持久化缓存实战:前端构建从 288 秒降到 30 秒>
前端·webpack·jenkins
梨想橙汁18 小时前
Vite 优化、踩坑汇总 + Webpack 迁移 Vite 实战
前端·webpack·vite
天道kabuto3 天前
Webpack 迁 Vite 踩坑记:一个让人抓狂的 Sourcemap 报错怎么破?
webpack·vite
梨想橙汁3 天前
Webpack 快速上手:前端工程化、打包原理、从零搭建基础项目
前端·webpack·前端工程化
晴天163 天前
Webpack3/4/5 核心差异、性能升级与迁移实战指南-Day38
webpack·node.js
晴天164 天前
Vite vs Webpack 全方位对比
前端·webpack·node.js
PBitW6 天前
为什么vite中TS报错,可以继续运行?Webpack不行?
前端·webpack·typescript·vite
你别说话了7 天前
Webpack 如何迁移重构到 Vite
前端·webpack·重构
后除9 天前
从零到一: 创建一个 TypeScript 7 项目
前端·webpack·typescript
xyphf_和派孔明23 天前
Vite 与 Webpack 对比及常见面试题
前端·webpack·vite