公司面试题总结(六)

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.tpcf.cn/web/26944.html

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

相关文章

MySQL数据库初识

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

NoC进阶

从实践角度,第一步看节点,节点个数,ports数,延迟要求等,初步选择拓扑结构; 再认真分析traffic, 从哪到哪,哪里更多,哪里更近,看看有没有带宽瓶颈; 最后调整路由算法或者拓扑结构。 NoC就像是路网。 设计拓扑结构应该是网络设计的第一步。 后面是路由算法 拓扑结…

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

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

canvas记录1:canvasPutImageData

对于GCanvas(一个跨平台的2D图形渲染引擎)中的canvasPutImageData(或更常见的putImageData方法,因为GCanvas通常遵循Canvas API的标准),其使用方式与HTML5 Canvas API中的putImageData方法非常相似。以下是…

python+selenium做ui自动化测试用法必会

一、前言   大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium Selenium是用于测试Web应用程序用户界面(UI)的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多…

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和数据库方便,数据量大些的…

C++ //练习 14.14 你觉得为什么调用operator+=来定义operator+比其他方法更有效?

C Primer(第5版) 练习 14.14 练习 14.14 你觉得为什么调用operator来定义operator比其他方法更有效? 环境:Linux Ubuntu(云服务器) 工具:vim 解释 使用更简洁,因为结果直接会累计…

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

PostgreSQL ,OVER 子句妙用

在 PostgreSQL 中,OVER 子句是窗口函数定义的一部分,用于指定窗口函数的窗口范围。窗口函数允许你对一组行执行计算,这些行构成了一个结果集中的窗口。OVER 子句定义了这个窗口的开始和结束行。 以下是 OVER 子句的一些关键点: 默…

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

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

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

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

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

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

PaddleDetection安装文档

PaddlePaddle/PaddleDetection 配置环境 安装paddlepaddle conda create -n py39_paddledet python3.9conda activate py39_paddledetpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html验证是否安装成…

gnss变形监测基础(一)

文章目录 一、GNSS(Global Navigation Satellite System)二、GNSS传感器三、GNSS变形监测 一、GNSS(Global Navigation Satellite System) GNSS是全球导航卫星系统(Global Navigation Satellite System)的…

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…