前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读
按照加载阶段
、渲染阶段
和交互阶段
三个维度进行系统性阐述:
在现代 Web 开发中,性能不再是锦上添花,而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能,我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段三个维度。本文将详尽解析这些指标的定义、意义、测量方式及其优化手段,帮助你建立一套完整的性能优化思维体系。
一、加载阶段(网络层)
计网(一)计网(二)
加载阶段关注的是从用户发起请求到页面开始显示之间的网络传输与资源处理效率
,主要包括以下指标:
1. TTFB(Time to First Byte)首字节时间
-
定义:用户请求网页后,从浏览器发送请求到接收到服务器返回的第一个字节所花的时间。
-
意义:反映
服务器响应速度与网络延迟
。 -
优化手段:
使用 CDN 缓存资源
,靠近用户加速传输。减少 HTTP 重定向次数
。- 后端性能优化(数据库查询效率、代码逻辑优化等)。
启用压缩(如 Gzip 或 Brotli)减少响应体大小
。
2. FP(First Paint)首次绘制
浏览器原理
-
定义:浏览器首次将
任何可见内容
绘制到屏幕上的时间(如背景色、边框)。 -
意义:标志着页面开始“有动静”,提升用户感知速度。
-
优化手段:
优化关键路径资源,
如减少阻塞渲染的 CSS 和 JS
。减少 DOM 树复杂度
,加快解析速度。- 利用
懒加载
减少首屏资源压力。
3. FCP(First Contentful Paint)首次内容绘制
-
定义:页面渲染出
第一个“内容”元素
(如文本、图片、SVG)所需的时间。 -
意义:比 FP 更真实地反映页面初始内容是否快速可见。
-
优化手段:
- 确保
首屏资源优先加载
。 - 减少
render-blocking
脚本。 - 使用预加载(
<link rel="preload">
)加快关键资源获取
。
- 确保
二、渲染阶段(视觉层)
渲染阶段衡量页面结构与布局在视觉上的完整性和稳定性
,是决定页面可视体验好坏的关键:
1. LCP(Largest Contentful Paint)最大内容绘制
-
定义:页面中
最大可见内容元素(如大图、主标题)
渲染完成的时间。 -
意义:反映用户看到主内容所需的时间,是衡量加载体验的核心指标之一。
-
优化手段:
优先加载最大内容元素资源
。- 压缩图片并使用
现代格式(WebP、AVIF)
。 - 推迟
第三方脚本加载
,避免阻塞渲染。 - 使用
font-display: swap
避免 FOIT(字体不可见现象)。
2. CLS(Cumulative Layout Shift)累计布局偏移
-
定义:页面在加载过程中布局发生变化的总偏移量。
-
意义:反映页面视觉稳定性,
避免“跳动式”体验
。 -
优化手段:
- 为所有图片和媒体指定明确的尺寸(
width
/height
或aspect-ratio
)。 避免延迟注入 DOM 内容
,尤其是广告、异步内容等。- 使用 CSS
transform
而不是top/left
改变位置。
- 为所有图片和媒体指定明确的尺寸(
三、交互阶段(用户层)
交互阶段关注的是用户在页面加载完成后与其交互时的响应能力
,是判断页面是否“流畅”、“好用”的关键
:
1. TBT(Total Blocking Time)总阻塞时间
-
定义:FCP 和 TTI(Time to Interactive)之间,
主线程被长任务(>50ms)阻塞的总时间
。 -
意义:反映页面在
加载后到可交互之间的响应延迟
。 -
优化手段:
拆分长任务
:将耗时 JS 拆成多个小任务。- 利用
Web Worker
处理计算密集型任务。 减少不必要的第三方脚本
。- 使用异步或延迟加载(
async
/defer
)脚本。
2. INP(Interaction to Next Paint)交互到下次绘制
-
定义:用户与页面交互(点击、输入等)后,
到页面有响应绘制的时间
(新版取代 FID)。 -
意义:衡量页面在真实用户交互下的响应能力。
-
优化手段:
- 保持主线程空闲:确保交互后
能尽快处理事件
。 - 减少事件处理逻辑中的阻塞(如同步 DOM 操作)。
- 避免
动画引起帧率降低
。 - 通过
requestIdleCallback
或requestAnimationFrame
安排非关键任务。
- 保持主线程空闲:确保交互后
四、性能指标总结图谱
阶段 | 指标 | 全称 | 关注点 | 优化重点 |
---|---|---|---|---|
加载阶段 | TTFB | Time to First Byte | 网络响应 | 后端性能、CDN、压缩 |
FP | First Paint | 初始绘制 | 渲染优化、关键资源、懒加载 | |
FCP | First Contentful Paint | 内容可见性 | 预加载、压缩资源、减 JS 阻塞 | |
渲染阶段 | LCP | Largest Contentful Paint | 主内容呈现 | 图片优化、字体策略、第三方脚本优化 |
CLS | Cumulative Layout Shift | 页面稳定性 | 固定尺寸、延迟加载控制、动画优化 | |
交互阶段 | TBT | Total Blocking Time | 主线程阻塞 | 拆分任务、Web Worker、async 脚本 |
INP | Interaction to Next Paint | 交互响应 | 空闲时间调度、事件处理优化 |
五、实践建议
-
使用工具进行性能分析:
- Chrome DevTools(Performance 面板)
- Lighthouse(生成详细性能报告)
- Web Vitals 扩展
- Real User Monitoring(如 Google Analytics、Sentry)
-
性能优化是一个持续过程:
- 初期重点关注 LCP、CLS、INP 三个 Core Web Vitals。
- 建立 CI/CD 中的性能预算,防止上线新代码带来性能回退。
- 在真实用户环境中监控指标,避免仅依赖实验室数据。
-
关注移动端性能:
- 移动网络与设备性能差异显著,需优先优化移动端体验。
- 使用响应式图片、渐进增强策略应对不同环境。
结语
网页性能优化是一场用户体验的修行之路。通过系统性地理解并掌握加载、渲染、交互
三个阶段的关键指标,不仅能够精准诊断瓶颈问题,更能在不断迭代中稳步提升整体体验。希望本文能为你在构建高性能网页的旅程中提供实用指南与灵感。
Webpack + Vue 项目的性能分析
在使用 Webpack 构建 Vue 项目时,合理的配置和优化策略可以显著提升页面的加载速度和用户体验。以下是针对 Webpack + Vue 项目的性能分析与优化建议:
Webpack优化前端性能
一、性能指标与优化目标
在 Web 性能优化中,常关注以下关键指标:
- TTFB(Time to First Byte):首字节到达时间,反映服务器响应速度。
- FCP(First Contentful Paint):首次内容绘制时间,影响用户对页面加载速度的感知。
- LCP(Largest Contentful Paint):最大内容绘制时间,衡量主要内容的加载速度。
- CLS(Cumulative Layout Shift):累计布局偏移,评估页面视觉稳定性。
- INP(Interaction to Next Paint):交互到下一次绘制的时间,衡量页面的交互响应能力。
优化这些指标的目标是提升页面加载速度、提高用户体验,并减少资源消耗。
二、Webpack 配置优化策略
1. 使用 externals
提取第三方库
将如 Vue、Vue Router、Axios 等第三方库通过 CDN 引入,避免打包进主文件,减小 bundle 体积。(哔哔哔)
配置示例(vue.config.js):
module.exports = {configureWebpack: {externals: {vue: 'Vue','vue-router': 'VueRouter',axios: 'axios'}}
};
HTML 引入示例:
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js"></script>
此策略可显著减小主包体积,提升加载速度。(Vue.js)
2. 使用 SplitChunksPlugin
拆分代码
通过 Webpack 的 SplitChunksPlugin
将公共模块和第三方库拆分,优化缓存利用率。(CSDN博客)
配置示例:
module.exports = {optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'},common: {name: 'common',minChunks: 2,chunks: 'all',priority: 10}}}}
};
此配置将第三方库和公共模块分别打包,提升缓存命中率,减少重复加载。
3. 使用 webpack-bundle-analyzer
分析包体积
利用 webpack-bundle-analyzer
插件可视化分析打包结果,识别体积较大的模块。(CSDN博客)
安装:
npm install --save-dev webpack-bundle-analyzer
配置(vue.config.js):
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {configureWebpack: {plugins: [new BundleAnalyzerPlugin()]}
};
运行打包命令后,将自动打开分析报告,帮助定位优化点。
4. 使用 image-webpack-loader
压缩图片
通过 image-webpack-loader
对图片进行压缩,减小资源体积,提升加载速度。(博客园)
安装:
npm install --save-dev image-webpack-loader
配置(webpack.config.js):
module: {rules: [{test: /\.(png|jpe?g|gif|svg)$/i,use: [{loader: 'url-loader',options: {limit: 8192,name: 'img/[name].[hash:7].[ext]'}},{loader: 'image-webpack-loader',options: {mozjpeg: { progressive: true },optipng: { enabled: true },pngquant: { quality: [0.65, 0.90], speed: 4 },gifsicle: { interlaced: false }}}]}]
}
此配置可自动压缩图片资源,减小加载体积。
5. 使用 babel-plugin-transform-runtime
减少冗余代码
通过 babel-plugin-transform-runtime
插件避免 Babel 转译过程中生成的重复辅助函数,减小代码体积。(博客园)
安装:
npm install --save-dev babel-plugin-transform-runtime
npm install --save @babel/runtime
配置(.babelrc):
{"plugins": ["@babel/plugin-transform-runtime"]
}
此配置可减少重复代码,优化包体积。
三、构建后效果分析
通过上述优化措施,构建后的 Vue 项目将具有以下优势:
- 减小主包体积:通过 externals 和代码拆分,主包体积显著减小,提升加载速度。
- 优化缓存利用:公共模块和第三方库拆分后,浏览器可更有效地缓存资源,减少重复加载。
- 提升构建速度:并行压缩和避免冗余代码减少了构建时间,提高开发效率。
- 增强用户体验:页面加载更快,交互更流畅,提升用户满意度。(Vue.js, Hangge)
例如,通过 externals 提取 Vue、Vue Router 和 Axios 后,主包体积可减少数百 KB,首次加载时间明显缩短。(哔哔哔)
通过合理配置 Webpack 和优化策略,可以显著提升 Vue 项目的性能。如果您需要进一步的帮助,如配置示例或优化建议,欢迎继续提问。
城市灾害应急管理系统配置
压缩(压缩比率小于0.8)
在面试中,向面试官介绍 CompressionWebpackPlugin
的配置及其在 Webpack 构建 Vue 项目中的作用,体现了您对前端性能优化的深入理解。以下是对该插件配置的详细解读及其影响:
CompressionWebpackPlugin 配置详解
new CompressionPlugin({cache: false, // 不启用文件缓存test: /\.(js|css|html)?$/i, // 匹配要压缩的文件类型filename: '[path].gz[query]', // 压缩后的文件名格式algorithm: 'gzip', // 使用 gzip 压缩算法minRatio: 0.8 // 压缩率小于 0.8 才会压缩
})
配置项说明
-
cache: false
:禁用文件缓存,确保每次构建都重新压缩资源,适用于频繁变更的项目。 -
test: /\.(js|css|html)?$/i
:指定匹配的文件类型,包括 JavaScript、CSS 和 HTML 文件,确保这些资源被压缩。 -
filename: '[path].gz[query]'
:定义压缩后文件的命名规则,保持原始路径和查询参数,添加.gz
后缀,便于服务器识别和处理。 -
algorithm: 'gzip'
:使用 gzip 算法进行压缩,这是目前广泛支持的压缩格式,兼容性良好。 -
minRatio: 0.8
:仅当压缩后的文件大小与原始文件大小的比率小于0.8
时才进行压缩,避免对压缩效果不明显的文件进行无效操作。
构建后的影响
-
生成
.gz
压缩文件:构建过程中,会为匹配的资源生成对应的.gz
文件,例如app.js
会生成app.js.gz
。 -
减小资源体积:压缩后的文件体积显著减小,通常可减少 70% 以上,提升页面加载速度。(jecyu.github.io)
-
提升首屏加载性能:减小的资源体积减少了网络传输时间,尤其在网络状况不佳时效果更为明显。
-
服务器配置要求:需要服务器(如 Nginx)配置支持 gzip 压缩,优先提供
.gz
文件给支持的客户端。
示例:Nginx 配置支持 gzip
gzip on;
gzip_static on;
gzip_types text/plain application/javascript text/css text/html;
上述配置启用 Nginx 的 gzip 压缩功能,并指定压缩的 MIME 类型,确保客户端请求时能获取到压缩后的资源。
总结
通过在 Webpack 构建过程中使用 CompressionWebpackPlugin
进行 gzip 压缩,可以显著减小资源体积,提升页面加载性能。在面试中,展示您对该插件配置的理解,以及如何与服务器配置协同工作,体现了您在前端性能优化方面的专业能力。(CSDN博客)
分割
在面试中,向面试官清晰地解释 Webpack 的代码分割(Code Splitting)配置,尤其是 optimization.splitChunks
的使用,能够展示您对前端性能优化的深入理解。以下是对您提供的配置的详细解读:
📌 代码分割的目的
Webpack 的代码分割主要有以下几个目的:
- 提升加载性能:将代码拆分为多个小模块,按需加载,减少初始加载时间。
- 优化缓存策略:将不常变动的库(如第三方依赖)与业务代码分离,利用浏览器缓存机制,减少重复加载。
- 降低资源冗余:避免多个入口文件加载相同的模块,减少重复代码。
⚙️ 配置详解
optimization: {splitChunks: {chunks: 'all',cacheGroups: {libs: {name: 'chunk-libs',test: /[\\/]node_modules[\\/]/,priority: 10,chunks: 'initial'},elementUI: {name: 'chunk-elementUI',priority: 20,test: /[\\/]node_modules[\\/]_?element-ui(.*)/},commons: {name: 'chunk-commons',test: resolve('src/components'),minChunks: 3,priority: 5,reuseExistingChunk: true}}}
}
1. chunks: 'all'
此配置表示对所有类型的代码(同步和异步)进行分割
。相比于默认的 async
,它能更全面地优化代码结构,提升加载效率。
2. cacheGroups
cacheGroups
用于定义如何将模块分组到不同的 chunk 中。每个分组都有自己的规则和优先级
。(Rspack)
a. libs
分组
name: 'chunk-libs'
:生成的 chunk 名称为chunk-libs
。test: /[\\/]node_modules[\\/]/
:匹配所有在node_modules
目录下的模块。priority: 10
:优先级为 10,确保在默认分组前处理。chunks: 'initial'
:仅处理初始加载的模块,避免将异步模块打包进来。
此配置将第三方库(如 Vue、Axios 等)打包到一个独立的 chunk 中,便于缓存和管理。
b. elementUI
分组
name: 'chunk-elementUI'
:生成的 chunk 名称为chunk-elementUI
。test: /[\\/]node_modules[\\/]_?element-ui(.*)/
:匹配element-ui
相关的模块,兼容不同的包管理方式(如 cnpm)。priority: 20
:优先级高于libs
,确保element-ui
单独打包。
将 element-ui
单独打包,有助于更好地利用缓存,避免频繁更新导致的缓存失效。
c. commons
分组
name: 'chunk-commons'
:生成的 chunk 名称为chunk-commons
。test: resolve('src/components')
:匹配src/components
目录下的模块。minChunks: 3
:当一个模块被至少三个 chunk 引用时,才会被提取到chunk-commons
中。priority: 5
:优先级为 5,低于libs
和elementUI
。reuseExistingChunk: true
:如果当前 chunk 包含已被提取的模块,则复用已有的 chunk,避免重复打包。
此配置有助于提取项目中重复使用的组件,减少代码冗余。
🎯 面试官可能提出的问题及回答
Q1: 为什么要将 element-ui
单独打包?
A:element-ui
是一个体积较大的 UI 组件库,且更新频率较低。将其单独打包可以利用浏览器的缓存机制,减少用户重复下载,提高加载速度。此外,单独打包还便于在需要时进行按需加载,优化首屏加载性能。
Q2: minChunks: 3
的作用是什么?
A:minChunks: 3
表示当一个模块被至少三个 chunk 引用时,才会被提取到公共的 chunk-commons
中。这样可以避免将只被少数页面使用的模块提取出来,导致额外的 HTTP 请求,影响加载性能。
Q3: 如何设置 priority
,它的作用是什么?
A:priority
用于设置各个 cacheGroups
的处理优先级。当一个模块符合多个分组的条件时,优先级高的分组会先处理。例如,elementUI
的优先级为 20,高于 libs
的 10,因此 element-ui
模块会被打包到 chunk-elementUI
中,而不是 chunk-libs
。
Q4: reuseExistingChunk: true
有什么作用?
A:reuseExistingChunk: true
表示如果当前 chunk 包含的模块已经被提取到其他 chunk 中,则直接复用已有的 chunk,避免重复打包。这有助于减少最终生成的文件体积,提升加载效率。
✅ 总结
通过合理配置 Webpack 的 splitChunks
,可以有效地优化项目的加载性能和缓存策略。在面试中,清晰地解释各个配置项的作用,以及它们如何协同工作,能够展示您对前端构建工具的深入理解和实际应用能力。
如需进一步了解 Webpack 的其他优化策略,欢迎继续提问。
要提升页面首屏加载时间,可以从懒加载、代码分割和缓存策略三方面入手,协同优化资源加载和渲染流程,从而显著改善用户体验。以下是具体的优化建议:
懒加载、代码分割、缓存、压缩和网络优化
要全面提升 Vue + Webpack 项目的首屏加载性能,可以从以下五个方面进行优化:懒加载、代码分割、缓存策略、资源压缩和网络优化。下面将逐一详解,并提供相应的配置示例。
1. 懒加载(Lazy Loading)
懒加载可以延迟加载非首屏必需的资源,减少初始加载体积。
Vue 组件懒加载
使用 Vue 的异步组件功能,结合 Webpack 的动态导入,实现组件的按需加载:(极客日志)
import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() => import('./components/AsyncComponent.vue'));
在 Vue Router 中,也可以通过动态导入实现路由组件的懒加载:
const routes = [{path: '/about',component: () => import('./views/About.vue'),},
];
图片懒加载
对于图片资源,可以使用 v-lazy
指令(需引入相应插件)或原生的 loading="lazy"
属性实现懒加载:
<img v-lazy="imageSrc" alt="Lazy Loaded Image" />
<!-- 或 -->
<img src="image.jpg" loading="lazy" alt="Lazy Loaded Image" />
2. 代码分割(Code Splitting)
代码分割可以将应用拆分为多个小块,实现按需加载,提升加载效率。
Webpack 配置示例
在 vue.config.js
中配置 splitChunks
:(xiaocuo.wang)
module.exports = {configureWebpack: {optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,name: 'chunk-vendors',priority: -10,chunks: 'initial',},common: {name: 'chunk-common',minChunks: 2,priority: -20,chunks: 'initial',reuseExistingChunk: true,},},},},},
};
此配置将第三方库和公共模块分别打包,减少主包体积。(Oryoy)
3. 缓存策略(Caching Strategy)
合理的缓存策略可以减少重复加载,提高加载速度。
文件命名带 Hash
在 Webpack 的输出配置中,使用 [contenthash]
:
output: {filename: '[name].[contenthash].js',chunkFilename: '[name].[contenthash].js',
},
这样可以在文件内容变化时生成新的文件名,确保浏览器加载最新资源。
使用 Service Worker
引入 Service Worker 实现离线缓存和资源预缓存,提升加载性能。
4. 资源压缩(Compression)
压缩资源可以减少文件体积,加快传输速度。
Gzip 压缩
使用 compression-webpack-plugin
插件进行 Gzip 压缩:(Oryoy)
const CompressionWebpackPlugin = require('compression-webpack-plugin');module.exports = {configureWebpack: config => {if (process.env.NODE_ENV === 'production') {config.plugins.push(new CompressionWebpackPlugin({algorithm: 'gzip',test: /\.(js|css|html)$/,threshold: 10240,minRatio: 0.8,}));}},
};
图片压缩
使用 image-webpack-loader
对图片进行压缩:(Oryoy)
module.exports = {chainWebpack: config => {config.module.rule('images').use('image-webpack-loader').loader('image-webpack-loader').options({mozjpeg: { progressive: true, quality: 65 },optipng: { enabled: true },pngquant: { quality: [0.65, 0.90], speed: 4 },gifsicle: { interlaced: false },});},
};
5. 网络优化(Network Optimization)
优化网络请求可以进一步提升加载性能。
使用 CDN
将第三方库通过 CDN 引入,减少主包体积:(Oryoy)
module.exports = {configureWebpack: {externals: {vue: 'Vue','vue-router': 'VueRouter',axios: 'axios',},},
};
在 index.html
中引入 CDN 链接:(思否)
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js"></script>
启用 HTTP/2
在服务器配置中启用 HTTP/2,利用其多路复用特性,加快资源加载速度。(Oryoy)
通过以上优化策略的综合应用,可以显著提升 Vue + Webpack 项目的首屏加载性能,改善用户体验。
相关文章:
前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读
按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述: 在现代 Web 开发中,性能不再是锦上添花,而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能,我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…...
Flink 系列之十五 - 高级概念 - 窗口
之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,…...
控制台打印带格式内容
1. 场景 很多软件会在控制台打印带颜色和格式的文字,需要使用转义符实现这个功能。 2. 详细说明 2.1.转义符说明 样式开始:\033[参数1;参数2;参数3m 可以多个参数叠加,若同一类型的参数(如字体颜色)设置了多个&…...
Linux为啥会重新设置中断请求号与中断向量号之间的关系?
Linux内核重新设置中断请求号(IRQ)与中断向量号之间的关系,主要出于以下核心原因和设计考量: 1. 硬件多样性与抽象需求 硬件中断号(HW Interrupt ID)的差异 不同处理器架构的中断控制器(…...
自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例
自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例 目录 自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例一、连续词袋( Cont…...
计算机网络笔记(二十二)——4.4网际控制报文协议ICMP
4.4.1ICMP报文的种类 ICMP(Internet Control Message Protocol)是IP协议的辅助协议,主要用于传递控制消息、错误报告和诊断信息。其报文分为两大类:查询报文和错误报告报文。 1. 错误报告报文(Error Messages&#x…...
【AI论文】作为评判者的感知代理:评估大型语言模型中的高阶社会认知
摘要:评估大型语言模型(LLM)对人类的理解程度,而不仅仅是文本,仍然是一个开放的挑战。 为了弥合这一差距,我们引入了Sentient Agent作为评判者(SAGE),这是一个自动评估框…...
Kubernetes生产实战(二十七):精准追踪Pod数据存储位置
在生产环境中,快速定位Pod数据的物理存储位置是运维人员的基本功。本文将揭秘Kubernetes存储系统的核心原理,并提供一套经过实战检验的定位方法体系。 一、存储架构全景图 K8S存储架构 Pod --> Volume Mount --> PVC --> PV --> Storage P…...
极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎
在生成式AI与行业大模型的双重驱动下,人工智能正以前所未有的速度重构互联网产业生态。从内容创作、用户交互到商业决策,AI技术渗透至产品研发、运营的全链条,推动效率跃升与创新模式变革。然而,面对AI技术迭代的爆发期࿰…...
[SIGPIPE 错误] 一个 Linux socket 程序,没有任何报错打印直接退出程序
1. 问题 在编写一个程序的时候,当然程序很复杂,遇到了一个 Linux socket 程序,没有任何报错打印直接退出程序,但是在程序里面我有很多 error log ,在程序退出的时候完全没有打印。为了说明问题,我编写了一…...
Qt 界面优化(绘图)
目录 1. 绘图基本概念2. 绘制各种形状2.1 绘制线段2.2 绘制矩形2.3 绘制圆形2.4 绘制文本2.5 设置画笔2.6 设置画刷 3. 绘制图片3.1 绘制简单图片3.2 平移图片3.3 缩放图片3.4 旋转图片 4. 其他设置4.1 移动画家位置4.2 保存/加载画家的状态 5. 特殊的绘图设备5.1 QPixmap5.2 Q…...
AQS(AbstractQueuedSynchronizer)解析
文章目录 一、AQS简介二、核心设计思想2.1 核心设计思想回顾2.2 CLH锁队列简介2.3 AQS对CLH队列的改动及其原因 三、核心组件详解3.1 state 状态变量3.2 同步队列 (FIFO双向链表) 四、核心方法深度解析4.1 获取同步状态 (独占模式) - acquire(int arg)4.2 释放同步状态 (独占模…...
Java并发编程常见问题与陷阱解析
引言 随着计算机硬件技术的飞速发展,多核处理器已经变得普遍,Java并发编程的重要性也日益凸显。然而,多线程编程并非易事,其中充满了许多潜在的问题和陷阱。作为一名Java开发工程师,掌握并发编程的常见问题及其解决方案…...
DEEPPOLAR:通过深度学习发明非线性大核极坐标码(1)
原文:《DEEPPOLAR: Inventing Nonlinear Large-Kernel Polar Codes via Deep Learning》 摘要 信道编码设计的进步是由人类的创造力推动的,而且恰如其分地说,这种进步是零星的。极性码是在Arikan极化核的基础上开发的,代表了编码…...
Java多态详解
Java多态详解 什么是多态? 比如我们说:“驾驶一辆车”,有人开的是自行车,有人开的是摩托车,有人开的是汽车。虽然我们都说“开车”,但“怎么开”是由具体的车类型决定的:“开”是统一的动作&a…...
go程序编译成动态库,使用c进行调用
以下是使用 Go 语言打包成 .so 库并使用 C 语言调用的完整步骤: 1. Go 语言打包成 .so 库 (1)编写 Go 代码 创建一个 Go 文件(如 calculator.go),并定义需要导出的函数。导出的函数名必须以大写字母开头…...
iVX:图形化编程与组件化的强强联合
在数字化浪潮中,软件开发范式正经历着从文本到图形的革命性转变。iVX 作为国产可视化编程领域的领军者,以 “图形化逻辑 组件化架构” 的双重创新,重新定义了软件开发的效率边界。其技术突破不仅体现在开发方式的革新,更通过一系…...
华为配置篇-RSTP/MSTP实验
MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP(快速生成树协议) RSTP(Rapid Spanning Tree Protocol)是 STP 的改进版本,基于 IEEE 802.1w 标准,核心目标是解决传统 STP 收敛速度慢的问…...
端口号被占用怎么解决
windows环境下端口号被占用怎么解决 win r 快捷键打开cmd输入netstat -ano|findstr 端口号 通过这个命令找到pidtaskkill /pid pid端口号 /t /f 如下图所示 命令解读 netstat 是一个网络统计工具,它可以显示协议统计信息和当前的TCP/IP网络连接。 -a 参数告诉 nets…...
GO语言-导入自定义包
文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南(包含两种方式): 1. 项目目录结构 方法1:适用于Go 1.11 &#…...
ES常识5:主分词器、子字段分词器
文章目录 一、主分词器:最基础的文本处理单元主分词器的作用典型主分词器示例 二、其他类型的分词器:解决主分词器的局限性1. 子字段分词器(Multi-fields)2. 搜索分词器(Search Analyzer)3. 自定义分词器&a…...
NoSQL数据库技术与应用复习总结【看到最后】
第1章 初识NoSQL 1.1 大数据时代对数据存储的挑战 1.高并发读写需求 2.高效率存储与访问需求 3.高扩展性 1.2 认识NoSQL NoSQL--非关系型、分布式、不提供ACID的数据库设计模式 NoSQL特点 1.易扩展 2.高性能 3.灵活的数据模型 4.高可用 NoSQL拥有一个共同的特点&am…...
单片机-STM32部分:12、I2C
飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议,又称I2C协议,是由PHILP公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备,IIC属于半双工同步通信方式。 IIC是一种同步…...
【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格
1 时态的单词构成 1.1 现在 1.1.1 一般现在时态 动词原形动词原形s(第三人称单数) 1.1.1.1 表达事实 I eat carrots. 我吃胡萝卜:我是吃胡萝卜这种食物的.(这个是事实陈述) The rabbit eats carrots. 兔子吃胡萝卜…...
【质量管理】什么是过程?
在文章【质量管理】谁是顾客?什么是质量链?-CSDN博客 中我们了解了什么是顾客,顾客不仅仅是企业以外的人,在企业的内部我们也有大大小小的顾客。并且我们了解了什么是质量链,企业内部的各种供给方和客户形成了质量链。…...
效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验
在日常文档处理与数字办公的场景中,PDF 文件依然是主流格式之一。从合同审批、项目文档、财务报表,到技术方案和用户手册,PDF 的编辑、转换、标注、归档需求始终存在。 面对这些需求,越来越多用户希望有一款功能完整、跨平台、智…...
Java对象内存布局和对象头
1、面试题 1)说下JUC,AQS的大致流程 CAS自旋锁,是获取不到锁就一直自旋吗? 2)CAS和synchronized区别在哪里,为什么CAS好,具体优势在哪里? 3)sychro…...
Vue 跨域解决方案及其原理剖析
在现代 Web 开发中,跨域问题是前端开发者经常面临的挑战之一。当使用 Vue.js 构建应用时,跨域请求的处理尤为重要。本文将深入探讨 Vue 解决跨域的多种方法及其背后的原理,帮助开发者更好地理解和应对这一常见问题。 一、跨域问题概述 1. 同…...
TikTok 互动运营干货:AI 助力提升粘性
在 TikTok 运营的众多环节中,与用户的互动是建立紧密联系、提升账号粘性的关键所在。及时且真诚地回复评论和私信,能让用户切实感受到你的关注与尊重,从而极大地增强他们对你的好感与粘性。对于用户提出的问题,要以耐心、专业的态…...
Kids A-Z安卓版:儿童英语启蒙的优质选择
Kids A-Z安卓版 是一款由北美知名分级读物厂商 Learning A-Z 官方推出的英语分级学习应用,也被称为 Raz-Kids app。它专为 K-5 年级的学生设计,提供丰富的英语学习资源和互动学习体验,帮助孩子们在轻松愉快的环境中提升英语能力。通过动画、互…...
接口继承与扩展的使用技巧
在 TypeScript 中,接口继承和扩展是非常强大且灵活的功能,可以帮助我们更高效地管理类型和提高代码的可重用性。接口继承使得一个接口可以从另一个接口继承属性和方法,而接口扩展允许我们通过组合多个接口来构建更复杂的结构。这些特性使得 T…...
【React】Craco 简介
Craco 简介 Craco (Create React App Configuration Override) 是一个用于自定义 Create React App (CRA) 配置的工具,无需 eject(弹出)项目。 为什么需要 Craco Create React App 虽然提供了零配置的 React 开发体验,但其配置…...
HTML5中的Microdata与历史记录管理详解
Microdata 简介 Microdata 是 HTML5 引入的一种标记方式,用于在网页中嵌入机器可读的语义信息。通过使用 Microdata,开发者可以在 HTML 元素中添加特定的属性,以便搜索引擎和其他工具更好地理解网页内容。 Microdata 的核心属性包括 itemsc…...
UNet网络 图像分割模型学习
UNet 由Ronneberger等人于2015年提出,专门针对医学图像分割任务,解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示:编码器进行了4步&…...
Babel 深度解析:现代 JavaScript 开发的桥梁
1. 什么是 Babel? Babel 是一个 JavaScript 编译器(又称转译器),核心使命是解决 JavaScript 的环境兼容性问题。它允许开发者使用最新的语言特性(如 ES6、JSX、TypeScript),同时将代码转换为旧…...
MyBatis源码解读2(2.1、核心对象)
二、MyBatis的核心对象 2.1、核心对象 2.1、MappedStatement MyBatis其实是对JDBC的进一步封装,我们都知道JDBC有几个重要的对象: StatementPrepared StatementCallable StatementResultSet Statement、Prepared Statement、Callable Statement分别…...
03.three官方示例+编辑器+AI快速学习webgl_animation_multiple
本实例主要讲解内容 这个示例展示了Three.js中骨骼动画的高级应用技巧,重点演示了如何使用SkeletonUtils.clone()方法复制模型,并展示了两种不同的骨骼动画管理方式: 独立骨骼模式:每个模型拥有独立的骨骼结构,可播放…...
无锁秒杀系统设计:基于Java的高效实现
引言 在电商促销活动中,秒杀场景是非常常见的。为了确保高并发下的数据一致性、性能以及用户体验,本文将介绍几种不依赖 Redis 实现的无锁秒杀方案,并提供简化后的 Java 代码示例和架构图。 一、基于数据库乐观锁机制 ✅ 实现思路…...
MyBatis快速入门——实操
默认:电脑搭建好了Maven环境 本次入门实验使用的idea版本:ideaU2022.1 目录 一:前期准备工作 1. 创建一个springboot工程 2. Maven环境配置 3. 在mysql数据库中创建一个user表 4. 编写实体类User 二: 引入MyBatis的相关依赖…...
假如你的项目是springboot+vue怎么解决跨域问题
1. 前端代理(开发环境推荐) 适用场景:Vue 开发环境调试时,避免直接请求后端接口的跨域问题。 实现步骤: 在 Vue 项目的 vue.config.js 中配置代理: module.exports {devServer: {proxy: {/api: { // 代理…...
OpenResty反向代理
通过在 OpenResty 的配置文件中定义不同的 location 块,将匹配特定 URL 路径的请求转发到不同的后端 FastAPI 应用(即使它们运行在不同的端口或甚至是不同的服务器/容器上)。 核心思路: 多个 FastAPI 应用实例: 你的每…...
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions) 在 Python 中,条件表达式(conditional expressions)提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...
【Typenum】 3 类型位运算(bit.rs)
一、源码 代码定义了一个类型级别的位(bit)系统,主要用于编译时的类型运算。 //! 类型级比特位实现 //! //! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础 //! //! 已实现的**类型运算符**: //! //! - …...
python:trimesh 用于 STL 文件解析和 3D 操作
python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...
stm32week15
stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller,嵌套向量中断控制器,属于内核(M3/4/7) 中断向量表:定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,中断向量表定…...
数据库分库分表实战指南:从原理到落地
1. 为什么要分库分表? 1.1 单库瓶颈表现 存储瓶颈:单表数据超过5000万行,查询性能急剧下降性能瓶颈:单库QPS超过5000后响应延迟显著增加可用性风险:单点故障导致全系统不可用 1.2 突破性优势 --------------------…...
雷达工程师面试题目
雷达工程师面试题目 一、基础知识类 简述雷达的工作原理 请从电磁波的发射、传播、反射以及回波接收处理等环节,详细阐述雷达如何实现对目标的探测、定位与跟踪。 常见雷达体制及其特点 列举至少三种常见的雷达体制(如脉冲雷达、连续波雷达、相控阵雷达等),并分别说明…...
JVM-类加载子系统
最近在学习JVM,分模块整理一下JVM的笔记 目录 类加载子系统 一、加载 二、链接 1.验证 2.准备 3.解析 三、初始化 类加载子系统 类加载子系统负责将字节码文件加载到虚拟机中,我们正常编写完一个Java类并在前端编译器编译后会生成一个对应的字节码…...
从0开始学习大模型--Day06--大模型的相关网络架构
云服务器 在平时,我们总能听到诸如用服务器跑数据、模型,或者是搭建服务器之类的话,实际上,它相当于一台算力、内存、运行内存等各个方面都很强大的电脑,只需要我们用自己的电脑通过互联网链接他就能使用它࿰…...
控制LED灯设备
本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯,展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为:base_code/linux_app/led/sys_class_leds。 9.1. LED子系统 在Linux系统中,绝大多数硬件设备都有…...