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

Webpack5+Vite基础知识

文章目录

  • 前言:为什么需要打包工具?
  • 一、Webpack基本实现
    • 1. Webpack的构建流程
    • 2. Webpack的打包优化
    • 3. loader和plugin的编写思路
    • 4. Vue-loader 是什么?
    • 5. loader有哪些?
    • 6. webpack 热更新的实现原理
    • 7. bundle,chunk,module是什么?
  • 二、Vite基本实现
    • 1. Vite的构建流程
    • 2. 什么是Rollup?
    • 3. 什么是TreeShaking?
  • 三、Webpack和Vite
    • 1. Webpack & Vite 对比(高频必问)
    • 2. Webpack 与 Vite 的本质区别
    • 3. Vite 为什么生产环境不用 esbuild 直接打包?
    • 4. Webpack 5 的关键优化
  • 四、Babel
    • 1. Babel 是什么?
    • 2. Babel 的核心作用?
    • 3. Babel 工作原理(三步走)
    • 4. 常问:@babel/core、@babel/preset-env、plugin、preset 区别
    • 5. 什么是 Polyfill?和语法转译有啥区别?
    • 6. 两种 Polyfill 方式:usage 和 runtime 区别(高频)
    • 7. Babel 和 Webpack / Vite 的关系?
    • 8. 为什么有了 Babel 还需要构建工具?
  • 五、其他问题
    • 1. 什么是前端脚手架?
    • 2. 常见脚手架有哪些?
    • 3. 脚手架解决了什么问题?
    • 4. 脚手架实现原理(面试高频)
    • 5.Vue CLI 跟 create-vite 区别?
    • 6. 为什么不自己新建项目,要用脚手架?

前言:为什么需要打包工具?

开发时,我们会使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 css 预处理器等语法进行开发。

这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、CSS等语法,才能运行。

所以我们需要打包工具帮我们做完这些事。

除此之外,打包工具还能压缩代码、做兼容性处理、提升代码性能等。

当我们习惯了在node中编写代码的方式后,在回到前端编写html、csS、js这些东西会感觉到各种的不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。

我们就迫切的希望有一款工具可以对代码进行打包,将多个模块打包成一个文件。这样一来即解决了兼容性问题,又解决了模块过多的问题。

  • 开发会使用 ES6 模块化、框架、Less/Sass 等浏览器无法直接识别的语法,需要打包工具编译转换。
  • 解决浏览器模块化语法的兼容性问题。
  • 合并多个零散模块文件,减少请求次数,优化加载速度。
  • 可压缩代码、做兼容性处理,精简体积。
  • 整体优化项目代码,提升浏览器运行性能。

一、Webpack基本实现

1. Webpack的构建流程


总结:Webpack 会首先根据配置找到入口文件,从入口开始递归解析所有模块依赖,构建依赖图谱;接着通过 Loader 对各类非 JS 文件进行编译、语法转换与兼容处理,再在打包各个生命周期中执行 Plugin 插件完成优化、压缩、资源处理等操作,最后将所有处理后的模块整合、合并打包,输出压缩优化后的最终静态资源到指定目录。

2. Webpack的打包优化

Webpack 打包优化主要从缩小打包体积、提升打包速度、优化运行性能三个方向入手,核心方案如下:

  1. 提升构建速度
    配置 mode: production开启生产模式;使用 cache缓存构建结果;通过exclude/include 精准筛选 loader 处理文件,避免编译无关模块;使用 thread-loader开启多线程加速编译
  2. 减小打包体积
    采用Tree Shaking 剔除无用代码;通过代码分割(Code Splitting) 拆分入口文件与第三方依赖,实现按需加载使用 externals 提取大型第三方库(如 React、Vue、jQuery),把大型第三方库从打包文件中剥离出去,不参与打包,直接用 CDN 在线加载。CDN 资源会被浏览器缓存,用户再次访问时不用重新下载,并且项目代码和第三方库可以同时加载,提升首屏渲染速度;开启 压缩优化,压缩 JS、CSS、图片资源
  3. 资源与加载优化
    配置 asset-module 处理图片 / 字体等静态资源,实现压缩与转 Base64;使用懒加载 import() 减少首屏代码体积;通过CSS 抽离 单独打包样式文件,避免样式阻塞

提速用缓存、多线程、精准编译;减体积用 Tree Shaking、代码分割、externals、资源压缩;优化加载用懒加载、CDN、抽离 CSS。

面试回答简化版:
打包优化可以从速度、体积、性能这三个方面入手

  1. 提升打包速度:开启生产模式、配置构建缓存,通过include/exclude缩小 Loader 编译范围,使用多线程打包,提升构建效率。
  2. 缩小打包体积:开启 Tree Shaking 移除无效代码,做代码分割和路由懒加载;通过externals剥离第三方大型库,CDN 外部引入,同时压缩 JS、CSS、图片等资源。
  3. 优化运行性能:抽离独立 CSS 文件,避免样式阻塞;统一管理静态资源,优化首屏加载速度。

3. loader和plugin的编写思路

  1. Loader 编写思路
    Loader 本质是纯函数,接收源文件内容,返回处理后的内容。
    执行顺序从右往左、从下往上依次执行。
    核心流程读取文件源码 → 对代码进行转换、编译、替换、转义等处理 →输出处理后的代码交给下一个 loader
    同步用 return,异步用 this.callback,复杂场景可开启异步处理。
  2. Plugin 编写思路
    Plugin基于Webpack 生命周期钩子工作,通过事件回调介入打包全过程。
    本质是类,必须有 apply 方法,接收 compiler 实例
    核心流程:在 apply 中注册钩子 → 监听打包关键阶段事件 → 获取编译资源、修改文件、注入内容、删除目录等自定义操作 → 完成自定义功能。

先由 Loader 完成单个文件的编译转换(比如将 Less

http://www.jsqmd.com/news/781681/

相关文章:

  • ARM SIMD指令VMUL与VMULL详解及优化实践
  • 嵌入式系统SSL/TLS优化实现与资源受限环境应用
  • Kimi-VL-A3B-Thinking从零开始:Jetson Orin Nano边缘设备部署尝试
  • nli-MiniLM2-L6-H768代码实例:调用API完成句子对推理,附JSON响应结构与错误排查
  • Arm嵌入式开发内存映射与分散加载技术详解
  • 基于Tmux与Claude构建AI自治开发团队:三层架构与自动化实践
  • 基于MCP协议构建开源供应链风险分析服务器:原理、实现与AI集成
  • 5月8日OpenAI上线三款语音模型,GPT - Realtime - 2推理能力大幅提升,你看好谁接力?
  • SimGRAG:用模拟检索数据解决RAG训练与评估难题
  • VibeLign:AI辅助编程的安全防护与项目管理工具
  • C裸机程序形式化验证实战手册(从Makefile到Proof Script全链路闭环)
  • 将地址转换为可点击的 Google Maps 链接(类似 tel
  • 如何高效实现跨平台3D模型转换:Blender MMD Tools专业指南
  • 基于Qt C++的土壤检测软件
  • egergergeeert FLUX.1-dev模型解析:强提示词理解能力实战验证
  • QNX AMP:汽车声学处理的软件定义革命
  • XUnity Auto Translator终极指南:让所有Unity游戏轻松跨越语言障碍
  • NaViL-9B惊艳效果展示:手写签名+印刷正文混合图像的分离识别能力
  • AI虚拟开发团队:基于Agent Skills规范构建结构化智能体协作
  • 全栈开发者技能图谱:从技术体系构建到高效学习路径
  • C语言基础项目升级:为传统学生管理系统加入智能语义检索
  • 防范SQL注入的SQL编码规范_禁用动态拼接字符串语句
  • 主子表的数据页面如何布局
  • Qwen3-4B-Thinking开源大模型部署教程:免Docker纯Python环境搭建
  • 科研小插曲
  • Linux中断控制器架构与处理流程详解
  • Qianfan-OCR部署教程:Docker镜像一键拉取+Streamlit界面自动启动
  • Super Qwen Voice World部署案例:中小企业AI配音降本提效实证
  • 高性能SQL解析库-fast-sqlparse
  • Flux.1-Dev深海幻境与物联网结合:为智能家居中控屏生成动态壁纸与场景图标