模块化
:支持将项目拆分为多个模块
,最终将多个模块进行打包代码拆分和按需加载
:支持将代码拆分为多个chunk,并且实现按需加载
,降低页面加载时间,对spa应用
极为友好资源优化
:支持代码压缩
、tree-shaking
、静态资源压缩
等功能热更新
:支持热更新
,修改代码时无需再次编译整个文件,只会对改动内容进行重新编译image-loader
: 加载并且压缩图片文件css-loader
: 加载 CSS
,支持模块化、压缩、文件导入等特性style-loader
: 把 CSS
代码注入到 JavaScript
中,通过 DOM
操作去加载 CSS
eslint-loader
: 通过 ESLint
检查 JavaScript
代码babel-loader
: 把 ES6
转换成 ES5
define-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
的实例,参数通过构造函数传入Plugin
Compiler
Entry
出发,针对每个 Module
串行调用对应的 Loader
去翻译文件的内容Module
依赖的 Module
,递归地进行编译处理Module
组合成 Chunk
Chunk
转换成文件,输出到文件系统中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 Shaking
Brotli
和Gzip
,来对静态资源进行压缩,从而减小传输体积冷启动速度:
vite
利用浏览器的原生ES moudle
,采用按需加载的,而不是将整个项目打包webpack
是将整个项目打包成一个或多个bundle
,构建过程复杂HMR热更新:
vite
使用浏览器内置的ES
模块功能,哪个文件更新就加载那个文件Webpack
在热更新时重新加载整个包构建速度:
Vite
的按需加载避免了将所有代码打包到一个大文件中,而且,Vite
对于缓存、预构建等方面的优化也有助于减少构建时间缓存策略: Vite
利用浏览器的缓存机制,将依赖的模块存储在浏览器中,避免重复加载
不需要预编译: Vite
不需要预编译或生成中间文件,减少了文件IO操作,进一步提升了速度
大概分成三大部分:
解析:将代码转换成 AST
token
流,即语法单元组成的数组token
流(上面生成的数组)并生成 AST转换:访问 AST 的节点进行变换操作生产新的 AST
生成:以新的 AST 为基础生成代码