1.说说你对webpack的理解,解决了什么问题?
Webpack是把我们写的代码转为浏览器可以执行的代码。 Webpack是一个现代的javascript应用程序模块打包工具,他的核心是把项目中的各种资源(js,css,图片等)视为模块,然后通过一系列加载器和插件,把这些模块打包成 可以在浏览器运行的文件(一个或者多个javaCcript文件)
1.模块化开发:webpack支持各种模块化标准(包括CommonJS、AMD和ES6模块),使得开发者更好的组织和管理代码,模块化代码更易于维护,调试和重用
2.依赖关系管理:webpack通过分析项目中的依赖关系,自动处理模块间的依赖,避免手动管理依赖麻烦,同时确保了模块加载的正确顺序
3.文件打包和优化:webpack能够将项目中的文件打包成一个或多个文件,从而减少http请求数量,提升页面加载性能,此外还支持代码压缩,图片压缩、css提取等优化操作
4.代码分割:webpack支持代码分割,将代码分割成多个chunk,按需加载,这样可以减少初始加载时间,并提升应用程序的响应速度
5.热模块替换:webpack提供了热模块替换,使得在开发中修改代码后,不需要刷新整个页面,只更新修改的模块,提高了开发效率
6.处理非javascript资源:Webpack 不仅可以处理 JavaScript,还可以通过使用 loader 处理其他类型 的文件,例如将 SCSS 或 LESS 编译为 CSS,将 TypeScript 转换为 JavaScript,将图片文件转换为 base64等
7.多环境支持:Webpack 可以根据配置的不同,生成适合开发、生产等不同环境
2.webpack的构建流程
webpack构建流程包括:初始化阶段->编译阶段->构建阶段->优化阶段->输出阶段->完成阶段
1.初始化阶段:webpack从配置文件(webpack.confi.js)读取并合并用户配置,然后创建一个compiler实例,这个实例包含了所有配置信息和钩子(生命周期函数),接下来会开始整个构建过程
2.编译阶段:webpack会从入口开始递归解析每个模块的依赖关系,每找到一个新的模块,就会根据模块类型和loader规则进行处理,处理后的模块会被加入到依赖图中(解析入口,模块解析与加载,依赖关系分析)
3.构建阶段:在解析完所有模块依赖后,webpack会开始根据依赖图将模块组合起来,这个过程包含将各个模块转换为浏览器可执行的代码(js文件),并根据需要进行优化(模块合并,代码分割)
4.优化阶段:在构建完成后,webpack会对输出文件进行一系列的优化操作,treek shaking 去移除未使用的代码
5.输出阶段:根据入口文件以及依赖关系将其打包成一个或者多个chunk,再把每一个chunk转换成一个单独的文件输出到指定的目录中
6.完成阶段:构建流程完成,webpack触发done钩子,根据配置确定输出的路径
3.loader的作用
默认情况下,在遇到import或者load加载模块的时候,webpack只支持对js文件打包,像css、sass、png等这些类型的文件的时候,webpack也无能为力,这个时候就需要配置 对应的loader进行文件内容的解析
配置loader的三种方式:
使用配置文件:在webpack.config.js文件中指定loader:一般配置test属性表示匹配的规则和use属性表示使用loader
内联方式:在每个import语句中显式指定loader
CLI方式:在shell命令中指定他们
4.plugins的作用
1.扩展Webpack功能:plugins扩展webpack能力,实现一些loader无法实现的功能,比如打包优化,资源管理,环境变量注入等
2.自动化任务:plugins可以自动化执行一些重复性的任务,比如生成html文件,压缩代码,提取公共代码等
3.增强构建过程:plugins可以监视文件变化,记录编译时间,输出日志等
4.集成第三方库:通过plugins,可以将第三方库集成到webpack构建过程中
5.loader和plugins的区别?
loader是文件加载器,能够加载文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中。把js和JSON外的其他文件转为webpack可以识别的模块 plugins赋予了webpack各种能力,比如打包优化,资源管理,环境变量注入等,他可以扩展webpack的功能,实现一些loader无法实现的功能
1.执行时机不同
entry=》loaders=》output而插件可以在整个编译期间都起作用
webpack运行的生命周期中会广播很多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的api改变输出结果
对于loader实质是一个转换器,它将A文件进行编译形成B文件
2.配置方式不同:
loader在module.rules中配置,作为模块的规则使用
plugins在plugins中单独配置,通过new关键字创建实例