模块化:支持将项目拆分为多个模块,最终将多个模块进行打包代码拆分和按需加载:支持将代码拆分为多个chunk,并且实现按需加载,降低页面加载时间,对spa应用极为友好资源优化:支持代码压缩、tree-shaking、静态资源压缩等功能热更新:支持热更新,修改代码时无需再次编译整个文件,只会对改动内容进行重新编译image-loader : 加载并且压缩图片文件css-loader : 加载 CSS,支持模块化、压缩、文件导入等特性style-loader : 把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSSeslint-loader : 通过 ESLint 检查 JavaScript 代码babel-loader : 把 ES6 转换成 ES5define-plugin : 定义环境变量
html-webpack-plugin : 简化 HTML 文件创建
webpack-parallel-uglify-plugin : 多进程执行代码压缩,提升构建速度
mini-css-extract-plugin : 分离样式文件,CSS 提取为独立文件,支持按需加载
功能不同:
Loader:本质是一个函数,是一个转换器
webpack只能解析原生js文件,对于其他类型文件就需要用loader进行转换Plugin:是一个插件,用于增强webpack功能
webpack在运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 webpack 提供的 API 改变输出结果用法不同:
module.rules下
Object ,⾥⾯描述了对于什么类型的⽂件( test ),使⽤什么加载( loader )和使⽤的参数( options )plugins下
Plugin 的实例,参数通过构造函数传入PluginCompilerEntry 出发,针对每个 Module 串行调用对应的 Loader 去翻译文件的内容Module 依赖的 Module,递归地进行编译处理Module 组合成 ChunkChunk 转换成文件,输出到文件系统中webpack-dev-server(WDS)和浏览器之间维护了一个websocket服务webpack会先将打包生成新的模块代码放入内存中WDS向浏览器推送更新,并附带上构建时的hash,让客户端和上一次资源进行对比WDS发起Ajax请求获取到更改后的内容(文件列表、hash)WDS发起jsonp请求获取到最新的模块代码bundle 捆绑包: 它是构建过程的最终产物,由有需要的chunk和module组成
chunk 代码块:一个chunk由多个模块组合而成,用于代码的合并和分割,在构建过程中一起被打包到一个文件中
module 模块:是代码的基本单位,可以是一个文件、一个组件、一个库等,在编译的时候会从entry中递归寻找出所有依赖的模块
chunk拆分成多个小的chunk,从而实现按需加载,减少初始加载时间,并提高应用程序的性能optimization.splitChunks配置项来开启代码分割Source Map是一种文件,它建立了构建后的代码与原始源代码之间的映射关系Webpack配置文件中的devtool选项中指定devtool: 'source-map'来开启Webpack会通过静态分析依赖图,从入口文件开始,逐级追踪每个模块的依赖关系,以及模块之间的导入和导出关系Webpack会标记每个变量、函数、类和导入,以确定它们是否被实际使用。如果一个导入的模块只是被导入而没有被使用,或者某个模块的部分代码没有被使用,Webpack会将这些未使用的部分标记为"unused"Webpack会在最终的代码生成阶段,通过工具(如UglifyJS等)删除这些未使用的代码,这包括未使用的模块、函数、变量和导入缓存:利用Webpack的持久缓存功能,避免重复构建没有变化的代码
多进程/多线程构建 :使用thread-loader、happypack等插件可以将构建过程分解为多个进程或线程,从而利用多核处理器加速构建
使用DllPlugin和HardSourceWebpackPlugin:
DllPlugin可以将第三方库预先打包成单独的文件,减少构建时间HardSourceWebpackPlugin可以缓存中间文件,加速后续构建过程使用Tree Shaking:配置Webpack的Tree Shaking机制,去除未使用的代码,减小生成的文件体积
移除不必要的插件:移除不必要的插件和配置,避免不必要的复杂性和性能开销
Webpack的Tree Shaking机制,去除未使用的代码UglifyJS或Terser来压缩JavaScript代码,这会删除空格、注释和不必要的代码,减小文件体积Webpack中使用生产模式,通过设置mode: 'production'来启用优化,这会自动应用一系列性能优化策略,包括代码压缩和Tree ShakingBrotli和Gzip,来对静态资源进行压缩,从而减小传输体积冷启动速度:
vite利用浏览器的原生ES moudle,采用按需加载的,而不是将整个项目打包webpack是将整个项目打包成一个或多个bundle,构建过程复杂HMR热更新:
vite使用浏览器内置的ES模块功能,哪个文件更新就加载那个文件Webpack在热更新时重新加载整个包构建速度:
Vite的按需加载避免了将所有代码打包到一个大文件中,而且,Vite对于缓存、预构建等方面的优化也有助于减少构建时间缓存策略: Vite利用浏览器的缓存机制,将依赖的模块存储在浏览器中,避免重复加载
不需要预编译: Vite不需要预编译或生成中间文件,减少了文件IO操作,进一步提升了速度
大概分成三大部分:
解析:将代码转换成 AST
token流,即语法单元组成的数组token流(上面生成的数组)并生成 AST转换:访问 AST 的节点进行变换操作生产新的 AST
生成:以新的 AST 为基础生成代码