webpack面试题(持续汇总ing。。。)

  1. webpack的编译过程

    1.  初始化

      1. 此阶段,webpack会将CLI参数、配置文件、默认配置进行融合,形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单,主要是为接下来的编译阶段做必要的准备目前,可以简单的理解为,初始化阶段主要用于产生一个最终的配置。
    2. 编译

      1. 创建chunk
        1. chunk是webpack在内部构建过程中的一个概念,译为块,它表示通过某个入口找到的所有依赖的统称。根据入口模块(默认为./src/index.js)创建一个chunk
        2. 每个chunk都有至少两个属性:
          1. name:默认为main
          2. id:唯一编号,开发环境和name相同,生产环境是一个数字,从0开始
      2. 构建所有依赖模块
      3. 产生chunk assets
        1. 在第二步完成后,chunk中会产生一个模块列表,列表中包含了模块id和模块转换后的代码。
          接下来,webpack会根据配置为chunk生成一个资源列表,即chunk assets资源列表可以理解为是生成到最终文件的文件名和文件内容
      4. 合并chunk assets
        1. 将多个chunk的assets合并到一起,并产生一个总的hash
    3. 输出

      1. 此步骤非常简单,webpack将利用node中的fs模块(文件处理模块),根据编译产生的总的assets,生成相应的文件。
    4. 总过程

      1. 当敲下命令后首先开始初始化,即读取命令参数,然后导入配置文件合并配置对象,把形成的配置对象交给编译器,编译器可能有一个chunk,也可能又多个chunk,但至少肯定有一个,每一个chunk里面要构建好自己的模块,它把chunk里面所有的相关模块找到,具体实现方式通过入口文件一个个找,找到相关的模块之后,他会生成一个资源列表,就是最终这个chunk会对应哪些资源生成出来,每个chunk会有自己的id名字和hash,然后把每个chunk生成的资源合并成一个完整的资源,并且生成一个完整的hash,最终根据完整的资源列表输出到文件,因为合并的chunk块记录的很详细,文件名是什么,文件内容是什么,很容易就输出到文件了,这就是整个webpack的编译过程。如果详细的讨论,主要在生成多个模块。
  2. 设计术语

    1. module:模块,分割的代码单元,webpack中的模块可以是任何内容的module文件,不仅限于JS。
    2. chunk:webpack内部构建模块的块,一个chunk中包含多个模块,这些模块是从入口模块通过依赖分析得来的。
    3. bundle:chunk构建好模块后会生成chunk的资源清单,清单中的每一项就是一个bundle,可以认为bundle就是最终生成的文件
    4. hash:最终的资源清单所有内容联合生成的hash值
    5. chunkhash:chunk生成的资源清单内容联合生成的hash值
    6. chunkname:chunk的名称,如果没有配置则使用main
    7. id:通常指chunk的唯一编号,如果在开发环境下构建,和chunkname相同;如果是生产环境下构建,则使用一个从0开始的数字进行编号
  3. webpack的核心概念

    1. Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。告诉webpack要使用哪个模块作为构建项目的起点,默认为./src/index.js
    2. output :出口,告诉webpack在哪里输出它打包好的代码以及如何命名,默认为./dist
    3. Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
    4. Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。
    5. Loader:模块转换器,用于把模块原内容按照需求转换成新内容。
    6. Plugin:扩展插件,在 Webpack 构建流程中的特定时机会广播出对应的事件,插件可以监听这些事件的发生,在特定时机做对应的事情。
  4. Webpack的基本功能有哪些?

    1. 代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等等
    2. 文件优化:压缩 JavaScript、CSS、html 代码,压缩合并图片等
    3. 代码分割:提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载
    4. 模块合并:在采用模块化的项目有很多模块和文件,需要构建功能把模块分类合并成一个文件
    5. 自动刷新:监听本地源代码的变化,自动构建,刷新浏览器
    6. 代码校验:在代码被提交到仓库前需要检测代码是否符合规范,以及单元测试是否通过
    7. 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。
  5. gulp/grunt 与 webpack的区别是什么?

    1. 三者都是前端构建工具,grunt和gulp在早期比较流行,现在webpack相对来说比较主流,不过一些轻量化的任务还是会用gulp来处理,比如单独打包CSS文件等。
    2. grunt和gulp是基于任务和流(Task、Stream)的。类似jQuery,找到一个(或一类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任务就构成了整个web的构建流程。
    3. webpack是基于入口的。webpack会自动地递归解析入口所需要加载的所有资源文件,然后用不同的Loader来处理不同的文件,用Plugin来扩展webpack功能。
  6. 怎么配置单页应用?怎么配置多页应用?

    1. 单页应用可以理解为webpack的标准模式,直接在entry中指定单页应用的入口即可,这里不再赘述。
    2. 多页应用的话,可以使用webpack的 AutoWebPlugin来完成简单自动化的构建,但是前提是项目的目录结构必须遵守他预设的规范。多页应用中要注意的是:每个页面都有公共的代码,可以将这些代码抽离出来,避免重复的加载。比如,每个页面都引用了同一套css样式表。随着业务的不断扩展,页面可能会不断的追加,所以一定要让入口的配置足够灵活,避免每次添加新页面还需要修改构建配置
  7. Loader机制的作用是什么?

    1. webpack默认只能打包js文件,配置里的module.rules数组配置了一组规则,告诉 Webpack 在遇到哪些文件时使用哪些 Loader 去加载和转换打包成js。注意:
      1. use属性的值需要是一个由 Loader 名称组成的数组,Loader 的执行顺序是由后到前的;
      2. 每一个 Loader 都可以通过 URL querystring 的方式传入参数,例如css-loader?minimize中的minimize告诉css-loader要开启 CSS 压缩。
  8. 常用loader

    1. file-loader    把⽂件输出到⼀个⽂件夹中,在代码中通过相对 URL 去引⽤输出的⽂件。
    2. url-loader    和 file-loader 类似,但是能在⽂件很⼩的情况下以 base64 的⽅式把⽂件内容注⼊到代码中去。
    3. source-map-loader    加载额外的 Source Map ⽂件,以⽅便断点调试。
    4. image-loader    加载并且压缩图⽚⽂件。
    5. babel-loader    将ES6转化为ES5。
    6. css-loader    加载 CSS,⽀持模块化、压缩、⽂件导⼊等特性。
    7. style-loader    把 CSS 代码注⼊到 JavaScript 中,通过 DOM 操作去加载 CSS。
    8. eslint-loader     通过 ESLint 检查 JavaScript 代码。
    9. less-loader    可以打包处理.less相关的文件。
    10. sass-loader    可以打包处理.scss相关的文件。
       
  9. webpack怎么对vue的编译(快手)

    1. 说明Vue项目中,Webpack的作用是打包构建Vue组件、资源等,输出浏览器可执行的代码。
    2. 介绍在Vue项目中,使用vue-loader来解析Vue的单文件组件(.vue文件)。
    3. 解释vue-loader会将单文件组件的模板编译为render函数,脚本部分编译为JS代码,样式提取为CSS代码。
    4. 举例说明vue-loader对组件模板的编译过程,使用了@vue/compiler-sfc的compileTemplate方法。
    5. 概述对组件脚本的处理,会经过babel转译,解析ES6等代码为ES5。
    6. 描述对样式的处理,使用CSS加载器提取并处理为浏览器可用的CSS。
    7. 解析出组件之间的依赖关系,输出给Webpack进行模块打包。
    8. 总结Webpack通过vue-loader解析组件,输出经过优化的浏览器可执行代码。
    9. 下面就是可以详细回答的内容:
      在Vue项目中,Webpack的作用是对代码进行模块打包和构建,最终输出浏览器可以直接执行的JavaScript代码。为了实现这个目的,Webpack需要解析Vue的单文件组件,也就是以.vue结尾的文件。
      Webpack通过vue-loader来专门处理Vue组件的解析。vue-loader会将单文件组件分割成三部分,分别是模板代码、脚本代码和样式代码。对于模板部分,vue-loader会使用@vue/compiler-sfc中的compileTemplate方法把模板编译成render函数,这是Vue实际运行时使用的渲染逻辑。对于脚本部分,会使用babel对其进行编译和转换,输出符合ES5标准的JavaScript代码。样式部分则会通过CSS加载器进行处理,最终提取并生成浏览器可用的CSS样式。
      在解析组件的过程中,vue-loader还会分析出组件之间的依赖关系,例如组件导入了其它子组件等。这些依赖关系的信息会输出给Webpack,用于其进一步进行模块Resolve和依赖收集,最终生成浏览器可执行的JavaScript代码。
      所以,Webpack通过vue-loader解析Vue组件,对不同部分应用不同的加载器进行转换和处理,输出一个优化且浏览器可执行的JavaScript包,以及所需的CSS、资源等,从而实现了对整个Vue项目的构建和打包。这大大简化了Vue项目的开发流程。
  10. Plugin(插件)的作用是什么?

    1. Plugin 是用来扩展 Webpack 功能的,通过在构建流程里注入钩子实现,它给Webpack 带来了很大的灵活性。
    2. Webpack 是通过plugins属性来配置需要使用的插件列表的。plugins属性是一个数组,里面的每一项都是插件的一个实例,在实例化一个组件时可以通过构造函数传入这个组件支持的配置属性。
  11. 常见Plugins

    1. HtmlWbpackPlugin自动在打包结束后生成html文件,并引入bundle.js
    2. cleanwebPackPlugin打包自动删除上次打包文件
  12. 如何提高webpack的构建速度?

    1. 在多入口情况下使用SplitChunksPlugin来提取公共代码
    2. 通过externals配置来提取常用库
    3. 利用 DIPlugin和DIReferencePlugin预编译资源模块,通过DilPlugin来对那些我们引用但是绝对不会修改的npm包来进行预编译,再通过DIReferencePlugin将预编译的模块加载进来。
    4. Happypack:将loader由单线程转为多线程加速编译
    5. 使用webpack-uglify-parallel来提升uglifyPlugin的压缩速度。原理上webpack-uglify-parallel采用了多核并行压缩来提升压缩速度(多核构建项目)
  13. 如何利用webpack优化前端性能

    1. 用webpack优化前端性能是指优化webpack的输出结果,让打包的最终结果在浏览器运行快速高效。
    2. 压缩代码,删除多余代码注释,简化代码的写法
      1. 可以利用webpack的uglifyjs-webpack-plugin和webpack-parallel-uglify-plugin来压缩JS文件
      2. 利用optimize-css-assets-webpack-plugin来压缩css
    3. 利用CDN加速
      1. 在构建过程中,将引用的静态资源路径修改为CDN上对应的路径。
      2. 可以利用webpack对于output参数和各loader的publicPath参数来修改资源路径。
    4. 剔除多余代码
      1. Tree shaking 摇树优化
        1. 可以通过在启动webpack时追加参数--optimize-minimize 来实现
      2. CodeSplitting 代码分割
        1. 将代码按路由维度或者组件分块(chunk),这样做到按需加载,同时可以充分利用浏览器缓存。
    5. 提取公共代码
      1. SplitChunksPlugin插件来进行公共模块抽取利用浏览器缓存可以长期缓存这些无需频繁变动的公共代码:
  14. 文件指纹是什么?

    1. 文件指纹是打包之后的文件后缀名。
    2. chunkhash:和webpack打包的chunk有关,不同的entry会生出不同的chunkhash。
    3. js后缀名:filename:'[name][chunkhash:8].js',
    4. contenthash:根据文件内容来定义hash,文件内容不变,则其不变。
    5. css后缀名:filename:'[name][contenthash:8].css',
    6. hash:和整个项目构建有关,只要项目文件有修改,整个构建的hash值就会修改。
    7. img后缀名:name:'[name][hash:8].[ext]',
  15. source map是什么?

    1. 将编译,打包,压缩后的代码映射回源码的过程,打包压缩后的代码不具有良好的可读性,想要调试源码就需要soucre map。线上环境:避免在生产中使用inline-和eval-,因为他们会增加bundle体积大小,并降低整体性能。
      1. hidden-source-map:借助第三方错误监控平台Sentry使用。
      2. nosources-source-map:只会显示具体行数以及查看源代码的错误栈。安全性比source map高。
      3. source map通过nginx设置将.map文件只对白名单开放(公司内网)。
  16. 描述一下编写loader或plugin的思路

    1. loader像一个“翻译官”,把读到的源文件内容转义成新的文件内容,并且每个loader通过链式操作,把源文件一步步翻译成想要的样子。编写loader要遵循单一原则,每个loader只做一种“转义”工作,每个loader拿到的是源文件内容(source),可以通过返回值的方式将处理后的内容输出,也可以调用this.callback()方法,将内容返回给webpack。还可以通过this.async()生成一个callback函数,再用它将处理后的内容输出去。此外webpack还为开发者准备了开发loader的工具函数集——loader-utils。
    2. plugin编写比较灵活。webpack在运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果。
  17. 文件监听原理是什么?

    1. 在发现源码发生变化时,自动重新构建出新的输出文件。
    2. 原理
      1.  轮询判断文件的最后编辑时间是否变化,如果某个文件发生了变化,并不会立刻告诉监听者,而是先缓存起来,等aggregateTimeout后再执行。
    3. 方式
      1. 启动 webpack 命令时,带上 --watch 参数。
      2. 在配置 webpack.config.js 中设置 watch:true。
    4. 缺点
      1. 每次需要手动刷新浏览器。
         
  18. 什么是webpack热更新原理?

    1. webpack的热更新又称热替换(Hot Module Replacement),缩写为HMR。 这个机制可以做到不用刷新浏览器而将新变更的模块替换掉旧的模块。
    2. HMR的核心就是客户端从服务端拉去更新后的文件,准确的说是 chunk diff (chunk 需要更新的部分),实际上 WDS 与浏览器之间维护了一个Websocket,当本地资源发生变化时,WDS 会向浏览器推送更新,并带上构建时的 hash,让客户端与上一次资源进行对比。客户端对比出差异后会向 WDS 发起Ajax请求来获取更改内容(文件列表、hash),这样客户端就可以再借助这些信息继续向 WDS 发起jsonp请求获取该chunk的增量更新。 
  19. 如何对bundle体积进行监控和分析?

    1. VSCode中有一个插件Import Cost可以帮助我们对引入模块的大小进行实时监测,还可以使用webpack-bundle-analyzer生成bundle的模块组成图,显示所占体积。
    2. bundlesize工具包可以进行自动化资源体积监控。 
  20. Bable原理是什么?

    1. 大多数JavaScript Parser遵循estree规范,Babel 最初基于acorn项目(轻量级现代 JavaScript 解析器) Babel大概分为三大部分:
    2. 转换
      1. 访问 AST 的节点进行变换操作生产新的 AST。
        1. 词法分析:将代码(字符串)分割为token流,即语法单元成的数组。
        2. 语法分析:分析token流(上面生成的数组)并生成 AST。        
    3. 生成
      1. 以新的 AST 为基础生成代码。Taro就是利用 babel 完成的小程序语法转换。
    4.  解析
      1. 将代码转换成 AST。
         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLaMA 3:大模型之战的新序幕

作者 | 符尧 OneFlow编译 翻译|杨婷、宛子琳、张雪聃 本文要点概览: 文本数据的扩展可能已经达到了极限,因为易于获取的网络文本资源(如Common Crawl、GitHub、ArXiv等)已基本被充分利用。 尽管如此,通过更…

数据结构 - C/C++ - 数组

目录 结构特性 内存布局 结构样式 结构拓展 数据初始 元素访问 插入元素 删除元素 查找元素 修改元素 结构设计 成员变量 构造函数 功能函数 示例代码 结构特性 长度固定:数组的长度在创建时已经被确定,如果需要动态改变数组的长度&#…

C++面向对象程序设计 - 多继承,以及基类与派生类转换

单继承是一个类是从另一个基类派生类而来的,多继承则是一个派生类是同两个或多个基类,派生类从两人或多个基类中继承所需的属性。 声明多重继承的方法: class D: public A, private B, protected C { 类D新增加的成员 } 一、多重继承派生类的…

Vue---组件

Vue—组件 目录 Vue---组件定义组件全局组件局部组件 组件通讯***重点***父子通信之父传子(props)父子通信之子传父($emit)ref属性($refs) 动态组件插槽命名插槽 定义组件 全局组件 vue2中template只能传…

浏览器渲染机制:重排(Reflow)与重绘(Repaint)以及Vue优化策略

浏览器渲染机制是一个复杂但有序的过程,其目的是将HTML、CSS和JavaScript代码转化为用户可以看到和交互的视觉界面。重排(Reflow)与重绘(Repaint)是浏览器渲染过程中对页面元素进行更新的两个重要步骤,理解…

ubuntu22.04安装TensorRT(过程记录)

重要说明:此贴经过多次修改。第一次安装的的为trt8.6.1版本。第二次安装的10.0.0.6版本。有些地方可能没改过来,比如链接向导,我懒得改了,但是流程是对的。 cuda和cudnn版本对应关系 tensorRT历史发行版本 CUDA历史发行版本 cudn…

ENVI不同版本个人使用对比

ENVI不同版本个人使用对比 文章目录 ENVI不同版本个人使用对比前言对比5.3学习版5.6学习版6.0试用版 总结 前言 目前来看,流传较广的可供大家免费获取的ENVI版本主要是5.3学习版 5.6学习版 6.0学习版这三个版本,不同的版本有不同特色,在此做…

C#基础|StringBuilder字符串如何高效处理。

哈喽,你好,我是雷工。 字符串处理在C#程序开发中是使用频率比较高的,但常规的字符串处理方式对内存占用比较多,为了优化内存,减少不必要的内存浪费,引入了StringBuilder类。 下面学习下StringBuilder类的使…

PC-3000 Flash:NAND 闪存设备(包括一体式U盘)数据恢复的重量级工具(一)

天津鸿萌科贸发展有限公司从事数据安全业务20余年,在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时,公司面向取证机构及数据恢复公司,提供数据恢复实验室建设方案,包含 PC-3000 系列数…

LeetCode 热题 100 Day05

矩阵相关题型 Leetcode 73. 矩阵置零【中等】 题意理解: 将矩阵中0所在位置,行|列置换为全0 其中可以通过记录0元素所在的行、列号,来标记要置换的行|列 将对应位置置换为0 解题思路: 第一个思路: 可以…

React | classnames

classnames 这个库在我们的项目中有大量的使用到,它不仅很实用,还非常好用,但还有人不知道这个库,我真的是十分心痛。 通过 classnames,我们可以给组件设置多个 className,还可以根据需要动态设置 classNa…

模块四:前缀和——DP35 【模板】二维前缀和

文章目录 题目描述算法原理解法一:暴力模拟(时间复杂度为O(n*m*q))解法二:二维前缀和(时间复杂度为O(m*n)O(q)) 代码实现解法二:前缀和(C)Java 题目描述 题目链接:DP35 【模板】二维…

三星电脑文件夹误删了怎么办?恢复方案在此

在使用三星电脑的过程中,我们可能会不小心删除了某个重要的文件夹,其中可能包含了工作文件、家庭照片、视频或其他珍贵的数据。面对这种突发情况,不必过于焦虑。本文将为您提供几种有效的恢复方案,希望能帮助您找回误删的文件夹及…

openEuler-22.03安装 mysql8.0.32

一、下载解压 下载地址: MySQL :: Download MySQL Community Server (Archived Versions) tar -xvf mysql-8.0.32-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql-8.0.32 二、安装 最开始安装一直报错 缺少 libcrypto.so.10库文件,安装openssl可以解决 wget http://…

Java客户端如何直接调用es的API

Java客户端如何直接调用es的API 一. 问题二. withJson 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 问题 今天做项目的时候,想要直接通过java客户端调用es的api…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代,数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中,数据作为一种客观存在的资源,所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

【万字长文】看完这篇yolov4详解,那算是真会了

前言 目标检测作为计算机视觉领域的一个核心任务,其目的是识别出图像中所有感兴趣的目标,并给出它们的类别和位置。YOLO(You Only Look Once)系列模型因其检测速度快、性能优异而成为该领域的明星。随着YOLOv4的推出,…

双塔模型在召回和粗排的区别

答案参考:推荐系统中,双塔模型用于粗排和用于召回的区别有哪些? - 知乎 召回和粗排在不同阶段面临样本不一样,对双塔来说样本分布差异会使召回和粗排采取不一样的方式。召回打分空间是全部item空间,曝光只有很少一部分&#xff0…

【机器学习】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林(RF) 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

ClickHouse 如何实现数据一致性

文章目录 ReplacingMegreTree 引擎数据一致性实现方式1.ReplacingMegreTree 引擎2.ReplacingMegreTree 引擎 手动合并3.ReplacingMegreTree 引擎 FINAL 查询4.ReplacingMegreTree 引擎 标记 GroupBy5.允许偏差 前言:在大数据中,基本上所有组件都要求…