前端工程化面试题(一)
如何使用 Docker 部署前端项目?
使用 Docker 部署前端项目通常涉及以下几个步骤:
-
创建项目:首先,需要在本地创建并配置好前端项目。
-
准备 Docker 文件:
- .dockerignore:这个文件用于排除不需要上传到 Docker 服务端的文件或目录。
- Dockerfile:这是 Docker 的核心文件,用于构建 Docker 容器镜像。通常,Dockerfile 会包含基础镜像、工作目录设置、依赖安装、项目构建等指令。
- nginx.conf(可选):如果项目需要服务器来托管,可以准备一个 nginx 配置文件来配置服务器。
-
构建 Docker 镜像:在项目的根目录下,使用
docker build
命令来构建 Docker 镜像。例如:docker build -t my-frontend-app .
。这里的-t
或--tag
用于给构建的镜像添加一个或多个标签。 -
创建并运行 Docker 容器:使用
docker run
命令来创建并运行 Docker 容器。例如:docker run -itd -p 8080:80 --name my-frontend-container my-frontend-app
。这里的-i
、-t
、-d
分别表示交互模式、分配一个终端、在后台运行容器,-p
用于映射端口。 -
访问应用:在浏览器中输入容器的映射地址(如
http://localhost:8080
),即可访问部署在 Docker 容器中的前端项目。
什么是 npm cache?如何有效管理它?
npm cache 是 npm(Node Package Manager)的缓存机制,它用于保存已下载的包,以便在将来的安装中可以快速访问。这可以显著减少安装时间,特别是在慢速网络或离线环境中。
有效管理 npm cache 的方法包括:
- 清理缓存:使用
npm cache clean
命令可以清理整个 npm 缓存。如果需要清理特定包的缓存,可以使用npm cache clean <package-name> --force
。 - 查看缓存:使用
npm cache ls
命令可以列出缓存中的所有包。也可以查看特定包的缓存信息。 - 修复缓存:如果遇到与缓存相关的问题,可以尝试清理缓存来修复。
- 配置缓存:可以通过
.npmrc
文件配置缓存的存储路径和大小限制等。
如何通过 npm 发布前端 package?发布流程是怎样的?
通过 npm 发布前端 package 的流程通常包括以下几个步骤:
-
注册 npm 账号:在 npm 官网 注册一个账号。
-
准备 package:
- 创建一个新的项目文件夹,并使用
npm init
命令初始化一个新的 npm 包。 - 编写项目代码和
README.md
文件,详细描述 package 的信息和使用方法。 - 准备
package.json
文件,确保其中的name
、version
、description
、main
、keywords
、author
和license
等字段都已正确填写。
- 创建一个新的项目文件夹,并使用
-
登录 npm:在命令行中使用
npm login
命令登录 npm 账号。 -
发布 package:在项目根目录下,使用
npm publish
命令发布 package。如果发布成功,你会看到命令行提示 package 已经成功发布。
export、export default 和 module.exports 有什么区别?
- export:是 ES6 模块系统的核心部分,用于从文件中导出函数、关键字、对象或值,使其可以在其他文件中通过 import 语句导入和使用。它支持命名导出和默认导出。
- export default:用于导出模块的默认值。每个模块只能有一个默认导出。导入时,可以使用任意名称来接收这个默认导出。
- module.exports:是 CommonJS 模块系统的一部分,在 Node.js 环境中使用。它用于导出模块,但这不是 ES6 标准的一部分。与 export 不同,module.exports 只能导出一个对象或函数作为模块的接口。
在 window 对象中,模块间依赖关系由文件加载顺序决定,这种模块组织方式有哪些缺点?
在 window 对象中,如果模块间的依赖关系由文件加载顺序决定,那么这种模块组织方式可能会带来以下缺点:
- 依赖关系不明确:由于依赖关系隐藏在文件加载顺序中,因此很难直观地看出模块之间的依赖关系。
- 难以维护:随着项目的增长,文件数量和依赖关系会变得越来越复杂,维护起来也会更加困难。
- 容易出错:如果文件加载顺序发生变化,或者某个模块被遗漏或重复加载,都可能导致项目出错。
什么是前端工程化?它有什么意义?
前端工程化是指将前端开发纳入软件工程范畴,采用系统化、规范化的方法来进行前端项目的开发、测试、部署和维护。它的意义在于:
- 提高开发效率:通过工程化的方法,可以自动化地构建、测试和部署前端项目,从而大大提高开发效率。
- 保证代码质量:通过代码审查、单元测试、集成测试等手段,可以保证代码的质量和稳定性。
- 便于团队协作:工程化的方法使得前端项目更加模块化、组件化,便于团队成员之间的协作和分工。
- 降低维护成本:通过合理的项目结构和清晰的依赖关系,可以降低项目的维护成本。
什么是 ESLint?它有什么作用?
ESLint 是一个静态代码检查工具,用于识别和报告 JavaScript 代码中的模式。它的主要作用包括:
- 代码质量检查:通过配置规则集,ESLint 可以检查代码中的潜在问题,如未声明的变量、未使用的变量、语法错误等。
- 代码风格统一:ESLint 可以强制团队成员遵循一致的代码风格,从而提高代码的可读性和可维护性。
- 自动化修复:对于一些简单的错误或不符合规则的地方,ESLint 可以提供自动化修复的建议或工具。
如何在 Webpack 中切换开发环境和生产环境?
在 Webpack 中,可以通过配置不同的环境变量来切换开发环境和生产环境。通常,这涉及到以下几个步骤:
- 定义环境变量:在
package.json
的scripts
部分,可以为不同的环境定义不同的脚本命令。例如,可以使用cross-env
工具来设置环境变量:"build": "cross-env NODE_ENV=production webpack --config webpack.config.js"
和"start": "cross-env NODE_ENV=development webpack serve --config webpack.config.js"
。 - 读取环境变量:在 Webpack 配置文件中,可以使用
process.env.NODE_ENV
来读取当前的环境变量。 - 配置不同的插件和加载器:根据环境变量的值,可以配置不同的插件和加载器。例如,在生产环境中,可以启用代码压缩、优化等插件;在开发环境中,可以启用热更新、source map 等插件。
Webpack 的 Tree shaking 机制的原理是什么?
Webpack 的 Tree shaking 机制是一种优化技术,用于在构建过程中移除 JavaScript 中未使用的代码。它的原理主要基于 ES6 的模块系统(即 import/export)和静态分析。
在构建过程中,Webpack 会分析模块的依赖关系,并确定哪些代码是实际被使用的,哪些代码是未使用的。然后,它会移除那些未使用的代码,从而减小打包后的文件体积。
需要注意的是,Tree shaking 只能在 ES6 模块系统中有效工作,因为 CommonJS 模块系统是动态加载的,无法进行静态分析。
如何使用 Webpack 实现异步加载?
在 Webpack 中,可以使用动态 import 语法来实现异步加载。动态 import 返回一个 Promise 对象,该对象在解析模块时完成。
例如,可以使用以下代码来异步加载一个模块:
import(/* webpackChunkName: "myModule" */ './myModule').then(module => {// 使用加载的模块module.default();
}).catch(error => {// 处理加载错误console.error('Error loading module:', error);
});
这里的 /* webpackChunkName: "myModule" */
是一个注释,用于指定生成的 chunk 的名称。Webpack 会将这个模块打包成一个单独的 chunk 文件,并在需要时异步加载它。
使用 html-webpack-plugin 时找不到指定的 template 文件怎么办?
在使用 html-webpack-plugin 时,如果找不到指定的 template 文件,可以尝试以下几个解决方法:
- 检查文件路径:确保 template 文件的路径是正确的。如果路径中包含相对路径或特殊字符,请确保它们被正确处理。
- 检查文件名和扩展名:确保文件名和扩展名与在 html-webpack-plugin 配置中指定的名称相匹配。
- 清理缓存:有时候,Webpack 的缓存可能会导致问题。可以尝试清理缓存后重新构建项目。
- 检查 Webpack 配置:确保 html-webpack-plugin 的配置是正确的。特别是
template
选项,它应该指向一个有效的模板文件路径。
npm workspaces 解决了什么问题?
npm workspaces 是 npm 7 引入的一个功能,它解决了在大型项目中管理多个相关包时的依赖和版本冲突问题。通过使用 npm workspaces,可以在一个单一的仓库中管理多个 npm 包,并共享相同的依赖关系。
具体来说,npm workspaces 允许你定义一个包含多个子包的仓库,并在根目录下使用一个 package.json
文件来管理所有子包的依赖关系。这样,当你安装依赖时,npm 会根据每个子包的需要来安装相应的依赖版本,并避免在不同子包之间引入冲突的依赖版本。
以下是针对您所提出问题的详细回答:
前端 http client 中如何得知已接收完所有响应数据?
在前端 HTTP client 中,通常通过以下几种方式得知已接收完所有响应数据:
- 事件监听:使用如 XMLHttpRequest 或 Fetch API 时,可以监听相关的事件来判断数据是否接收完毕。例如,在使用 XMLHttpRequest 时,可以监听
onreadystatechange
事件,当readyState
变为 4(表示请求已完成且响应已就绪)时,即可认为已接收完所有响应数据。在使用 Fetch API 时,可以通过response.json()
或response.text()
等方法将响应体转换为 JSON 或文本,并在转换完成的 Promise 中处理数据。 - 状态码检查:在接收到响应后,还需要检查 HTTP 状态码以确保请求成功。通常,状态码在 200~299 范围内表示请求成功。
semver 规范中,~1.2.3 与^1.2.3 的版本号范围分别是什么?
在 SemVer(Semantic Versioning)规范中,~1.2.3
和 ^1.2.3
分别表示不同的版本号范围:
~1.2.3
:表示允许补丁级别的更新,即允许升级到1.2.x
中的任何版本,但不允许升级到1.3.0
或更高版本。^1.2.3
:表示允许兼容的更新,即允许升级到1.x.x
中的任何版本,但不允许升级到2.0.0
或更高版本。不过,如果主版本号为 0(例如0.2.3
),则^0.2.3
允许升级到任何0.x.x
版本,因为主版本号为 0 时通常表示软件处于开发阶段,可能会有不兼容的更改。
core-js 是什么?有什么作用?
Core-js 是一个广泛使用的 JavaScript 标准库的 polyfill,它为旧版浏览器或环境提供了新标准的实现。其主要作用包括:
- 提供新特性:为不支持新 JavaScript 特性的旧浏览器或环境提供这些特性的实现。
- 提高兼容性:通过为旧环境提供新特性的 polyfill,使开发者能够使用最新的 JavaScript 特性而无需担心兼容性问题。
package-lock.json 与 yarn.lock 有什么区别?
package-lock.json
和 yarn.lock
都是用于记录项目依赖及其版本的文件,但它们分别由 npm 和 Yarn 包管理器生成,具有以下区别:
- 生成方式:
package-lock.json
是 npm 在安装依赖时自动生成的,而yarn.lock
是 Yarn 在安装依赖时生成的。 - 结构差异:两者在文件结构和内容上有所不同,但都是为了确保项目依赖的版本一致性。
- 兼容性:
package-lock.json
仅与 npm 兼容,而yarn.lock
仅与 Yarn 兼容。使用 npm 时应使用package-lock.json
,使用 Yarn 时应使用yarn.lock
。
Webpack 和 Vite 构建工具有什么区别?各自的优缺点是什么?
Webpack 和 Vite 都是前端构建工具,但它们具有不同的特点和优缺点:
-
Webpack:
- 优点:功能强大,插件丰富,支持复杂的项目结构和依赖关系。
- 缺点:配置相对复杂,学习曲线较陡,热更新(HMR)性能可能不如 Vite。
-
Vite:
- 优点:开发体验快,支持即时热更新(HMR),配置简单且默认配置合理。
- 缺点:相对于 Webpack,生态系统和插件数量可能较少,对复杂项目的支持可能不如 Webpack 完善。
什么是前端的 SWC 和 Esbuild?它们有什么作用?
-
SWC:通常指的是一个用于编译和转换 JavaScript 和 TypeScript 代码的工具链,它可能是一个特定项目或工具的一部分,但在前端开发中并不是一个广泛认知的标准工具。关于其具体作用和详细信息,可能需要根据具体项目或工具链进行了解。
-
Esbuild:是一个极快的 JavaScript 打包器和压缩器,它使用 Go 语言编写,具有出色的性能和构建速度。Esbuild 的主要作用包括:
- 快速打包:将多个 JavaScript 和 CSS 文件打包成一个或多个文件,以优化加载和性能。
- 代码压缩:对打包后的代码进行压缩,以减少文件大小并提高加载速度。
- 支持现代 JavaScript 特性:支持最新的 JavaScript 特性,包括模块、类和异步函数等。
Webpack 的核心原理是什么?
Webpack 的核心原理包括以下几个方面:
- 入口:Webpack 从配置的入口文件开始构建依赖图,递归地解析和构建所有依赖的模块。
- 模块:Webpack 将所有类型的文件(如 JavaScript、CSS、图片等)视为模块,并通过相应的 loader 进行处理。Loader 允许 Webpack 处理那些本身不能直接被 JavaScript 解释执行的文件(如 CSS、图片等),并将它们转换为有效的模块。
- 依赖图:Webpack 构建一个依赖图,该图描述了模块之间的依赖关系。每个模块都有一个唯一的标识符,并且模块之间的依赖关系通过标识符进行引用。
- 输出:Webpack 将构建后的模块打包成一个或多个文件,并根据配置将这些文件输出到指定的目录。
npm 执行命令时,为什么需要使用双横线传递参数?
npm 执行命令时,使用双横线(--
)传递参数的原因是为了明确区分 npm 命令本身的参数和传递给脚本或程序的参数。当 npm 脚本执行时,它会开启一个 shell 来执行指定的脚本命令或文件。双横线(--
)用于告诉 npm,后面的参数不是 npm 命令本身的参数,而是应该传递给 shell 脚本或程序的参数。这样做可以避免参数混淆和解析错误。例如,在 npm script 中有以下命令:{"start": "serve"}
,其中 serve
可通过 --port
指定端口号。使用 npm start -- --port 8080
命令时,-- --port 8080
部分会被传递给 serve
程序,而不是被 npm 解析为其自身的参数。
针对您提出的问题,以下是详细的回答:
Performance API 中哪些指标可以衡量首屏加载时间?
在 Performance API 中,可以通过分析 performance.timing
属性中的多个指标来衡量首屏加载时间。这些指标包括:
navigationStart
:表示前一页面卸载结束的时间或浏览器窗口的前一个网页关闭、unload 事件发生的时间戳。loadEventEnd
:标志着页面加载完成的时间戳。
通过计算 loadEventEnd
和 navigationStart
之间的差值,可以得到页面加载的总时间,这在某种程度上可以反映首屏加载时间。此外,redirectStart
、redirectEnd
、domainLookupStart
、domainLookupEnd
、responseStart
、domLoading
、domComplete
等指标也都在不同程度上影响首屏渲染时间。
如何组织 CSS 以配合 Webpack 构建?
要组织 CSS 以配合 Webpack 构建,可以按照以下步骤进行:
- 安装相关 loader:确保已经安装了 Webpack 和相关的 loader,如
css-loader
和style-loader
。 - 配置 Webpack:在 Webpack 配置文件中,添加对 CSS 文件的处理规则。通常,这涉及到在
module.rules
数组中添加规则,指定当遇到以.css
结尾的文件时,使用style-loader
和css-loader
进行处理。 - 使用 CSS 模块(可选):为了避免全局污染和类名冲突,可以使用 CSS 模块。这需要在
css-loader
的配置中添加modules: true
选项,并在 CSS 文件中使用 CSS 模块的语法。
Webpack 打包过程中,import 和 CommonJS 有什么区别?
在 Webpack 打包过程中,import
和 CommonJS(通常使用 require
)有以下区别:
- 语法差异:
import
是 ES6 引入的官方模块系统的一部分,支持静态导入和导出;而 CommonJS 是 Node.js 使用的模块系统,使用require
函数导入模块,通过module.exports
或exports
导出。 - 打包行为:Webpack 对
import
和require
的处理有所不同。import
语句支持静态分析,有利于代码优化,如摇树优化(Tree Shaking);而 CommonJS 模块在 Webpack 中通常会被原样输出,不进行静态分析。
当引入某个前端依赖项时,如何确定引入的具体文件?
当引入某个前端依赖项时,可以通过以下步骤确定引入的具体文件:
- 查看依赖项的文档:通常,依赖项的文档会提供有关如何引入和使用该依赖项的详细信息。
- 检查
package.json
:package.json
文件中列出了项目的所有依赖项及其版本。通过查看该文件,可以了解引入了哪些依赖项。 - 分析导入路径:在代码中查找以
import
或require
开头的语句,分析这些语句的导入路径,以确定引入了哪些具体文件。 - 查看
node_modules
:如果以上方法无法确定具体文件,可以直接查看node_modules
目录下的依赖项文件夹,以了解该依赖项包含哪些文件和子目录。
什么是服务器端渲染 (SSR)?
服务器端渲染(Server-Side Rendering,简称 SSR)是指在服务器上完成网页的渲染工作,然后将完整的 HTML 页面发送给客户端。客户端的浏览器接收到 HTML 页面后,直接进行展示,无需进行复杂的逻辑计算和渲染工作。SSR 的主要优点包括提高加载速度、提升 SEO 排名、支持离线浏览等。
前端项目中,如何优化首屏渲染时间?
在前端项目中,优化首屏渲染时间可以采取以下措施:
- 减少网络请求:通过合并和压缩文件、使用雪碧图或字体图标等技术,减少需要下载的资源数量和大小。
- 延迟加载非关键资源:将非关键资源(如图片、视频)延迟加载,只在用户需要时再进行加载。
- 使用浏览器缓存:设置适当的缓存策略,使得页面资源可以被浏览器缓存起来,减少重复的网络请求。
- 优化代码和文件大小:精简和压缩 HTML、CSS 和 JavaScript 文件,删除不必要的代码、注释和空格。
- 异步加载和执行:将 JavaScript 脚本放在页面底部或使用异步加载的方式,确保脚本不会阻塞页面的渲染。
- 使用 CDN 加速:将静态资源部署在内容分发网络(CDN)上,提高访问速度。
- 使用预渲染技术:通过预渲染技术提前生成首屏内容并存储为静态文件,当用户访问时直接返回。
Webpack 支持哪些脚本模块规范?
Webpack 支持多种脚本模块规范,包括:
- ES Modules (ESM):ECMAScript 2015(也称为 ES6)及其后续版本引入的官方模块系统。
- CommonJS:主要用于 Node.js,也被广泛应用于浏览器端代码的打包。
- Asynchronous Module Definition (AMD):专为浏览器端设计,支持异步加载模块。
- Universal Module Definition (UMD):旨在提供一个在 AMD 和 CommonJS 环境下都可运行的模块定义。
- SystemJS 模块:由 SystemJS 提出的格式,用于动态加载模块。
如何在前端项目中进行单元测试?
在前端项目中进行单元测试通常涉及以下步骤:
- 选择测试框架:如 Jest、Mocha、Jasmine 等。
- 编写测试用例:针对要测试的功能或模块编写测试用例。
- 配置测试环境:设置测试运行器和测试框架的配置。
- 运行测试:使用命令行工具运行测试,并查看测试结果。
- 修复和优化:根据测试结果修复代码中的错误,并优化测试用例。
Webpack 的热更新底层是如何实现的?它如何在不刷新浏览器的前提下更新页面?
Webpack 的热更新(Hot Module Replacement,简称 HMR)底层实现依赖于 WebSocket 或其他实时通信技术。当 Webpack 检测到文件变化时,它会重新构建受影响的模块,并通过 WebSocket 将更新后的模块发送到客户端。客户端接收到更新后的模块后,会使用这些模块替换掉旧的模块,从而实现页面内容的更新,而无需刷新浏览器。
Webpack 打包时 Hash 码是如何生成的?如何避免 Hash 码重复?
Webpack 打包时生成的 Hash 码通常是通过对文件内容进行哈希计算得到的。Webpack 使用一个哈希算法(如 MD5、SHA-1 等)对文件内容进行计算,生成一个唯一的 Hash 码。为了避免 Hash 码重复,可以采取以下措施:
- 确保文件内容唯一:在打包前确保每个文件的内容都是唯一的,避免相同内容的文件被重复打包。
- 使用内容哈希:Webpack 提供了内容哈希的选项(如
[contenthash]
),该选项会根据文件内容生成 Hash 码,从而确保每个文件都有唯一的 Hash 码。 - 配置输出文件名:在 Webpack 配置中设置输出文件名时,可以使用占位符(如
[name].[contenthash].js
)来生成包含 Hash 码的文件名。
npm 的 dependencies 与 devDependencies 有什么区别?
在 npm 中,dependencies
和 devDependencies
有以下区别:
- dependencies:包含项目运行时所需的依赖项。这些依赖项在项目部署到生产环境时也需要存在。
- devDependencies:包含项目开发过程中所需的依赖项。这些依赖项仅在开发过程中使用,如测试框架、构建工具等。在项目部署到生产环境时,这些依赖项通常不需要存在。
通过在 package.json
文件中分别列出 dependencies
和 devDependencies
,可以清晰地了解项目所需的依赖项及其用途。
Webpack 中的 bundle、chunk 和 module
-
module(模块):
- 定义:模块是 Webpack 中基本的构建块,它指的是一个单独的文件或者代码段。
- 作用:在 Webpack 中,每个模块都可以通过
require
/import
语句进行依赖引入和使用,是代码组织和重用的基础单元。
-
chunk(代码块):
- 定义:chunk 是指一个代码块,它是由多个模块组合而成的。
- 作用:当 Webpack 执行构建时,会根据入口文件和依赖关系生成多个 chunk。这有助于实现代码分割,提高应用的加载性能。
-
bundle(打包文件):
- 定义:bundle 是指最终生成的文件,它包含了所有的 chunk 和模块。
- 作用:在 Webpack 执行构建时,会把每个 chunk 打包成一个 bundle 文件。这个文件是可以在浏览器中直接运行的,包含了应用所需的所有代码和资源。
JavaScript 代码压缩(minify)的原理
JavaScript 代码压缩的原理主要是在不改变代码语义的情况下,重写代码以缩小代码量。这通常包括:
- 将长的变量名重命名为短的变量名。
- 删除永远不可能到达的分支(如
if(false)
)。 - 移除多余的空格、换行符和注释等。
通过这些手段,可以显著减小代码的体积,从而提高加载速度和执行效率。
前端优化 API 请求的方法
对于同一前端页面的 3 个组件请求同一个 API 并发送了 3 次请求的情况,可以通过以下方法进行优化:
- 代码分割与懒加载:将组件拆分为多个小的代码块,并在需要时按需加载,以减少初始加载的文件大小。
- 使用缓存:利用浏览器的缓存机制,对 API 请求的结果进行缓存,避免重复请求。
- 数据共享:在组件之间共享数据,避免每个组件都单独发起请求。可以使用状态管理工具(如 Redux)来实现数据共享。
- 合并请求:如果可能的话,将多个请求合并为一个请求,以减少网络开销。例如,可以使用 GraphQL 来实现这一点。
前端识别图片 MIME 类型的方法
前端可以通过以下方式正确识别图片的 MIME 类型:
- 文件扩展名:根据文件的扩展名(如
.jpg
、.png
)来猜测 MIME 类型。这种方法虽然简单,但不够准确。 - 文件头信息:读取文件的前几个字节(即文件头),根据文件头信息来确定 MIME 类型。这种方法更准确,但需要额外的处理。
- 使用库:可以使用一些现成的库(如
mime
)来识别文件的 MIME 类型。这些库通常会根据文件扩展名和文件头信息来确定 MIME 类型,并提供更方便的接口。
webpack-dev-server 的启动与运行
webpack-dev-server 是一个小型的 Express 服务器,它使用 webpack-dev-middleware 来为通过 webpack 打包的资源提供服务。它的启动与运行通常包括以下几个步骤:
- 安装依赖:首先,需要在项目中安装 webpack-dev-server 及其相关依赖。
- 配置 webpack:在 webpack 配置文件中,需要设置
devServer
选项来配置 webpack-dev-server 的行为。例如,可以设置端口号、代理规则等。 - 启动服务器:通过运行
webpack serve
命令(或在旧版本中运行webpack-dev-server
命令)来启动 webpack-dev-server。服务器启动后,会自动打开浏览器并访问设定的开发服务器地址。
自定义 Webpack Loader 或 Plugin 插件的编写
-
Loader:
- Loader 本质上是导出为函数的 JavaScript 模块。它们用于对模块的源代码进行转换。
- 编写自定义 Loader 时,需要实现一个函数,该函数接收源代码作为输入,并返回转换后的源代码作为输出。
- 在 webpack 配置文件中,通过
module.rules
选项来指定哪些文件应该使用自定义 Loader 进行处理。
-
Plugin:
- Plugin 用于执行更广泛的任务,如打包优化、资源管理、注入环境变量等。
- 编写自定义 Plugin 时,需要创建一个类,并在其原型上定义一个
apply
方法。apply
方法会在插件被安装到 compiler 对象时被调用。 - 在
apply
方法中,可以访问 compiler 对象和 compilation 对象,并使用它们提供的钩子(hooks)来执行自定义的任务。
Core Web Vitals
-
定义:Core Web Vitals 是一套旨在衡量用户在网页上获得良好体验的关键性能指标。
-
包括的指标:
- 首次内容绘制(First Contentful Paint, FCP):浏览器首次渲染出页面内容的时间点。
- 最大内容绘制(Largest Contentful Paint, LCP):页面加载过程中,视口中可见的最大内容元素渲染完成的时间点。
- 首次输入延迟(First Input Delay, FID):用户首次与页面交互(如点击按钮)到浏览器开始处理该交互的时间间隔。
这些指标共同反映了网页的加载性能、交互性能和视觉稳定性,是评估网页用户体验的重要依据。
Webpack 处理 node_modules 中的依赖
当使用 import
语句导入模块时,Webpack 会处理 node_modules
中的依赖。Webpack 会从 node_modules
目录中查找模块,并根据配置(如 resolve.extensions
和 resolve.modules
)确定模块路径,然后将模块打包到最终的构建文件中。在处理 node_modules
中的依赖时,Webpack 还提供了一些优化策略,如代码分割、缓存、Tree Shaking 等。此外,还可以使用 externals
选项来指定哪些模块是外部依赖,不需要被打包进 bundle 文件。对于后端构建应用,还可以使用 webpack-node-externals
插件来智能排除 node_modules
中的依赖。
相关文章:
前端工程化面试题(一)
如何使用 Docker 部署前端项目? 使用 Docker 部署前端项目通常涉及以下几个步骤: 创建项目:首先,需要在本地创建并配置好前端项目。 准备 Docker 文件: .dockerignore:这个文件用于排除不需要上传到 Dock…...
Java设计模式笔记(二)
十四、模版方法模式 1、介绍 1)模板方法模式(Template Method Pattern),又叫模板模式(Template Patern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。 2&…...
vscode(一)安装(ubuntu20.04)
1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...
C# 命名空间(Namespace)
文章目录 前言一、命名空间的定义与使用基础(一)定义语法与规则(二)调用命名空间内元素 二、using 关键字三、嵌套命名空间 前言 命名空间(Namespace)在于提供一种清晰、高效的方式,将一组名称与…...
云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)
计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化)1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类(cpu虚拟化、内存虚拟化、IO虚拟化&#…...
Flutter开发App,编译条件下UI没问题,打包后UI出现问题
刚入门Flutter3个月,终于进入项目打包阶段,发现之前编译环境下都正常的UI,忽然有小部分出现异常,不显示UI部分了。查了2个小时都没发现原因。因为编译环境下,Android、iOS端都正常显示。但是进入打包安装后,…...
Python+OpenCV系列:Python和OpenCV的结合和发展
PythonOpenCV系列:Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…...
报错 JSON.parse: expected property name or ‘}‘,JSON数据中对象的key值不为字符串
报错 JSON.parse: expected property name or ‘}’ 原因 多是因为数据转换时出错,可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题(后端给的JSON数据里,对象key值不为string) 现在后端转换JSON数据大多…...
Flutter:商品多规格内容总结,响应式数据,高亮切换显示。
如图所示: 代码为练习时写的项目,写的一般,功能实现了,等以后再来优化。 自己模拟的数据结构 var data {id:1,name:精品小米等多种五谷杂粮精品小等多种五谷杂粮,logo:https://cdn.uviewui.com/uview/swiper/1.jpg,price:100.5…...
WPF+LibVLC开发播放器-LibVLC播放控制
接上一篇: LibVLC在C#中的使用 实现LibVLC播放器播放控制 界面 界面上添加一个Button按钮用于控制播放 <ButtonGrid.Row"1"Width"88"Height"24"Margin"10,0,0,0"HorizontalAlignment"Left"VerticalAlignme…...
Mac环境下brew安装LNMP
安装不同版本PHP 在Mac环境下同时运行多个版本的PHP,同Linux环境一样,都是将后台运行的php-fpm设置为不同的端口号,下面将已php7.2 和 php7.4为例 添加 tap 目的:homebrew仅保留最近的php版本,可能没有你需要的版本…...
nodejs后端项目使用pm2部署
nodejs后端项目使用pm2部署 安装pm2 npm install pm2 -g查看版本号 pm2 --version启动项目 pm2 start app.js# 设置别名 pm2 start app.js --name demo停止项目 pm2 stop [AppName] pm2 stop [ID]# 停止所有项目 pm2 stop all重启项目 pm2 restart [AppName] pm2 re…...
【C++】深入理解字符变量取地址的特殊性与内存管理机制详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯栈内存中的变量分配:谁先谁后?cout 的输出行为:按顺序执行,按地址递增读取代码执行顺序与内存布局的关系编译器优化的影响 &…...
【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏ÿ…...
蓝桥杯软件赛系列---lesson1
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们今天会再开一个系列,那就是蓝桥杯系列,我们会从最基础的开始讲起,大家想要备战明年蓝桥杯的,让我们一起加油。 工具安装 DevC…...
工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet
论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...
HeidiSQL:MySQL图形化管理工具深度解析
本文还有配套的精品资源,点击获取 简介:HeidiSQL是一款开源的MySQL图形化管理工具,适用于多种数据库系统,如MySQL、MariaDB、SQL Server、PostgreSQL和SQLite。其提供的直观操作界面和丰富的功能简化了数据库操作,包…...
【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南
文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码:主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码:使用布隆过滤器 四、缓存雪崩4…...
Flask使用Celery与多进程管理:优雅处理长时间任务与子进程终止技巧(multiprocessing)(subprocess)
在许多任务处理系统中,我们需要使用异步任务队列来处理繁重的计算或长时间运行的任务,如模型训练。Celery是一个广泛使用的分布式任务队列,而在某些任务中,尤其是涉及到调用独立脚本的场景中,我们需要混合使用multipro…...
【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 (一般N卡自带的CUDA版本与最新的torch版本相差较大) 解决方案 1.查看自己的CUDA版本 # 查看自己的…...
使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面
以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio,新建一个 Empty Activity …...
突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!
文章链接:https://arxiv.org/pdf/2411.18623 项目链接:https://lift3d-web.github.io/ 亮点直击 提出了Lift3D,通过系统地提升隐式和显式的3D机器人表示,提升2D基础模型,构建一个3D操作策略。 对于隐式3D机器人表示&a…...
Android KEY的哪些事儿
目录 一、APK应用签名 1、什么是APK应用签名? 1.1 目的和作用? 1.2 长什么样子? 2、APK应用签名使用流程 步骤一:如何生成APK应用签名文件? 步骤二:如何集成APK应用签名文件? 步骤三&am…...
李宏毅深度学习-Pytorch Tutorial2
什么是张量? 张量(Tensor)是深度学习和机器学习中一个非常基础且重要的概念。在数学上,张量可以被看作是向量和矩阵的泛化。简单来说,张量是一种多维数组,它可以表示标量(0维)、向量…...
【译】为 SAP 表维护视图 (SM30) 创建选择屏幕
原文标题:Create Selection Screen for SAP Table Maintenance View (SM30) 原文链接: https://www.saphub.com/abap-dictionary/sap-abap-tmg-selection-screen/ 通常,带有单个屏幕的 SAP 表维护视图 (SM30) 会显示表中的所有记录ÿ…...
element Plus中 el-table表头宽度自适应,不换行
在工作中,使用el-table表格进行开发后,遇到了小屏幕显示器上显示表头文字会出现换行展示,比较影响美观,因此需要让表头的宽度变为不换行,且由内容自动撑开。 以下是作为工作记录,用于demo演示教程 先贴个…...
C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数
知识要点:数组作函数参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序,前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...
时间序列模型在LSTM中的特征输入
这里写目录标题 前言LSTM的输入组成时间步例子 实际代码解读特征提取处理成dataloader格式(用于输入到模型当中)对应到lstm的模型创建代码 总结 前言 本文章将帮助理解如何将一个时间序列的各种特征(年月日的时间特征,滚动窗口滞…...
Python_Flask02
所有人都不许学Java了,都来学Python! 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy,安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…...
threejs相机辅助对象cameraHelper
为指定相机创建一个辅助对象,显示这个相机的视锥。 想要在场景里面显示相机的视锥,需要创建两个相机。 举个例子,场景中有个相机A,想要显示相机A的视锥,那么需要一个相机B,把B放在A的后面,两个…...
断点续传+测试方法完整示例
因为看不懂网上的断点续传案例,而且又不能直接复制使用,干脆自己想想写了一个。 上传入参类: import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProp…...
C#设计模式--状态模式(State Pattern)
状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中,而不是将状态逻辑散布在整个程序中。 用途 简化复杂的条件逻辑:通过将不同的状态封装在不同的类中,可…...
Excel技巧:如何批量调整excel表格中的图片?
插入到excel表格中的图片大小不一,如何做到每张图片都完美的与单元格大小相同?并且能够根据单元格来改变大小?今天分享,excel表格里的图片如何批量调整大小。 方法如下: 点击表格中的一个图片,然后按住Ct…...
hadoop中导出表与数据的步骤
大家好,我是 V 哥。在Hadoop中导出表与数据,可以通过多种方式实现,包括使用Hive的EXPORT命令、MapReduce作业、Hive查询以及Sqoop工具。下面V 哥将详细介绍这些步骤和一些代码示例,来帮助大家更好理解。 1. 使用Hive的EXPORT命令…...
springBoot中的日志级别在哪里配置
在Spring Boot中,日志级别的配置可以通过多种方式来实现,主要包括在配置文件中设置、使用自定义的logback配置文件,以及在代码中动态配置等。以下是一些具体的配置方法: 一、在配置文件中设置日志级别 Spring Boot默认使用appli…...
17. Threejs案例-Three.js创建多个立方体
17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…...
数据结构——有序二叉树的删除
在上一篇博客中,我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次,点赞18次,收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…...
力扣1401. 圆和矩形是否有重叠
用矢量计算: class Solution { public:bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {//矩形中心float Tx(float)(x1x2)/2;float Ty(float)(y1y2)/2;//强行进行对称操作,只考虑第一象限if(xCenter<Tx)…...
idea连接到docker出现 org.apache.hc.client5.http.ConnectTimeoutException 异常怎么办?
前情提要 我电脑是win11,我安装了centOS7虚拟机,配置linux环境 idea是2024社区免费版本 我就这一步步排查问题,终于发现了是因为我的2375端口没有ipv4开放,只在ipv6开放 踩坑提醒: 对了,一个一个问题排…...
一番赏小程序定制开发,打造全新抽赏体验平台
随着盲盒的热潮来袭,作为传统的潮玩方式一番赏也再次受到了大家的关注,市场热度不断上升! 一番赏能够让玩家百分百中奖,商品种类丰富、收藏价值高,拥有各种IP,从而吸引着各个圈子的粉丝玩家,用…...
PHP语法学习(第六天)
💡依照惯例,回顾一下昨天讲的内容 PHP语法学习(第五天)主要讲了PHP中的常量和运算符的运用。 🔥 想要学习更多PHP语法相关内容点击“PHP专栏” 今天给大家讲课的角色是🍍菠萝吹雪,“我菠萝吹雪吹的不是雪,而…...
按vue组件实例类型实现非侵入式国际化多语言翻译
#vue3##国际化##本地化##international# web界面国际化,I18N(Internationalization,国际化),I11L(International,英特纳雄耐尔),L10N(Localization,本地化)&…...
2024年认证杯SPSSPRO杯数学建模B题(第一阶段)神经外科手术的定位与导航解题全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…...
51c视觉~合集24
我自己的原文哦~ https://blog.51cto.com/whaosoft/11870494 #R-Adapter 零样本模型微调新突破,提升鲁棒性与泛化能力 论文提出新颖的Robust Adapter(R-Adapter),可以在微调零样本模型用于下游任务的同时解决这两个问题。该方…...
idea启动tomcat服务中文乱码
在idea中启动tomcat服务后部分中文乱码 但是在tomcat日志部分正常 并且在tomcat中中文也是正常 查询大量资料修改idea编码,虚拟机编码、tomcat默认编码、终端默认编码,统统没有效果。 最终发现修改tomcat下文件夹 .\conf\logging.properties 网络上…...
android studio 读写文件操作(应用场景二)
android studio版本:2023.3.1 patch2 例程:readtextviewIDsaveandread 本例程是个过渡例程,如果单是实现下图的目的有更简单的方法,但这个方法是下一步工作的基础,所以一定要做。 例程功能:将两个textvi…...
【数据结构】【线性表】特殊的线性表-字符串
目录 字符串的基本概念 字符串的三要素 字符串的基本概念 串的编码 串的实现及基本运算 顺序串的实现 串的静态数组实现 串的动态数组的实现 顺序存储的四种方案 链式串的实现 基本运算 方案三 方案一 字符串的基本概念 数据结构千千万,…...
【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode
文章目录 一、为什么要使用 Amazon EKS Auto Mode?二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…...
HTTPS的工作过程
1.HTTPS协议原理 1.1HTTPS协议的由来 HTTP在传输网络数据的时候是明文传输的,信息容易被窃听甚至篡改,因此他是一个不安全的协议(但效率高)。在如今的网络环境中,数据安全是很重要的(比如支付密码又或者各…...
Java并发编程学习之从资本家的角度看多线程和并发性(一)
目录 前言前置知识一、单线程时代二、为什么要有多线程,多线程的优点?三、使用多线程会遇到什么问题?四、多线程和并发编程的关系总结 前言 这篇文章是打开Java多线程和并发编程的大门的开始,如标题《从老板的角度看多线程和并发…...