当前位置: 首页 > news >正文

前端工程化面试题(一)

如何使用 Docker 部署前端项目?

使用 Docker 部署前端项目通常涉及以下几个步骤:

  1. 创建项目:首先,需要在本地创建并配置好前端项目。

  2. 准备 Docker 文件

    • .dockerignore:这个文件用于排除不需要上传到 Docker 服务端的文件或目录。
    • Dockerfile:这是 Docker 的核心文件,用于构建 Docker 容器镜像。通常,Dockerfile 会包含基础镜像、工作目录设置、依赖安装、项目构建等指令。
    • nginx.conf(可选):如果项目需要服务器来托管,可以准备一个 nginx 配置文件来配置服务器。
  3. 构建 Docker 镜像:在项目的根目录下,使用 docker build 命令来构建 Docker 镜像。例如:docker build -t my-frontend-app .。这里的 -t--tag 用于给构建的镜像添加一个或多个标签。

  4. 创建并运行 Docker 容器:使用 docker run 命令来创建并运行 Docker 容器。例如:docker run -itd -p 8080:80 --name my-frontend-container my-frontend-app。这里的 -i-t-d 分别表示交互模式、分配一个终端、在后台运行容器,-p 用于映射端口。

  5. 访问应用:在浏览器中输入容器的映射地址(如 http://localhost:8080),即可访问部署在 Docker 容器中的前端项目。

什么是 npm cache?如何有效管理它?

npm cache 是 npm(Node Package Manager)的缓存机制,它用于保存已下载的包,以便在将来的安装中可以快速访问。这可以显著减少安装时间,特别是在慢速网络或离线环境中。

有效管理 npm cache 的方法包括:

  1. 清理缓存:使用 npm cache clean 命令可以清理整个 npm 缓存。如果需要清理特定包的缓存,可以使用 npm cache clean <package-name> --force
  2. 查看缓存:使用 npm cache ls 命令可以列出缓存中的所有包。也可以查看特定包的缓存信息。
  3. 修复缓存:如果遇到与缓存相关的问题,可以尝试清理缓存来修复。
  4. 配置缓存:可以通过 .npmrc 文件配置缓存的存储路径和大小限制等。

如何通过 npm 发布前端 package?发布流程是怎样的?

通过 npm 发布前端 package 的流程通常包括以下几个步骤:

  1. 注册 npm 账号:在 npm 官网 注册一个账号。

  2. 准备 package

    • 创建一个新的项目文件夹,并使用 npm init 命令初始化一个新的 npm 包。
    • 编写项目代码和 README.md 文件,详细描述 package 的信息和使用方法。
    • 准备 package.json 文件,确保其中的 nameversiondescriptionmainkeywordsauthorlicense 等字段都已正确填写。
  3. 登录 npm:在命令行中使用 npm login 命令登录 npm 账号。

  4. 发布 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 对象中,如果模块间的依赖关系由文件加载顺序决定,那么这种模块组织方式可能会带来以下缺点:

  1. 依赖关系不明确:由于依赖关系隐藏在文件加载顺序中,因此很难直观地看出模块之间的依赖关系。
  2. 难以维护:随着项目的增长,文件数量和依赖关系会变得越来越复杂,维护起来也会更加困难。
  3. 容易出错:如果文件加载顺序发生变化,或者某个模块被遗漏或重复加载,都可能导致项目出错。

什么是前端工程化?它有什么意义?

前端工程化是指将前端开发纳入软件工程范畴,采用系统化、规范化的方法来进行前端项目的开发、测试、部署和维护。它的意义在于:

  1. 提高开发效率:通过工程化的方法,可以自动化地构建、测试和部署前端项目,从而大大提高开发效率。
  2. 保证代码质量:通过代码审查、单元测试、集成测试等手段,可以保证代码的质量和稳定性。
  3. 便于团队协作:工程化的方法使得前端项目更加模块化、组件化,便于团队成员之间的协作和分工。
  4. 降低维护成本:通过合理的项目结构和清晰的依赖关系,可以降低项目的维护成本。

什么是 ESLint?它有什么作用?

ESLint 是一个静态代码检查工具,用于识别和报告 JavaScript 代码中的模式。它的主要作用包括:

  1. 代码质量检查:通过配置规则集,ESLint 可以检查代码中的潜在问题,如未声明的变量、未使用的变量、语法错误等。
  2. 代码风格统一:ESLint 可以强制团队成员遵循一致的代码风格,从而提高代码的可读性和可维护性。
  3. 自动化修复:对于一些简单的错误或不符合规则的地方,ESLint 可以提供自动化修复的建议或工具。

如何在 Webpack 中切换开发环境和生产环境?

在 Webpack 中,可以通过配置不同的环境变量来切换开发环境和生产环境。通常,这涉及到以下几个步骤:

  1. 定义环境变量:在 package.jsonscripts 部分,可以为不同的环境定义不同的脚本命令。例如,可以使用 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"
  2. 读取环境变量:在 Webpack 配置文件中,可以使用 process.env.NODE_ENV 来读取当前的环境变量。
  3. 配置不同的插件和加载器:根据环境变量的值,可以配置不同的插件和加载器。例如,在生产环境中,可以启用代码压缩、优化等插件;在开发环境中,可以启用热更新、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 文件,可以尝试以下几个解决方法:

  1. 检查文件路径:确保 template 文件的路径是正确的。如果路径中包含相对路径或特殊字符,请确保它们被正确处理。
  2. 检查文件名和扩展名:确保文件名和扩展名与在 html-webpack-plugin 配置中指定的名称相匹配。
  3. 清理缓存:有时候,Webpack 的缓存可能会导致问题。可以尝试清理缓存后重新构建项目。
  4. 检查 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.jsonyarn.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:标志着页面加载完成的时间戳。

通过计算 loadEventEndnavigationStart 之间的差值,可以得到页面加载的总时间,这在某种程度上可以反映首屏加载时间。此外,redirectStartredirectEnddomainLookupStartdomainLookupEndresponseStartdomLoadingdomComplete 等指标也都在不同程度上影响首屏渲染时间。

如何组织 CSS 以配合 Webpack 构建?

要组织 CSS 以配合 Webpack 构建,可以按照以下步骤进行:

  1. 安装相关 loader:确保已经安装了 Webpack 和相关的 loader,如 css-loaderstyle-loader
  2. 配置 Webpack:在 Webpack 配置文件中,添加对 CSS 文件的处理规则。通常,这涉及到在 module.rules 数组中添加规则,指定当遇到以 .css 结尾的文件时,使用 style-loadercss-loader 进行处理。
  3. 使用 CSS 模块(可选):为了避免全局污染和类名冲突,可以使用 CSS 模块。这需要在 css-loader 的配置中添加 modules: true 选项,并在 CSS 文件中使用 CSS 模块的语法。

Webpack 打包过程中,import 和 CommonJS 有什么区别?

在 Webpack 打包过程中,import 和 CommonJS(通常使用 require)有以下区别:

  • 语法差异import 是 ES6 引入的官方模块系统的一部分,支持静态导入和导出;而 CommonJS 是 Node.js 使用的模块系统,使用 require 函数导入模块,通过 module.exportsexports 导出。
  • 打包行为:Webpack 对 importrequire 的处理有所不同。import 语句支持静态分析,有利于代码优化,如摇树优化(Tree Shaking);而 CommonJS 模块在 Webpack 中通常会被原样输出,不进行静态分析。

当引入某个前端依赖项时,如何确定引入的具体文件?

当引入某个前端依赖项时,可以通过以下步骤确定引入的具体文件:

  1. 查看依赖项的文档:通常,依赖项的文档会提供有关如何引入和使用该依赖项的详细信息。
  2. 检查 package.jsonpackage.json 文件中列出了项目的所有依赖项及其版本。通过查看该文件,可以了解引入了哪些依赖项。
  3. 分析导入路径:在代码中查找以 importrequire 开头的语句,分析这些语句的导入路径,以确定引入了哪些具体文件。
  4. 查看 node_modules:如果以上方法无法确定具体文件,可以直接查看 node_modules 目录下的依赖项文件夹,以了解该依赖项包含哪些文件和子目录。

什么是服务器端渲染 (SSR)?

服务器端渲染(Server-Side Rendering,简称 SSR)是指在服务器上完成网页的渲染工作,然后将完整的 HTML 页面发送给客户端。客户端的浏览器接收到 HTML 页面后,直接进行展示,无需进行复杂的逻辑计算和渲染工作。SSR 的主要优点包括提高加载速度、提升 SEO 排名、支持离线浏览等。

前端项目中,如何优化首屏渲染时间?

在前端项目中,优化首屏渲染时间可以采取以下措施:

  1. 减少网络请求:通过合并和压缩文件、使用雪碧图或字体图标等技术,减少需要下载的资源数量和大小。
  2. 延迟加载非关键资源:将非关键资源(如图片、视频)延迟加载,只在用户需要时再进行加载。
  3. 使用浏览器缓存:设置适当的缓存策略,使得页面资源可以被浏览器缓存起来,减少重复的网络请求。
  4. 优化代码和文件大小:精简和压缩 HTML、CSS 和 JavaScript 文件,删除不必要的代码、注释和空格。
  5. 异步加载和执行:将 JavaScript 脚本放在页面底部或使用异步加载的方式,确保脚本不会阻塞页面的渲染。
  6. 使用 CDN 加速:将静态资源部署在内容分发网络(CDN)上,提高访问速度。
  7. 使用预渲染技术:通过预渲染技术提前生成首屏内容并存储为静态文件,当用户访问时直接返回。

Webpack 支持哪些脚本模块规范?

Webpack 支持多种脚本模块规范,包括:

  1. ES Modules (ESM):ECMAScript 2015(也称为 ES6)及其后续版本引入的官方模块系统。
  2. CommonJS:主要用于 Node.js,也被广泛应用于浏览器端代码的打包。
  3. Asynchronous Module Definition (AMD):专为浏览器端设计,支持异步加载模块。
  4. Universal Module Definition (UMD):旨在提供一个在 AMD 和 CommonJS 环境下都可运行的模块定义。
  5. SystemJS 模块:由 SystemJS 提出的格式,用于动态加载模块。

如何在前端项目中进行单元测试?

在前端项目中进行单元测试通常涉及以下步骤:

  1. 选择测试框架:如 Jest、Mocha、Jasmine 等。
  2. 编写测试用例:针对要测试的功能或模块编写测试用例。
  3. 配置测试环境:设置测试运行器和测试框架的配置。
  4. 运行测试:使用命令行工具运行测试,并查看测试结果。
  5. 修复和优化:根据测试结果修复代码中的错误,并优化测试用例。

Webpack 的热更新底层是如何实现的?它如何在不刷新浏览器的前提下更新页面?

Webpack 的热更新(Hot Module Replacement,简称 HMR)底层实现依赖于 WebSocket 或其他实时通信技术。当 Webpack 检测到文件变化时,它会重新构建受影响的模块,并通过 WebSocket 将更新后的模块发送到客户端。客户端接收到更新后的模块后,会使用这些模块替换掉旧的模块,从而实现页面内容的更新,而无需刷新浏览器。

Webpack 打包时 Hash 码是如何生成的?如何避免 Hash 码重复?

Webpack 打包时生成的 Hash 码通常是通过对文件内容进行哈希计算得到的。Webpack 使用一个哈希算法(如 MD5、SHA-1 等)对文件内容进行计算,生成一个唯一的 Hash 码。为了避免 Hash 码重复,可以采取以下措施:

  1. 确保文件内容唯一:在打包前确保每个文件的内容都是唯一的,避免相同内容的文件被重复打包。
  2. 使用内容哈希:Webpack 提供了内容哈希的选项(如 [contenthash]),该选项会根据文件内容生成 Hash 码,从而确保每个文件都有唯一的 Hash 码。
  3. 配置输出文件名:在 Webpack 配置中设置输出文件名时,可以使用占位符(如 [name].[contenthash].js)来生成包含 Hash 码的文件名。

npm 的 dependencies 与 devDependencies 有什么区别?

在 npm 中,dependenciesdevDependencies 有以下区别:

  • dependencies:包含项目运行时所需的依赖项。这些依赖项在项目部署到生产环境时也需要存在。
  • devDependencies:包含项目开发过程中所需的依赖项。这些依赖项仅在开发过程中使用,如测试框架、构建工具等。在项目部署到生产环境时,这些依赖项通常不需要存在。

通过在 package.json 文件中分别列出 dependenciesdevDependencies,可以清晰地了解项目所需的依赖项及其用途。

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.extensionsresolve.modules)确定模块路径,然后将模块打包到最终的构建文件中。在处理 node_modules 中的依赖时,Webpack 还提供了一些优化策略,如代码分割、缓存、Tree Shaking 等。此外,还可以使用 externals 选项来指定哪些模块是外部依赖,不需要被打包进 bundle 文件。对于后端构建应用,还可以使用 webpack-node-externals 插件来智能排除 node_modules 中的依赖。

相关文章:

前端工程化面试题(一)

如何使用 Docker 部署前端项目&#xff1f; 使用 Docker 部署前端项目通常涉及以下几个步骤&#xff1a; 创建项目&#xff1a;首先&#xff0c;需要在本地创建并配置好前端项目。 准备 Docker 文件&#xff1a; .dockerignore&#xff1a;这个文件用于排除不需要上传到 Dock…...

Java设计模式笔记(二)

十四、模版方法模式 1、介绍 1&#xff09;模板方法模式(Template Method Pattern)&#xff0c;又叫模板模式(Template Patern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 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)

文章目录 前言一、命名空间的定义与使用基础&#xff08;一&#xff09;定义语法与规则&#xff08;二&#xff09;调用命名空间内元素 二、using 关键字三、嵌套命名空间 前言 命名空间&#xff08;Namespace&#xff09;在于提供一种清晰、高效的方式&#xff0c;将一组名称与…...

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#…...

Flutter开发App,编译条件下UI没问题,打包后UI出现问题

刚入门Flutter3个月&#xff0c;终于进入项目打包阶段&#xff0c;发现之前编译环境下都正常的UI&#xff0c;忽然有小部分出现异常&#xff0c;不显示UI部分了。查了2个小时都没发现原因。因为编译环境下&#xff0c;Android、iOS端都正常显示。但是进入打包安装后&#xff0c…...

Python+OpenCV系列:Python和OpenCV的结合和发展

PythonOpenCV系列&#xff1a;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 ‘}’ 原因 多是因为数据转换时出错&#xff0c;可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题&#xff08;后端给的JSON数据里&#xff0c;对象key值不为string&#xff09; 现在后端转换JSON数据大多…...

Flutter:商品多规格内容总结,响应式数据,高亮切换显示。

如图所示&#xff1a; 代码为练习时写的项目&#xff0c;写的一般&#xff0c;功能实现了&#xff0c;等以后再来优化。 自己模拟的数据结构 var data {id:1,name:精品小米等多种五谷杂粮精品小等多种五谷杂粮,logo:https://cdn.uviewui.com/uview/swiper/1.jpg,price:100.5…...

WPF+LibVLC开发播放器-LibVLC播放控制

接上一篇&#xff1a; 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&#xff0c;同Linux环境一样&#xff0c;都是将后台运行的php-fpm设置为不同的端口号&#xff0c;下面将已php7.2 和 php7.4为例 添加 tap 目的&#xff1a;homebrew仅保留最近的php版本&#xff0c;可能没有你需要的版本…...

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++】深入理解字符变量取地址的特殊性与内存管理机制详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;栈内存中的变量分配&#xff1a;谁先谁后&#xff1f;cout 的输出行为&#xff1a;按顺序执行&#xff0c;按地址递增读取代码执行顺序与内存布局的关系编译器优化的影响 &…...

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…...

蓝桥杯软件赛系列---lesson1

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们今天会再开一个系列&#xff0c;那就是蓝桥杯系列&#xff0c;我们会从最基础的开始讲起&#xff0c;大家想要备战明年蓝桥杯的&#xff0c;让我们一起加油。 工具安装 DevC…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

HeidiSQL:MySQL图形化管理工具深度解析

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;HeidiSQL是一款开源的MySQL图形化管理工具&#xff0c;适用于多种数据库系统&#xff0c;如MySQL、MariaDB、SQL Server、PostgreSQL和SQLite。其提供的直观操作界面和丰富的功能简化了数据库操作&#xff0c;包…...

【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南

文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码&#xff1a;主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码&#xff1a;使用布隆过滤器 四、缓存雪崩4…...

Flask使用Celery与多进程管理:优雅处理长时间任务与子进程终止技巧(multiprocessing)(subprocess)

在许多任务处理系统中&#xff0c;我们需要使用异步任务队列来处理繁重的计算或长时间运行的任务&#xff0c;如模型训练。Celery是一个广泛使用的分布式任务队列&#xff0c;而在某些任务中&#xff0c;尤其是涉及到调用独立脚本的场景中&#xff0c;我们需要混合使用multipro…...

【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 &#xff08;一般N卡自带的CUDA版本与最新的torch版本相差较大&#xff09; 解决方案 1.查看自己的CUDA版本 # 查看自己的…...

使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面

以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信&#xff08;这里以 TCP 通信为例&#xff09;的代码示例&#xff0c;包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio&#xff0c;新建一个 Empty Activity …...

突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!

文章链接&#xff1a;https://arxiv.org/pdf/2411.18623 项目链接&#xff1a;https://lift3d-web.github.io/ 亮点直击 提出了Lift3D&#xff0c;通过系统地提升隐式和显式的3D机器人表示&#xff0c;提升2D基础模型&#xff0c;构建一个3D操作策略。 对于隐式3D机器人表示&a…...

Android KEY的哪些事儿

目录 一、APK应用签名 1、什么是APK应用签名&#xff1f; 1.1 目的和作用&#xff1f; 1.2 长什么样子&#xff1f; 2、APK应用签名使用流程 步骤一&#xff1a;如何生成APK应用签名文件&#xff1f; 步骤二&#xff1a;如何集成APK应用签名文件&#xff1f; 步骤三&am…...

李宏毅深度学习-Pytorch Tutorial2

什么是张量&#xff1f; 张量&#xff08;Tensor&#xff09;是深度学习和机器学习中一个非常基础且重要的概念。在数学上&#xff0c;张量可以被看作是向量和矩阵的泛化。简单来说&#xff0c;张量是一种多维数组&#xff0c;它可以表示标量&#xff08;0维&#xff09;、向量…...

【译】为 SAP 表维护视图 (SM30) 创建选择屏幕

原文标题&#xff1a;Create Selection Screen for SAP Table Maintenance View (SM30) 原文链接&#xff1a; https://www.saphub.com/abap-dictionary/sap-abap-tmg-selection-screen/ 通常&#xff0c;带有单个屏幕的 SAP 表维护视图 (SM30) 会显示表中的所有记录&#xff…...

element Plus中 el-table表头宽度自适应,不换行

在工作中&#xff0c;使用el-table表格进行开发后&#xff0c;遇到了小屏幕显示器上显示表头文字会出现换行展示&#xff0c;比较影响美观&#xff0c;因此需要让表头的宽度变为不换行&#xff0c;且由内容自动撑开。 以下是作为工作记录&#xff0c;用于demo演示教程 先贴个…...

C语言程序设计P5-4【应用函数进行程序设计 | 第四节】——知识要点:数组作函数参数

知识要点&#xff1a;数组作函数参数 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 任务要求用选择法对数组中的 10 个整数按由小到大的顺序排序&#xff0c;前面在讲解数组时讲冒泡法排序曾提到选择法排序的思想。 所谓选择法就是…...

时间序列模型在LSTM中的特征输入

这里写目录标题 前言LSTM的输入组成时间步例子 实际代码解读特征提取处理成dataloader格式&#xff08;用于输入到模型当中&#xff09;对应到lstm的模型创建代码 总结 前言 本文章将帮助理解如何将一个时间序列的各种特征&#xff08;年月日的时间特征&#xff0c;滚动窗口滞…...

Python_Flask02

所有人都不许学Java了&#xff0c;都来学Python&#xff01; 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy&#xff0c;安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…...

threejs相机辅助对象cameraHelper

为指定相机创建一个辅助对象&#xff0c;显示这个相机的视锥。 想要在场景里面显示相机的视锥&#xff0c;需要创建两个相机。 举个例子&#xff0c;场景中有个相机A&#xff0c;想要显示相机A的视锥&#xff0c;那么需要一个相机B&#xff0c;把B放在A的后面&#xff0c;两个…...

断点续传+测试方法完整示例

因为看不懂网上的断点续传案例&#xff0c;而且又不能直接复制使用&#xff0c;干脆自己想想写了一个。 上传入参类&#xff1a; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProp…...

C#设计模式--状态模式(State Pattern)

状态模式是一种行为设计模式&#xff0c;它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中&#xff0c;而不是将状态逻辑散布在整个程序中。 用途 简化复杂的条件逻辑&#xff1a;通过将不同的状态封装在不同的类中&#xff0c;可…...

Excel技巧:如何批量调整excel表格中的图片?

插入到excel表格中的图片大小不一&#xff0c;如何做到每张图片都完美的与单元格大小相同&#xff1f;并且能够根据单元格来改变大小&#xff1f;今天分享&#xff0c;excel表格里的图片如何批量调整大小。 方法如下&#xff1a; 点击表格中的一个图片&#xff0c;然后按住Ct…...

hadoop中导出表与数据的步骤

大家好&#xff0c;我是 V 哥。在Hadoop中导出表与数据&#xff0c;可以通过多种方式实现&#xff0c;包括使用Hive的EXPORT命令、MapReduce作业、Hive查询以及Sqoop工具。下面V 哥将详细介绍这些步骤和一些代码示例&#xff0c;来帮助大家更好理解。 1. 使用Hive的EXPORT命令…...

springBoot中的日志级别在哪里配置

在Spring Boot中&#xff0c;日志级别的配置可以通过多种方式来实现&#xff0c;主要包括在配置文件中设置、使用自定义的logback配置文件&#xff0c;以及在代码中动态配置等。以下是一些具体的配置方法&#xff1a; 一、在配置文件中设置日志级别 Spring Boot默认使用appli…...

17. Threejs案例-Three.js创建多个立方体

17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…...

数据结构——有序二叉树的删除

在上一篇博客中&#xff0c;我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次&#xff0c;点赞18次&#xff0c;收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…...

力扣1401. 圆和矩形是否有重叠

用矢量计算&#xff1a; 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;//强行进行对称操作&#xff0c;只考虑第一象限if(xCenter<Tx)…...

idea连接到docker出现 org.apache.hc.client5.http.ConnectTimeoutException 异常怎么办?

前情提要 我电脑是win11&#xff0c;我安装了centOS7虚拟机&#xff0c;配置linux环境 idea是2024社区免费版本 我就这一步步排查问题&#xff0c;终于发现了是因为我的2375端口没有ipv4开放&#xff0c;只在ipv6开放 踩坑提醒&#xff1a; 对了&#xff0c;一个一个问题排…...

一番赏小程序定制开发,打造全新抽赏体验平台

随着盲盒的热潮来袭&#xff0c;作为传统的潮玩方式一番赏也再次受到了大家的关注&#xff0c;市场热度不断上升&#xff01; 一番赏能够让玩家百分百中奖&#xff0c;商品种类丰富、收藏价值高&#xff0c;拥有各种IP&#xff0c;从而吸引着各个圈子的粉丝玩家&#xff0c;用…...

PHP语法学习(第六天)

&#x1f4a1;依照惯例&#xff0c;回顾一下昨天讲的内容 PHP语法学习(第五天)主要讲了PHP中的常量和运算符的运用。 &#x1f525; 想要学习更多PHP语法相关内容点击“PHP专栏” 今天给大家讲课的角色是&#x1f34d;菠萝吹雪&#xff0c;“我菠萝吹雪吹的不是雪&#xff0c;而…...

按vue组件实例类型实现非侵入式国际化多语言翻译

#vue3##国际化##本地化##international# web界面国际化&#xff0c;I18N&#xff08;Internationalization&#xff0c;国际化&#xff09;&#xff0c;I11L(International&#xff0c;英特纳雄耐尔)&#xff0c;L10N&#xff08;Localization&#xff0c;本地化&#xff09;&…...

2024年认证杯SPSSPRO杯数学建模B题(第一阶段)神经外科手术的定位与导航解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…...

51c视觉~合集24

我自己的原文哦~ https://blog.51cto.com/whaosoft/11870494 #R-Adapter 零样本模型微调新突破&#xff0c;提升鲁棒性与泛化能力 论文提出新颖的Robust Adapter&#xff08;R-Adapter&#xff09;&#xff0c;可以在微调零样本模型用于下游任务的同时解决这两个问题。该方…...

idea启动tomcat服务中文乱码

在idea中启动tomcat服务后部分中文乱码 但是在tomcat日志部分正常 并且在tomcat中中文也是正常 查询大量资料修改idea编码&#xff0c;虚拟机编码、tomcat默认编码、终端默认编码&#xff0c;统统没有效果。 最终发现修改tomcat下文件夹 .\conf\logging.properties 网络上…...

android studio 读写文件操作(应用场景二)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;readtextviewIDsaveandread 本例程是个过渡例程&#xff0c;如果单是实现下图的目的有更简单的方法&#xff0c;但这个方法是下一步工作的基础&#xff0c;所以一定要做。 例程功能&#xff1a;将两个textvi…...

【数据结构】【线性表】特殊的线性表-字符串

目录 字符串的基本概念 字符串的三要素 字符串的基本概念 串的编码 串的实现及基本运算 顺序串的实现 串的静态数组实现 串的动态数组的实现 顺序存储的四种方案 链式串的实现 基本运算 方案三 方案一 字符串的基本概念 数据结构千千万&#xff0c…...

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode&#xff1f;二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…...

HTTPS的工作过程

1.HTTPS协议原理 1.1HTTPS协议的由来 HTTP在传输网络数据的时候是明文传输的&#xff0c;信息容易被窃听甚至篡改&#xff0c;因此他是一个不安全的协议&#xff08;但效率高&#xff09;。在如今的网络环境中&#xff0c;数据安全是很重要的&#xff08;比如支付密码又或者各…...

Java并发编程学习之从资本家的角度看多线程和并发性(一)

目录 前言前置知识一、单线程时代二、为什么要有多线程&#xff0c;多线程的优点&#xff1f;三、使用多线程会遇到什么问题&#xff1f;四、多线程和并发编程的关系总结 前言 这篇文章是打开Java多线程和并发编程的大门的开始&#xff0c;如标题《从老板的角度看多线程和并发…...