公司面试题总结(六)

31.说一说 webpack 的构建流程是什么?

初始化流程:

从配置文件和 Shell 语句中读取与合并参数
初始化需要使用的插件和配置插件等执行环境所需要的参数

编译构建流程:

从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容
再找到该 Module 依赖的 Module,递归地进行编译处理

输出流程:

对编译后的 Module 组合成 Chunk,
把 Chunk 转换成文件,输出到文件系统

32.如何优化 webpack 打包速度

并行编译:

thread-loader: 利用多个 CPU 内核并行运行加载器。
HappyPack : 将模块转换任务分解到多个 worker 进程中并行处理。

代码拆分

splitChunksPlugin 代码分割,将公共代码、第三方库等抽离到单独的 chunk,减
少重复编译的工作量。

动态导入(import())

根据路由或其他条件按需加载代码,避免一次性打包所有代码。

Tree Shaking:

确保你的 ES 模块使用的是静态导入导出, Tree Shaking 移除未使用的代码。

DllPlugin/DllReferencePlugin:

不经常变动的依赖(如 React, Vue 库)提前打包成 DLL(动态链接库) ,避免每次
构建都重新打包这些库。

减少 Loader 和 Plugin 的数量

只使用必要的 loader 和 plugin,每个额外的处理都会增加构建时间。

提升 Loader 性能:

Babel 等慢速 loader,使用针对性的配置优化,比如@babel/preset-env 的
useBuiltIns 和 targets 选项,减少不必要的 polyfill。

Excluding node_modules:

不需要转译的 node_modules 模块,可以在.babelrc 或 webpack 配置中排除它们。

Cache:

利用 Webpack 的持久化缓存特性,如 cacheDirectory 选项,或使用 hard-source
webpack-plugin 等第三方插件来缓存编译结果。

优化 Resolving 配置:

减少模块解析的搜索范围,通过 resolve.modules, resolve.alias 等配置项提高模块 查找速度。

Source Map 优化:

开发环境使用 cheap-module-eval-source-map 或更快的 source-map 选项,生产
环境考虑是否需要 source map 或使用更简洁的格式。

升级 Webpack 和其他依赖

保持 Webpack 及其相关 loader、plugin 的版本是最新的,新版本往往带来性能改
进。

分析和监控:

使用 webpack-bundle-analyzer 分析包大小,找出可以进一步优化的地方。

33.说说 webpack 中常见的 Loader?解决了什么问题?

loader 对模块的"源代码"进行转换,
在 import 或"加载"模块时预处理文件
webpack 分析各种模块依赖关系,然后形成资源列表,最终打包生成到指定的文件中。
babel-loader :用 babel 来转换 ES6 文件到 ES5
html-minify-loader: 压缩 HTML
style-loader: 将 css 添加到 DOM 的内联样式标签 style 里
css-loader : 允许将 css 文件通过 require 的方式引入,并返回 css 代码
less-loader: 处理 less css
sass-loader: 处理 sass css
postcss-loader: 用 postcss 来处理 CSS
autoprefixer-loader: 处理 CSS3 属性前缀,已被弃用,建议直接使用 postcss
file-loader: 分发文件到 output 目录并返回相对路径
url-loader: 和 file-loader 类似,但是当文件小于设定的 limit 时可以返回一个 Data Url

34.说说 webpack 中常见的 Plugin?解决了什么问题?

Plugin(Plug-in)是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功
是一种遵循一定规范的应用程序接口编写出来的程序,只能运行在程序规定的系统下,
因为其需要调用原纯净系统提供的函数库或者数据
webpack 中的 plugin 也是如此,plugin 赋予其各种灵活的功能,例如打包优化、资源
管理、环境变量注入等,它们会运行在 webpack 的不同阶段(钩子 / 生命周期),贯穿
了 webpack 整个编译周期
HtmlWebpackPlugin
        ◼ 在打包结束后,自动生成一个 html 文文件,
        ◼ 并把打包生成的 js 模块引入到该 html 中
clean-webpack-plugin 删除(清理)构建目录
mini-css-extract-plugin 提取 CSS 到一个单独的文件中
DefinePlugin 允许在编译时创建配置的全局对象,是一个 webpack 内置的插件,不需
要安装
copy-webpack-plugin
        ◼ 复制文件或目录到执行区域,
        ◼ 如 vue 的打包过程中,如果我们将一些文件放到 public 的目录下,那么这个目录
                会被复制到 dist 文件夹中

35.请详细说说 webpack 中的 plugin 和 loader 之间的区别是什么?

loader

是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩
等,最终一起打包到指定的文件中

plugin

赋予了 webpack 各种灵活的功能,例如打包优化、资源管理、环境变量注入等,目的是解决 loader 无法实现的其他事

 

36.说说你对 promise 的了解

Promise 承诺 ,异步编程的一种解决方案,比传统解决方案(回调函数)更合理和更加强大
回调函数 形成了经典的回调地狱

promise 解决异步操作的优点:

链式操作减低了编码难度
代码可读性明显增强
状态

promise 对象仅有三种状态

pending(进行中)
fulfilled(已成功)
rejected(已失败)
对象的状态不受外界影响,只有异步操作的结果,可以决定当前状态

用法

Promise 对象是一个构造函数,用来生成 Promise 实例
const promise = new Promise(function(resolve, reject) {});
Promise 构造函数接受一个函数作为参数,函数的两个参数分别是 resolve 和 reject
resolve 函数: 将 Promise 对象的状态从“未完成”变为“成功”
reject 函数: 将 Promise 对象的状态从“未完成”变为“失败”

实例方法 then() catch() finally()

then()
实例状态发生改变时的回调函数
第一个参数是 resolved 状态的回调函数,
第二个参数是 rejected 状态的回调函数
then 方法返回的是一个新的 Promise 实例,也就是 promise 能链式书写的原因
catch()
.then(null, rejection)或.then(undefined, rejection) 的别名,
用于指定发生错误时的回调函数
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
一般来说,使用 catch 方法代替 then()第二个参数
finally()
用于指定不管 Promise 对象最后状态如何,都会执行的操作

构造函数方法 all() race() allSettled() resolve() reject()

all()
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.all([p1, p2, p3]);
接受一个数组作为参数,数组成员都为 Promise 实例
实例 p 的状态由 p1、p2、p3 决定,分为两种: 只有 p1、p2、p3 的状态都变成 fulfilled,p 的状态才会变成 fulfilled,此时 p1、
p2、p3 的返回值组成一个数组,传递给 p 的回调函数
只要 p1、p2、p3 之中有一个被 rejected,p 的状态就变成 rejected,此时第
一个被 reject 的实例的返回值,会传递给 p 的回调函数
注意,如果作为参数的 Promise 实例,自己定义了 catch 方法,那么它一旦被
rejected,并不会触发 Promise.all()的 catch 方法
race()
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.race([p1, p2, p3]);
只要 p1、p2、p3 之中有一个实例率先改变状态,p 的状态就跟着改变
率先改变的 Promise 实例的返回值则传递给 p 的回调函数
allSettled()
Promise.allSettled()方法接受一组 Promise 实例作参数,包装一个新 Promise 实例
只有等到所有这些参数实例都返回结果,不管是 fulfilled 还是 rejected,包装实例
才会结束
const promises = [
fetch('/api-1'),
fetch('/api-2'),
fetch('/api-3'),
];
await Promise.allSettled(promises);
removeLoadingIndicator();
resolve()
将现有对象转为 Promise 对象
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
参数可以分成四种情况:
参数是一个 Promise 实例,promise.resolve 将不做任何修改、原封不动地返
回这个实例
参数是一个thenable对象,promise.resolve会将这个对象转为 Promise对象,
然后就立即执行 thenable 对象的 then()方法
参数不是具有 then()方法的对象,或根本就不是对象,Promise.resolve()会返
回一个新的 Promise 对象,状态为 resolved
没有参数时,直接返回一个 resolved 状态的 Promise 对象
reject()
Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为
rejected
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

使用场景

将图片的加载写成一个 Promise,一旦加载完成,Promise 的状态就发生变化 通过链式操作,将多个渲染数据分别给个 then,让其各司其职。或当下个异步请求依
赖上个请求结果的时候,我们也能够通过链式操作友好解决问题
通过 all()实现多个请求合并在一起,汇总所有请求结果,只需设置一个 loading 即可
通过 race 可以设置图片请求超时

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

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

相关文章

MySQL数据库初识

目录 一.数据库相关概述 1.数据库概念 数据(Data) 表 数据库系统 2.数据库系统发展史 当今主流数据库介绍 3.数据库分类 3.1.关系数据库 3.2.非关系型数据库 二.MySQL数据库安装 1.源码编译安装mysql 2.yum安装mysql 一.数据库相关概述 1.…

Clearedge3d EdgeWise 5.8 强大的自动化建模软件

EdgeWise是功能强大的建模软件,提供领先的建模功能和先进的技术,让您的整个过程更快更准确!您可以获得使用自动特征提取和对象识别的 3D 建模,ClearEdge3D 自动建模和对象识别软件通过创建竣工文档和施工验证完成该过程。拓普康和…

Ajax的应用

1. Ajax Ajax是Asynchronous Javascript And XML(异步JavaScript和XML)的缩写。 Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换,在页面不刷新的情况下,实现页面的局部更新。 重点: Ajax 是一种在无需重新加…

气膜结构的使用寿命及其优势—轻空间

气膜结构以其独特的构造方式和显著的优势,在体育馆、展览馆、临时建筑等领域越来越受欢迎。尽管气膜结构的使用寿命与传统钢结构相比可能较短,但其在成本、建造速度、灵活性等方面的优势使其成为许多应用场景中的理想选择。本文将详细探讨气膜结构的使用…

如何基于Excel文件图形化从零建表并导入数据(以MySQL和SQLynx为例)

目录 1. 准备Excel数据 2. 导入Excel数据 a. 登录SQLynx b. 导入Excel文件 3. 验证数据 4. 使用和管理表 5. 总结 在实际的业务过程中,我们经常会有很多数据存储在Excel中,但在Excel中的数据分析不如使用SQL和数据库方便,数据量大些的…

location.href = ‘welcome.html‘;报错 - Completed 406 NOT_ACCEPTABLE

巧妙解决方案,使用服务端进行redirect即可 。 package com.aliyun.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping;Controller public class RedirectController {GetMapping("/r…

盲盒App开发时有哪些技术框架可以借鉴

在开发盲盒App时,技术框架的选择对于应用的性能、稳定性和用户体验都至关重要。以下是几个可以借鉴的技术框架,它们在不同方面提供了优势,并且结合了参考文章中的相关信息: 前端技术框架 微信小程序框架: 优点&#…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中,我们将彻底查看它是否真的是 WordPress 最佳内部链接插件!我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件,你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…

加速“芯”动力 | 2024集成电路测试工程师研修班(苏州场)报名通知

6月19日—20日,加速“芯”动力——2024集成电路测试工程师研修班正式开课。本次培训课程内容包括芯片设计测试技术分享、解决方案分享、ATE编程接口介绍、ATE向量微指令、ATE量产界面介绍、测试开发基础培训、程序开发实训等内容,感兴趣的小伙伴&#xf…

建议收藏!亚马逊卖家必须知道的37个常用术语解释

运营亚马逊,经常会看到很多个专业术语,想必大部分新手卖家都比较陌生,熟悉这些常用术语的含义有助于你更好地运营亚马逊。下面为各位整理了37个在亚马逊跨境电商中常见的术语及其解释,建议收藏! 1、SKU Stock Keeping…

Go基础编程 - 05 - 数组与切片

目录 1. 数组2. 切片2.1. slice 声明、初始化2.2. slice 操作2.3. append() 追加切片、扩容2.4. 字符串和切片 3. Copy4. Array、Slice 内存布局 上一篇:基本类型、常量和变量 下一篇:指针 1. 数组 数组是同一种类型固定长度的序列(有长度、…

工业 web4.0 的 UI 风格,独树一帜

工业 web4.0 的 UI 风格,独树一帜

[深度学习]基于C++和onnxruntime部署yolov10的onnx模型

基于C和ONNX Runtime部署YOLOv10的ONNX模型,可以遵循以下步骤: 准备环境:首先,确保已经下载后指定版本opencv和onnruntime的C库。 模型转换:按照官方源码:https://github.com/THU-MIG/yolov10 安装好yolov…

【计算机网络】TCP报文详解

认识TCP报头 其实协议的形式都是一个结构化的数据,TCP协议也不例外。一起来看看TCP协议的报头是怎么样的。 以上就是TCP报头,实际上是一个结构化的数据,也就是一个结构体。例如: struct tcp_hdr {unsigned int stc_port : 16;un…

光储充一体化,开启绿色出行新篇章

一、追光逐梦,绿色能源点亮未来 在蔚蓝的天空下,光伏发电板如同一片片金色的叶子,静静地捕捉着太阳的光芒。它们不仅为大地带来光明,更是绿色出行的强大后盾。光储充一体化充电站,以光伏为源,储能为桥&…

Kubernetes集群部署Prometheus和Grafana

目录 一、部署Node-Exporter 二、Prometheus安装和配置 1.创建账号并予以授权 2.创建存储卷存储Prometheus配置信息 3.通过Deployment方式部署Prometheus 4.创建Service 三、Prometheus配置热加载 四、Grafana安装 五、K8s部署Kube-State-Metrics 1.创建Kube-State-M…

C#开发-集合使用和技巧(一)常用集合和方法介绍

C#开发-集合使用和技巧 &#xff08;一&#xff09;常用集合和方法介绍常用集合和方法介绍 C#开发-集合使用和技巧1. 集合基础集合介绍集合跟数组对比 2.我们常用的集合类型列表List<T>键值对集合Dictionary<TKey,TValue>队列Queue<T>其他一些集合类型堆栈St…

架构设计 - MySQL 插入数据性能优化策略

mysql 数据库提高数据插入效率主要可以考虑以下方面&#xff1a; 使用批量插入数据的 SQL 语句&#xff0c;避免使用 for 循环逐条记录插入。 所有插入语句共用一个事务&#xff0c;避免1条SQL语句开1个事务&#xff0c;所有操作都完成后再提交事务。 尽量按照索引递增顺序插入…

Apache Doris单机快速安装(已踩坑)

官方文档&#xff1a;https://doris.incubator.apache.org/zh-CN/docs/get-starting/quick-start/ 环境&#xff1a; 操作系统&#xff1a;CentOS7.6 X86_64 JDK&#xff1a;Oracle jdk1.8.0_351 1.版本下载 从 doris.apache.org 下载相应的 Doris 安装包&#xff0c;并且解压…

Springboot防疫知识科普系统-计算机毕业设计源码03531

摘 要 如今计算机行业的发展极为快速&#xff0c;搭载于计算机软件运行的数据库管理系统在各行各业得到了广泛的运用&#xff0c;其在数据管理方面具有的准确性和高效性为大中小企业的日常运营提供了巨大的帮助。自从2020年新冠疫情爆发以来&#xff0c;防疫成了社会关注的重中…