大厂前端研发岗位设计的30道Webpack面试题及解析


一、基础核心

  1. Webpack的核心概念是什么?
    解析:入口(entry)、输出(output)、加载器(loader)、插件(plugins)、模式(mode)。Loader处理非JS文件,Plugin扩展功能。

  2. Loader和Plugin的区别?
    解析

    • Loader:文件转换器(如.scss → .css)
    • Plugin:生命周期钩子中执行任务(如打包优化、资源注入)
  3. 如何实现一个简单的Loader?
    解析:导出一个函数,接收源码,返回处理结果:

    js 复制代码
    module.exports = function(source) {
      return source.replace('foo', 'bar');
    };

二、配置进阶

  1. 如何配置多入口文件?
    解析

    js 复制代码
    entry: {
      app: './src/app.js',
      admin: './src/admin.js'
    }
  2. 如何动态生成HTML文件并注入资源?
    解析 :使用html-webpack-plugin,自动注入打包后的JS/CSS。

  3. 开发环境 vs 生产环境配置差异
    解析

    • 开发:devtool: 'eval-source-map'mode: 'development'、热更新
    • 生产:代码压缩、资源优化、mode: 'production'

三、性能优化

  1. 代码分割(Code Splitting)的三种方式
    解析

    1. 入口分割:entry多入口
    2. 动态导入:import('./module')
    3. 配置分割:optimization.splitChunks
  2. 如何压缩JS/CSS?
    解析

    • JS:TerserWebpackPlugin(Webpack5内置)
    • CSS:CssMinimizerWebpackPlugin
  3. Tree Shaking生效的条件?
    解析

    • 使用ES6模块语法(import/export
    • 生产模式(mode: 'production'
    • 无副作用声明(package.json中设置"sideEffects": false
  4. 如何提升构建速度?
    解析

    • 缓存:cache: { type: 'filesystem' }
    • 多线程:thread-loader
    • 减少范围:exclude: /node_modules/

四、Loader原理

  1. 如何实现图片自动转Base64?
    解析 :配置url-loader

    js 复制代码
    {
      loader: 'url-loader',
      options: { limit: 8192 } // <8KB的图转Base64
    }
  2. CSS如何实现模块化?
    解析css-loader开启modules选项:

    js 复制代码
    { loader: 'css-loader', options: { modules: true } }
  3. 如何编译SASS并添加浏览器前缀?
    解析:链式Loader:

    js 复制代码
    ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']

    postcss-loader需配合postcss-preset-env插件。


五、Plugin机制

  1. Plugin的工作原理是什么?
    解析 :基于Tapable事件流,在编译生命周期(如compileemit)挂载任务。

  2. 写一个统计打包耗时的Plugin
    解析

    js 复制代码
    class TimePlugin {
      apply(compiler) {
        compiler.hooks.beforeRun.tap('Time', () => this.start = Date.now());
        compiler.hooks.done.tap('Time', () => console.log(`耗时: ${Date.now() - this.start}ms`));
      }
    }
  3. 如何删除打包后的注释?
    解析 :使用TerserWebpackPlugin配置extractComments: false


六、高级应用

  1. 如何配置Webpack Dev Server代理?
    解析

    js 复制代码
    devServer: {
      proxy: {
        '/api': 'http://localhost:3000' // 代理API请求
      }
    }
  2. 模块热替换(HMR)原理是什么?
    解析

    1. 建立WebSocket连接(实时通信)
    2. 文件变动时重新编译模块
    3. 通过JSON消息通知客户端替换模块
  3. 如何打包SVG图标为雪碧图?
    解析svg-sprite-loader + 配置symbolId: 'icon-[name]'


七、工程化实战

  1. 如何集成Babel?
    解析

    js 复制代码
    {
      test: /\.js$/,
      use: ['babel-loader'],
      exclude: /node_modules/
    }

    配合.babelrc配置presets(如@babel/preset-env)。

  2. 如何分析打包体积?
    解析

    • webpack-bundle-analyzer可视化分析
    • 命令行:npx webpack --profile --json > stats.json生成报告
  3. 如何兼容旧浏览器?
    解析

    • Babel转译ES6+语法
    • core-js提供Polyfill
    • CSS前缀通过autoprefixer添加

八、原理深挖

  1. Webpack的构建流程是怎样的?
    解析

    初始化 → 编译(分析依赖) → 生成Chunk → 输出文件(emit)

  2. Chunk和Bundle的区别?
    解析

    • Chunk:代码块(如入口chunk、异步chunk)
    • Bundle:Chunk经过编译和打包后的最终文件
  3. Loader的执行顺序?
    解析从右到左,从下到上

    js 复制代码
    use: ['style-loader', 'css-loader', 'sass-loader'] 
    // 执行顺序:sass → css → style

九、异常处理

  1. Source Map的作用?如何选择类型?
    解析 :映射编译后代码到源码。开发用eval-cheap-source-map(快),生产用hidden-source-map(安全)。

  2. 如何处理第三方库的兼容问题?
    解析

    • 使用resolve.alias重定向库路径
    • 配置externals排除不打包的库(如CDN引入)
    • @babel/plugin-transform-runtime避免重复注入Polyfill

十、综合场景

  1. 如何实现按需加载Ant Design组件?
    解析

    js 复制代码
    // babel.config.js
    plugins: [['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }]]
  2. SSR项目如何配置Webpack?
    解析

    • 双配置:webpack.client.js + webpack.server.js
    • 服务端配置:target: 'node'externals排除Node模块
    • 客户端配置:入口为hydration脚本
  3. 微前端场景如何隔离子应用Webpack?
    解析

    • 主应用:配置ModuleFederationPlugin暴露共享模块
    • 子应用:配置ModuleFederationPlugin引入共享模块,避免重复打包
    • 关键字段:name, filename, exposes, remotes, shared

相关推荐
前端之虎陈随易4 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
一路向北he4 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
kyriewen4 小时前
豆包和千问同时关了智能体,我用它们搭的 3 个自动化全废了——迁移方案整理
前端·javascript·ai编程
前端一小卒4 小时前
我用 TypeScript 从零手写了一个 Claude Code,然后发现它的核心只有 30 行
前端·agent
Waay4 小时前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
大圣编程6 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
yuhaiqiang6 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
之歆7 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜7 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端
负责的蛋挞8 小时前
异步HttpModule的实现方式
java·服务器·前端