当前位置: 首页 > news >正文

webpack面试问题

一、核心概念

  1. Webpack的构建流程是什么?

    • 答案
      1. 初始化:读取配置,创建Compiler对象
      2. 编译:从入口文件开始,递归分析依赖关系,生成依赖图
      3. 模块处理:调用Loader转换模块(如babel-loader)
      4. 输出:将处理后的模块组合成Chunk,生成最终文件
  2. Loader和Plugin的区别?

    • Loader:文件加载器(转换非JS文件,如.less.css
    • Plugin:扩展Webpack功能(如生成HTML文件、压缩代码)
    • 关键区别:Loader处理单个文件,Plugin作用于整个构建流程

二、配置与优化

  1. 如何实现代码分割(Code Splitting)?

    • 答案
      optimization: {splitChunks: {chunks: 'all', // 分离node_modules和公共模块cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors'}}}
      }
      
  2. Tree Shaking生效的条件?

    • 必要条件
      1. 使用ES6模块语法(import/export
      2. 生产模式(mode: 'production'
      3. package.json中配置"sideEffects": false

三、性能优化

  1. 如何优化Webpack构建速度?

    • 高频策略
      • 缓存babel-loader?cacheDirectory=true
      • 多线程thread-loader
      • 缩小搜索范围resolve.modules指定node_modules路径
      • DLL预构建:对稳定第三方库提前打包
  2. 如何分析打包体积过大问题?

    • 工具
      # 生成分析文件
      webpack --profile --json > stats.json
      # 使用工具可视化
      webpack-bundle-analyzer
      

四、原理与插件开发

  1. Webpack的HMR(热更新)原理?

    • 流程
      1. 文件变动触发Webpack重新编译
      2. 新模块通过websocket推送到浏览器
      3. 客户端运行时替换旧模块(保留应用状态)
  2. 如何编写一个自定义Plugin?

    • 示例(生成版本文件插件):
      class VersionPlugin {apply(compiler) {compiler.hooks.emit.tap('VersionPlugin', compilation => {const version = new Date().toISOString();compilation.assets['version.txt'] = {source: () => version,size: () => version.length};});}
      }
      

五、实战场景

  1. 如何配置多页应用打包?

    • 关键点
      entry: {page1: './src/page1.js',page2: './src/page2.js'
      },
      plugins: [new HtmlWebpackPlugin({ template: './page1.html', chunks: ['page1'] }),new HtmlWebpackPlugin({ template: './page2.html', chunks: ['page2'] })
      ]
      
  2. Webpack5对比Webpack4的重大改进?

    • 主要升级
      • 模块联邦(Module Federation)
      • 持久化缓存(cache: { type: 'filesystem' }
      • 内置Asset Modules(替代file-loader

六、高频代码题

  1. 手写一个简易Webpack
    • 核心实现
      // 1. 解析模块依赖
      function createAsset(filename) {const code = fs.readFileSync(filename, 'utf-8');const ast = parser.parse(code, { sourceType: 'module' });const dependencies = [];traverse(ast, {ImportDeclaration: ({ node }) => dependencies.push(node.source.value)});return { filename, dependencies, code };
      }// 2. 生成依赖图
      function createGraph(entry) {const graph = [createAsset(entry)];for (const asset of graph) {asset.mapping = {};asset.dependencies.forEach(relativePath => {const absolutePath = path.join(path.dirname(asset.filename), relativePath);const childAsset = createAsset(absolutePath);asset.mapping[relativePath] = childAsset.id;graph.push(childAsset);});}return graph;
      }
      
http://www.xdnf.cn/news/632989.html

相关文章:

  • 理解HTTP基本认证与表单登录认证
  • 自动化安全脚本学习
  • 9:OpenCV—模板匹配
  • React声明式编程(手动控制,大型项目,深度定制)与Vue响应式系统(自动优化,中小型项目,快速开发)区别
  • openjdk底层(hotspot)汇编指令的内存分布
  • 掌阅iReader新形态墨水屏Tango发布:科技与美学共舞,开启灵动阅读新体验
  • C++星际密码破译全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • SAR ADC的功耗设计
  • 图解BERT
  • 免费开源 PDF 阅读器 自带虚拟打印机功能 多格式兼容
  • 【计算机网络】基于UDP进行socket编程——实现服务端与客户端业务
  • threejs模型对象、材质
  • 健身网l;l;j
  • Java21 并发处理说明
  • Python数据可视化实战:让数据从「数字堆」变成「故事书」
  • git push出现 “HTTP 400 curl 22 The requested URL returned error: 400...“错误
  • 计网5:HTTP/TCP的长连接和短连接的区别以及各自的应用场景
  • JavaSE核心知识点03高级特性
  • Linux系统之----磁盘硬件
  • 【25软考网工】第八章 (1)交换机基础
  • C# 预处理器指令
  • 人工智能概论(一)初见人工智能笔记
  • MultipartFile实现文件上传
  • python 程序实现了毫米波大规模MIMO系统中的信道估计对比实验
  • 基于CEEMDAN-Transformer-BiLSTM的多特征风速气候预测的完整实现方案及PyTorch源码解析
  • 2025年渗透测试面试题总结-匿名[实习]安全工程师(大厂) (2)(题目+回答)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • Github上一些使用技巧(缩写、Issue的Highlight)自用
  • Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理
  • 对象存储(Minio)使用