webpack 面试题整理_webpack面试题-程序员宅基地

技术标签: node.js  webpack  前端  其他  面试题  

webpack 面试题整理

谈谈你对Webpack的理解

1.Webpack是什么?

webpack 是一个静态模块打包器,当 webpack 处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个 bundle。

webpack 就像一条生产线,要经过一系列处理流程(loader)后才能将源文件转换成输出结果。 这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。
插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源做处理。 webpack 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运作。

2.可以说说打包过程/构建流程
3.可以说说对前端运行的优化

Webpack的打包过程/打包原理/构建流程?

在这里插入图片描述
webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来。

命令行执行npx webpack打包命令开始
1.初始化编译参数:从配置文件和shell命令中读取与合并参数
2.开始编译:根据上一步得到的参数初始化Compiler对象,加载所有配置的Plugin,执行对象的 run 方法开始执行编译。
3.确定入口:根据配置中的 entry 找出所有的入口文件
4.编译模块:从入口文件触发,调用所有配置的Loader对模块进行翻译,再找出该模块依赖的模块,然后递归本步骤直到所有入口依赖的文件都进行翻译。
5.完成模块编译:在经过第4步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系图。
6.输出资源:根据依赖关系图,组装成一个个包含多个模块的Chunk,再把每个Chunk转化成一个单独的文件加入到输出列表,根据配置确定输出的路径和文件名,输出。

在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑。

总结

  • 初始化:从配置文件和shell命令中读取与合并参数,根据参数初始化Compiler实例,加载Plugin(注册所有配置的插件),调用Compiler实例的run方法开始执行编译。

Compiler编译对象掌控者webpack生命周期,不执行具体的任务,只是进行一些调度工作。比如执行模块创建、依赖收集、分块、打包等
调用run之后,创建Compiltation实例,每次构建都会新创建一个Compiltation实例,包含了这次构建的基本信息
Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑。

  • 编译:从entry 触发,对每个Module 串行调用对应的 Loader对模块进行翻译,再找出该模块依赖的模块,递归进行编译处理。

从配置文件( webpack.config.js )中指定的 entry 入口,开始解析文件构建 AST 语法树

  • 根据依赖关系图,组装成包含多个模块的Chunk,将个Chunk转换成文件输出。

不同entry生成不同chunk,动态导入也会生成自己的chunk

Webpack中loader的作用/ loader是什么?

Loader 是webpack中提供了一种处理多种文件格式的机制,因为webpack只认识JS和JSON,所以Loader相当于翻译官,将其他类型资源进行预处理。
用于对模块的"源代码"进行转换。
loader支持链式调用,**调用的顺序是从右往左。**链中的每个loader会处理之前已处理过的资源,最终变为js代码。
可以通过 loader 的预处理函数,为 JavaScript 生态系统提供更多能力。

常见的loader有哪些?

  • less-loader:将less文件编译成css文件

开发中,我们常常会使用less预处理器编写css样式,使开发效率提高

  • css-loader:将css文件变成commonjs模块加载到js中,模块内容是样式字符串
  • style-loader: 创建style标签,将js中的样式资源插入标签内,并将标签添加到head中生效
  • ts-loader: 打包编译Typescript文件

Plugin有什么作用?/Plugin是什么

Plugin功能更强大,主要目的就是解决loader 无法实现的事情,比如打包优化和代码压缩等。
Plugin加载后,在webpack构建的某个时间节点就会触发plugin定义的功能,帮助webpack做一些事情。实现对webpack的功能扩展。

常见的Plugin有哪些

  • html-webpack-plugin 处理html资源,默认会创建一个空的HTML,自动引入打包输出的所有资源(js/css)
  • mini-css-extract-plugin 打包过后的css在js文件里,该插件可以把css单独抽出来
  • clean-webpack-plugin 每次打包时候,CleanWebpackPlugin 插件就会自动把上一次打的包删除

Webpack 插件的执行顺序(加载机制)?

Webpack中Loader和Plugin的区别

总说
webpack 就像一条生产线,要经过一系列处理流程(loader)后才能将源文件转换成输出结果。 这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。
插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源做处理。 webpack 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运作。

或者分别使用之前的总结说Loader和Plugin是什么

运行时机
1.loader运行在编译阶段
2.plugins 在整个周期都起作用
在这里插入图片描述

使用方式
Loader:1.下载 2.使用
Plugin:1.下载 2.引用 3.使用

Webpack 做过哪些优化手段?有哪些优化手段?

如何利用webpack来优化前端性能? 问的是生产环境优化
如何提高webpack的构建速度? 问的是构建速度的优化

tree-shaking 删除没有使用的代码 优化前端性能/提高构建速度

tree-shaking是一种基于 ES Module 规范的 Dead Code Elimination 技术打包,在打包过程中检测工程中没有引用过的模块并进行标记,删除没有引用过的模块,提高构建速度,较少程序运行时间。

使用tree-shaking需要注意什么?

1.默认mode = production ,生产环境默认开启tree-shaking功能。
2.需要是使用 ES6 规范编写模块代码,ES6的模块依赖关系是确定的,和运行时状态无关
3.尽量不写带有副作用的代码。如编写了立即执行函数,在函数里使用了外部变量等。

关于副作用

如何利用webpack来优化前端性能?

  • 代码压缩

按需加载

  • 代码分割 splitChunks - 在optimization配置项中配置

1.可以将node__mudules中代码单独打包成一个chunk输出(比如使用了jqury?)
2.会自动分析多入口chunk中,有没有公共的文件,如果有会打包成单独的一个chunk不会重复打包

  • 使用Dll进行分包

正常情况下node_module会被打包成一个文件
使用dll技术,对可以将那些不常更新的框架和库进行单独打包,生成一个chunk

  • 使用路由懒加载

在代码中所有被 import()函数引用的模块,都将打成一个单独的包,放在 chunk 存储的目录下。在浏览器运行到这一行代码时,就会自动请求这个资源,实现异步加载。

Webpack如何配置压缩代码?压缩了什么?

1.在optimization配置项中来配置该插件作为压缩器进行压缩。
2.在plugins里使用该插件进行压缩

js压缩:利用terser-webpack-plugin
css压缩:利用了optimize-css-assets-webpack-plugin 插件

删除了console、注释、空格、换行、没有使用的css代码等

如何提高webpack的构建速度?

思路1:减少需要构建的文件或代码

  • HMR(Hot Module Replacement) 模块热替换只重新构建发生变化的模块 – 开发环境中
  • 缩小处理范围:合理利用这两个属性exclude:不需要处理的文件 和 include:需要处理的文件
  • babel缓存 第二次构建时,会读取之前的缓存,只重新构建变化的文件
  • 使用Dll进行分包 --> 分包方便按需加载

正常情况下node_module会被打包成一个文件
使用dll技术,对可以将那些不常更新的框架和库进行单独打包,生成一个chunk
项目源代码也需要拆分,可以根据路由来划分打包文件 --> 怎么实现路由懒加载?webpack中如何实现组件异步加载?

思路2:多进行进行构建

  • 多进程打包 thread-loader,将其放在费时的loader之前

进程启动和进程通信都有开销,工作时间比较长,才需要多进程打包

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41370833/article/details/124783929

智能推荐

mysql存储过程出参入参_mysql存储过程出参入参,sqlserver很熟悉的一件事到mysql,捣鼓了大半天。记录一下提醒自己。勿看...-程序员宅基地

文章浏览阅读286次。create PROCEDURE myTestProcname(in score int ,out result varchar(100))BEGINIF score>60 THENset result=‘yes‘;ELSEset result=‘no‘;END if;END调用CALL myTestProcname(50,@result);select @result //为了看下出参结果..._if new.zss_score15>=60 then

JDK安装与配置(最新保姆级)_idea2021安装教程及环境配置-程序员宅基地

文章浏览阅读6.8k次,点赞5次,收藏33次。文章目录一、JDK安装1)官网下载2)安装步骤3)配置步骤一、JDK安装1)官网下载官网下载地址https://www.oracle.com/java/technologies/downloads/根据自己的系统版本下载提示登录ORACLE账户,如果没有就用邮箱注册一个登录后就可以下载了2)安装步骤傻瓜式安装,直接点击下一步即可。 注意:不建议安装到默认盘一般软件默认安装C盘,C盘是系统盘,安装太多软件系统会卡。不建议安装到中文目录中或者目录带空格很多国外开_idea2021安装教程及环境配置

BUUCTF-[SCTF2019]Flag Shop_buuctf [sctf2019]flag shop-程序员宅基地

文章浏览阅读4.1k次。[SCTF2019]Flag Shop简单看一下几个按钮的作用,buy flag是购买flag的按钮,但是当前的JinKela不够买不起,reset是重置按钮,work是工作按钮,可以赚取JinKela,但是每次只能赚取一小部分。(除非你足够闲,一直点到所需的数量然后购买flag)这三个按钮干不成大事,目录扫描,扫到robots.txt查看页面备份文件这里可以看到源码~~(本菜狗没学过Ruby,哭了)~~问题不大,看到了JWT,先抓个包看一下,找到了jkl的位置,但是缺少密钥对其进行加_buuctf [sctf2019]flag shop

20.1:MATLAB软件的并行计算环境配置案例讲解(课程共5600字,4段代码举例,带详细操作步骤)-程序员宅基地

文章浏览阅读35次。在当今的科学研究和工程应用中,MATLAB作为一种强大的数学软件,已经成为数据分析和算法开发的重要工具。尤其是在处理大规模数据和复杂计算任务时,MATLAB的并行计算功能显得尤为重要。本课程旨在深入探讨MATLAB并行计算的应用,从基础的并行环境配置到复杂的实际应用案例,适合不同层次的学习者深入理解并行计算的原理和实践。在本课程中,我们深入探讨了MATLAB并行计算的强大功能和应用。通过一系列精心设计的代码示例,我们不仅学习了并行计算的基本概念和操作步骤,还深入理解了如何在实际问题中有效应用并行计算。

交流耦合和直流耦合-程序员宅基地

文章浏览阅读1k次,点赞25次,收藏22次。我们采集到的信号总不会是理想波形,例如,在采集交流信号的时候,可能会混入直流分量,而在采集直流信号的时候,也有可能混入交流分量,所以一个待测信号包含交流和直流两部分。耦合是指两个不同介质中通过物理连接时进行的能量传递。_交流耦合

算法笔记(胡凡)刷题笔记目录-程序员宅基地

文章浏览阅读6k次,点赞21次,收藏221次。文章目录胡凡算法笔记刷题笔记目录,待更新...《算法笔记》第三章、入门模拟《算法笔记》第四章、算法初步《算法笔记》第五章、数学问题《算法笔记》第六章、C++标准模板库(STL)介绍《算法笔记》第七章、数据结构专题(1)《算法笔记》第八章、搜索专题《算法笔记》第九章、数据结构专题(2)胡凡算法笔记刷题笔记目录,待更新…《算法笔记》第三章、入门模拟《算法笔记》3.1小节——入门模拟->简单模拟《算法笔记》3.2小节——入门模拟->查找元素《算法笔记》3.3小节——入门模拟->图形输出

随便推点

gradle系列-编译不同module中相同包名类名的java文件_java不同模块有相同的包名和类-程序员宅基地

文章浏览阅读2.3k次。问题在我们的工程使用中,如果存在相同名称的Java类名,但是也是包名不同来区分,但是如果我们依赖的库中存在两个相同的类名,并且包名也相同的两个类时,gradle编译后会是什么现象呢?让我们带着这个问题来继续下面的实验。创建工程让我们创建一个demo工程,并新建一个lib库依赖让我们现在app下创建一个Utils类,然后在utillibs模块下创建一个包名类名完全跟Utils相同的类。..._java不同模块有相同的包名和类

2388 首都(曼哈顿距离与切比雪夫距离互转)-程序员宅基地

文章浏览阅读269次。在平面上有n个整点(横纵坐标都是整数)牛牛想找到一个整点,使得这个点,到所有点的距离之和最小。两个点的距离定义为从一个点走到另一个点的最小步数。其中每步可以走向相邻8个点(上,下,左,右,左上,左下,右上,右下,类似国际象棋中的王)走一步。输出这个最小的距离之和。和这个点选择的方案数。(即有多少个点,可以达到这个最小的距离)对于100%的数据,1 <= n <= 10000..._2388 首都

杂谈---嵌入式(单片机、arm)在线升级方案_arm在线升级-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏20次。描述 最近不少人问我如何给单片机升级,如何给arm板升级。也有些人说网上很多工具可以参考或者移植。我当时回答时,如果做功能,自己想怎么玩即可,如果要做成量化的产品最好自己做一套协议。 因为应用场合不同,对于一些特殊的功能尽量还是要在可控制中。移植不一定适合所有平台资源。所以我分享了我自己实现过的一套方案。 本文档主要描述其他平台采用uart..._arm在线升级

Compression-Expansion Coding Improvements in MLC/TLC NVM论文解读-程序员宅基地

文章浏览阅读1.3k次。写个标题,明天开工(这玩意儿30页)写在前面本论文原标题是 CompEx++: Compression-Expansion Coding for Energy, Latency, and Lifetime Improvements in MLC/TLC NVMs

PCB PDN design guidelines (PCB电源完整性设计指导) ------PCB叠放准则-程序员宅基地

文章浏览阅读616次。PCB PDN design guidelines (PCB电源完整性设计指导) ------PCB叠放准则在本博客中,将来自不同来源的许多准则收集在一起。 它们在这里汇总以供参考。 优质的PDN设计并不需要满足所有要求。 而是应根据特定PCB电路的特性制定详细的设计准则。..._pdn design

Centos7安装docker_linux 服务器curl: (35) tcp connection reset by peer-程序员宅基地

文章浏览阅读201次。xdm,我已经替你们总结好安装步骤,按顺序执行就完事了(注意最后的ps是卸载啊,那个就不用敲了。。。)_linux 服务器curl: (35) tcp connection reset by peer