当前位置: 首页 > 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…...

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…...

期权懂|个股期权交割操作流程是什么样的?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 个股期权交割操作流程是什么样的&#xff1f; 一、行权申报&#xff1a; 期权买方在行权日通过其经纪商提交行权指令&#xff0c;表明其决定行使期权权利。 二、行权匹配&#xf…...

【openGauss】openGauss execute执行update语句,获取更新的行数

【openGauss】openGauss execute执行update语句&#xff0c;获取更新的行数 在openGauss中&#xff0c;可以使用execute语句执行update语句&#xff0c;并通过GET DIAGNOSTICS语句获取更新的行数。下面是一个示例&#xff1a; DO $$ DECLAREupdated_rows INTEGER; BEGINEXECUT…...

P8780 [蓝桥杯 2022 省 B] 刷题统计

题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 &#x1d44e;道题目&#xff0c;周六和周日每天做 &#x1d44f; 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 &#x1d45b; 题? 输入格式 输入一行包含三…...

切比雪夫不等式:方差约束下的概率估计

切比雪夫不等式&#xff1a;方差约束下的概率估计 背景 在概率分析中&#xff0c;切比雪夫不等式是一个常用的工具&#xff0c;它通过引入随机变量的 方差信息&#xff0c;给出了偏离均值的概率界限。这一不等式是对 马尔科夫不等式 的自然扩展&#xff0c;结合了更丰富的分布…...

使用CancellationTokenSource来控制长时间sql查询中断

前端 <!-- 透明的覆盖层&#xff0c;显示在页面上方&#xff0c;包含进度条 --><Grid Visibility"{Binding IsLoading}" Background"Transparent" HorizontalAlignment"Stretch" VerticalAlignment"Stretch" ZIndex"1&…...

小红薯最新x-s 算法补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...

wazuh-modules-sca

wazuh中安全配置评估模块主线程执行wm_sca_main最后在wm_sca_start中循环执行&#xff0c;不会返回 // Module main function. It wont return #ifdef WIN32 DWORD WINAPI wm_sca_main(void *arg) {wm_sca_t *data (wm_sca_t *)arg; #else void * wm_sca_main(wm_sca_t * dat…...

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…...

微信小程序配置less并使用

1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录&#xff0c;一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是&#xf…...

“全面支持公路数字化转型升级四大任务”视频孪生解决方案

数字经济的加速布局&#xff0c;对交通领域数字化转型、智能化升级提出明确要求。2024年上半年&#xff0c;为深入贯彻落实中共中央、国务院关于加快建设交通强国、数字中国等决策部署&#xff0c;推进公路水路交通基础设施数字转型、智能升级、融合创新&#xff0c;加快发展新…...

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字&#xff0c;如果等全部文字返回了一次性去TTS&#xff0c;那么延迟会非常严重&#xff0c;常用的方法就是通过标点符号断句&#xff0c;返回了一句话就提交给TTS。随着流TTS的出现&#xff0c;就可以直接把大模型返回的文字灌给流TTS&#xff0…...

P3379 【模板】最近公共祖先(LCA)

【模板】最近公共祖先&#xff08;LCA&#xff09; https://www.luogu.com.cn/problem/P3379 题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N , M , S N,M,S N,M,S&#xff0c;分别表示…...

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…...

网易博客旧文-----如何在WINDOWS下载安卓(android)源代码并和eclipse做关联

如何在WINDOWS下载安卓&#xff08;android&#xff09;源代码并和eclipse做关联 2013-02-05 17:27:16| 分类&#xff1a; 安卓开发 | 标签&#xff1a; |举报 |字号大中小 订阅 编写安卓程序时&#xff0c;有时想看看安卓某些类的实现&#xff0c;但默认情况下环境是不带的。…...

MATLAB中axes函数用法

目录 语法 说明 示例 在图窗中定位多个坐标区 将坐标区设置为当前坐标区 在选项卡上创建坐标区 axes函数的功能是创建笛卡尔坐标区。 语法 axes axes(Name,Value) axes(parent,Name,Value) ax axes(___) axes(cax) 说明 axes 在当前图窗中创建默认的笛卡尔坐标区&…...

构建 Java Web 应用程序:实现简单的增删查改(Mysql)

简介 本教程将指导您如何使用Java Servlet和JSP技术构建一个简单的Web应用程序。该应用程序将包括用户注册、登录、注销&#xff08;删除用户信息&#xff09;、修改密码以及根据性别查询用户信息等功能。我们将使用MySQL数据库来存储用户数据。 环境准备 Java Development …...

3d行政区划-中国地图

前言 技术调研&#xff1a;做底代码平台的3d行政区组件 写的demo 效果图&#xff1a; 实现的功能项 地标、打点、飞线、three.js 3d 中国地图的一些基础配置补充 geo中国地图文件获取 其他项:包 "dependencies": {"d3": "^7.9.0","d3-…...

适合存储时序数据的数据库和存储系统

时序数据的存储通常要求高效地处理大量按时间排序的数据&#xff0c;同时支持快速查询、实时分析和高并发写入。以下是一些适合存储时序数据的数据库和存储系统&#xff1a; 1. InfluxDB 概述&#xff1a;InfluxDB 是一个开源的时序数据库&#xff0c;专门为处理时序数据而设…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...