使用 Vue 开发 VS Code 插件前端页面(上)
本文的方案主要参考了这篇博客:
Vscode 的 extension webview 开发示例: Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址:
github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-with-vue
下篇链接:
使用 Vue 开发 VS Code 插件前端页面(下)https://blog.csdn.net/Hi_KER/article/details/147640591默认读者对 VS Code 插件开发有一定了解。如果对插件开发有不明白的内容,可以参考官方文档:VSCode Extension API。
前言
之前做 VS Code 插件时,webview 页面刚开始用 html+css+js 写,只要页面或逻辑稍微复杂一些修改和维护就会非常麻烦。因此对于页面较为复杂的插件,可以使用前端框架来简化页面的开发。在 VS Code 插件开发中,比较推荐的前端框架是 Vue 和 React。比如开源智能代码插件 Continue 的前端页面就是用 React 构建的。
在我第一次尝试用前端框架构建 webview 页面时,在网上找了好多博客,很多给的方法或是比较麻烦,或是根本无法实现。在根据网上内容摸索了一天后,我才基本整合出了一套适合自己的方法。整体方法主要参考了上面那篇博客,但是对博客的方案进行了较大修改和简化,对初学者来说应该会更简单。
说明
这一篇博客只是整个方案的一部分,介绍如何在同一个文件夹下构建插件子项目、和前端子项目,并让它们能独立运行起来。
这篇博客得到的项目为(注意是提交历史中的最早一次,不包含下节的内容): vscode-webview-with-vue | first commithttps://github.com/HiMeditator/vscode-webview-with-vue/tree/a495a3b5246e1da9b9dfca6161f07a0f0a0150f6经过这篇博客后得到的项目结构如下,其中红色加粗字体的文件是需要修改的。刚看到这幅图你可能会看不懂,先不要管这幅图,按博客的指导自己做一遍,在过程中可以回看这幅图,你应该就能慢慢明白每个文件的含义了。
背景知识
webview 的限制
首先需要知道 VS Code 插件中的 webview 页面和一般网页不同,有很多的限制,其中最重要的两点限制是:
-
资源加载限制:webview 默认情况下不允许加载外部资源,所有资源应该打包在你的扩展中,并通过 asWebViewUri 方法转换为正确的 URI 来引用
-
通信限制:webview 与 VS Code 扩展之间通过 postMessage API 进行通信,这意味着你不能直接调用 VS Code API,必须通过消息传递的方式来请求操作或获取数据(其实可以不使用提供的通信接口而采取其他方式,比如设置一个本地服务器或者使用 WebSocket 进行通信,但使用非标准的通信方法可能会导致代码更复杂,并且可能引入额外的风险)
pnpm 与 npm
本方案使用 pnpm 构建项目,因此需要了解 pnpm 和 npm 的基本概念及其区别:
npm(Node Package Manager) 是 Node.js 官方自带的包管理工具,广泛用于 JavaScript 项目的依赖安装、版本管理和模块分发。它通过将依赖包下载并存储在项目中的 node_modules 文件夹中来工作,默认情况下,每个项目都会独立地下载和保存所有依赖项,这可能会导致磁盘空间的浪费和重复下载。
pnpm(Performant npm) 是一个与 npm 兼容但更高效、快速的包管理器。它的核心优势在于采用了“硬链接”和“内容可寻址存储”的方式来管理依赖包。这意味着 pnpm 会将下载的包存储在全局仓库中,并在不同项目之间共享这些依赖,从而大幅减少磁盘占用并提升安装速度。此外,pnpm 在依赖结构上引入了“扁平化 + 虚拟化”的 node_modules 管理机制,避免了传统嵌套结构可能带来的问题,同时保持了良好的兼容性。
monorepo 的概念
Monorepo(Monolithic Repository 的缩写),即单体仓库,是一种软件开发实践,指的是将多个相关或独立的项目、库或者模块的所有源代码存放在一个单一的版本控制系统仓库中,而不是为每个项目或模块创建单独的仓库。我们要构建的项目就是 monorepo,其包含多个子项目(插件项目、前端项目)。
在 monorepo 项目中选择使用 pnpm 而不是 npm,主要是因为 pnpm 提供了一些针对 monorepo 优化的功能和特性,使得它在这种场景下比 npm 更具优势。
项目初始化
环境中没有 pnpm 的需要先安装:
npm install -g pnpm
首先创建项目文件夹,在项目文件夹中打开命令行,执行
pnpm init
可以看到文件夹中新增了 package.json 文件。
然后创建 pnpm-workspace.yaml 文件,写入如下内容:
packages:- 'packages/*'
该文件是 pnpm 包管理器中用于定义工作区(workspace)配置的文件。写入的内容告诉 pnpm 在 packages 文件夹下每一个子文件夹都是一个独立的包,
然后创建 packages 文件夹,该文件夹用于存放每个子项目。 完成后项目结构如下:
创建插件子项目
进入 packages 文件夹,创建插件项目,参考的执行过程如下:
PS D:\Projects\vscode-webview-with-vue> cd .\packages
PS D:\Projects\vscode-webview-with-vue\packages> yo code_-----_ ╭──────────────────────────╮| | │ Welcome to the Visual │|--(o)--| │ Studio Code Extension │`---------´ │ generator! │( _´U`_ ) ╰──────────────────────────╯/___A___\ /| ~ | __'.___.'__ ´ ` |° ´ Y ` ? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? extension-example
? What's the identifier of your extension? extension-example
? What's the description of your extension?
? Initialize a git repository? No
? Which bundler to use? webpack
? Which package manager to use? pnpm
在 packages 文件夹执行 yo code 来构建插件,注意构建选项中不要选择创建 git 仓库,打包工具选择 webpack,包管理工具选择 pnpm。
创建好后在根目录执行 pnpm install 安装依赖。
配置插件子项目
修改启动路径
创建好插件项目后,将插件项目的 .vscode 文件夹移动到项目根目录下。
然后修改 .vscode/launch.json 中的路径,将 args 和 outFiles 中的路径中新增 /packages/[name],其中 [name] 是你插件项目的名称。修改路径的位置有两处,具体添加的位置如下图所示。
对于上述操作,移动 .vscode 文件夹到根目录是为了能在根目录对插件项目进行操作,修改路径是因为移动的配置文件的位置所以需要调整。
修改插件入口路径
打开插件文件夹下的 webpack.config.js 文件,修改 output 中的 path 属性,添加一个子文件夹,名称可以自己定。如下图。
打开插件文件夹下的 package.json 文件,修改 main 属性中的路径,同样改为添加了子文件夹后的路径,如下图。
经过上面的操作,插件构建时将打包到插件文件夹下的 /dist/extension 文件夹中,这样做的原因是后面前端代码也会打包到这个 /dist 文件夹,因此需要建立子文件夹,保证构建的结构性。
添加调试指令
打开项目根目录下的 package.json 文件,在 scripts 中新增 watch 指令,其中 [name] 是插件名称。
"watch": "pnpm run -F [name] watch"
通过上述操作,在项目根目录下执行 pnpm watch 实际上会执行插件项目中的 watch 脚本。
尝试运行插件
完成上述操作后,尝试运行插件(Windows 用户按 F5,或者在上方菜单找到 Run -> Start Debugging 选项运行)。如果配置正确,那么插件即可正常运行。
创建 Vue 前端子项目
注意 WebView 和 WbeView View 是不同的概念,前者的页面是在编辑器(Editor)区域显示的,而后者是在主侧边栏(Primary Sidebar)或次侧边栏(Secondary Sidebar)或面板(Panel)中显示的。你需要根据需要创建前端子项目,如果你的插件只需要其中一种页面,创建一个就行了。
创建 Webview 前端子项目
这个子项目是用于编辑器区的页面的。
在 packages 文件夹下执行:
pnpm create vue@latest
构建 Vue3 项目,注意构建选项中不要选择 Router,因为不建议在 VS Code 插件页面中使用路由。一方面是使用路由可能导致 webview 资源载入不正确;另一方面插件开发本来就是要页面尽量简洁,没有使用路由的必要,可以用其他方案代替。
一个供参考的构建选项,注意构建选项中需要选择 Pinia,因为后续与插件通信需要用到。
PS D:\Projects\vscode-webview-with-vue\packages> pnpm create vue@latest
┌ Vue.js - The Progressive JavaScript Framework
│
◇ Project name (target directory):
│ gui-webview
│
◆ Select features to include in your project: (↑/↓ to navigate, space to select, a to toggle all, enter to confirm)
│ ◼ TypeScript
│ ◻ JSX Support
│ ◻ Router (SPA development)
│ ◼ Pinia (state management)
│ ◻ Vitest (unit testing)
│ ◻ End-to-End Testing
│ ◻ ESLint (error prevention)
│ ◻ Prettier (code formatting)
└
创建好后在根目录执行 pnpm install 安装依赖。
创建 Webview View 前端子项目
这个子项目是用于侧边栏或面板的。
创建过程同上。创建好后在根目录执行 pnpm install 安装依赖。
创建好之后,现在的项目结构如下:
配置 Vue 前端子项目
修改构建目标路径
打开 Vue 前端子项目的 vite.config.ts 文件,按下图进行修改。一个是注释掉 vueDevTools(不使用 vue 提供的调试工具,可选)。另一个是修改构建路径为插件目录下的 /dist 文件夹下的子文件夹,可以自行命名,这里使用的名称为该前端项目的名称: gui-webview。
如果你创建了两个前端子项目,另一个子项目也进行类似的操作即可,注意构建文件夹不要重名。
添加启动和构建指令
打开根目录下的 package.json 文件,添加前端子项目的启动和构建指令,其中 [proj0] 和 [proj1] 分别是你对两个前端子项目的命名。
"dev:0": "pnpm run -F [proj0] dev",
"dev:1": "pnpm run -F [proj1] dev",
"build:0": "pnpm run -F [proj0] build",
"build:1": "pnpm run -F [proj1] build",
"build": "pnpm build:0 && pnpm build:1",
添加了上述五条指令后,你可以使用 pnpm dev:0 或 pnpm dev:1 启动第一个或第二个前端项目。使用 pnpm build:0 或 pnpm build:1 打包第一个或第二个前端项目。或者使用 pnpm build 同时打包两个前端项目。
检验是否成功
在根目录执行 pnpm dev:0 或 pnpm dev:1 看是否能启动前端项目:
在根目录执行 pnpm build 看插件目录下的 dist 文件夹下是否有前端项目构建的子目录:
总结
经过上面的操作,你已经得到了处于同一个文件夹下的能分别独立运行的插件和前端页面子项目,且它们构建好的内容也在同一个文件夹下:插件文件夹下的 dist 文件夹。看到这里你可以回看一下前面的项目结构图,现在你应该对它有了更深入的了解。
这篇博客得到的项目为(注意是提交历史中的最早一次,不包含下节的内容):
vscode-webview-with-vue | first commithttps://github.com/HiMeditator/vscode-webview-with-vue/tree/a495a3b5246e1da9b9dfca6161f07a0f0a0150f6下节将介绍如何将构建的前端页面嵌入插件以及前端页面和插件的通信。
相关文章:
使用 Vue 开发 VS Code 插件前端页面(上)
本文的方案主要参考了这篇博客: Vscode 的 extension webview 开发示例: Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址: github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-w…...
Vue Router路由原理
Vue Router 是 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,使得构建单页应用(SPA)变得非常容易。Vue Router 的主要功能包括动态路由匹配、嵌套路由、编程式导航、命名路由、路由守卫等 Vue Router 原理 单页应用&#x…...
Tauri v1 与 v2 配置对比
本文档对比 Tauri v1 和 v2 版本的配置结构和内容差异,帮助开发者了解版本变更并进行迁移。 配置结构变化 v1 配置结构 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…...
详解 MyBatis-Plus 框架中 QueryWrapper 类
QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper? 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...
小米MiMo-7B大模型:解锁推理潜力的新传奇!
在大语言模型(LLMs)蓬勃发展的时代,推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文,介绍了小米的MiMo-7B模型,它通过独特的预训练和后训练优化,展现出强大的推理实力,快来一探究…...
联邦学习的收敛性分析(全设备参与,不同本地训练轮次)
联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...
硬件工程师面试常见问题(10)
第四十六问:锁存器,触发器,寄存器三者的区别 触发器:能够存储一位二值信号的基本单元电路统称为 "触发器"。(单位) 锁存器:一位触发器只能传送或存储一位数据,而在实际工…...
1295. 统计位数为偶数的数字
题目 解法一 遍历数组挨个判断元素位数并统计(我的第一想法) class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...
3.1/Q1,Charls最新文章解读
文章题目:Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI:10.3389/fmed.2025.1493359 中文标题:认知障碍老年人的社会参与模…...
楼宇智能化四章【期末复习】
四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...
Splunk 使用Role 实现数据隔离
很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...
Learning vtkjs之ImplicitBoolean
隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数(如平面、球体、圆柱体和盒子)进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数(所有函数都使用相同的操作进行组合)。 支持的操作:‘UNION…...
LabelVision - yolo可视化标注工具
LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式,并且可以输出JSON、COCO等多种数据格式,方便与其他软件和框架进行集成和互操作。 通过它可以很轻易的对图像进行标注,适合Y…...
系统分析师-第十五章
学习目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点,避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...
大连理工大学选修课——机器学习笔记(3):KNN原理及应用
KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻(KNN)贝叶斯模型最小均值距离最大熵模型条件随机场(CRF)隐马尔可夫模型(HMM) 基于判别式的方法 决策树(DT)感知机…...
09 Python字典揭秘:数据的高效存储
文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中,字典(dict&#x…...
20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】
【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统,原因不明】 Y:…...
第五部分:进阶项目实战
在前面的学习中,我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在,我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术,并介绍一些新的概念和工具&a…...
【Linux】记录一个有用PS1
PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例,包含用户名、主机名、路径、时间、Git 分支和退出状态提示: # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...
【SpringBoot】基于mybatisPlus的博客管理系统(2)
目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌(token) Controller Service Mapper 2.实现强制登录 定义拦截器: 配置拦截器: 1.实现用户登录 在之前的项目登录中,我使用的是Session传递用户信息实现校验…...
免费在Colab运行Qwen3-0.6B——轻量高性能实战
Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...
精益数据分析(35/26):SaaS商业模式关键指标解析
精益数据分析(35/26):SaaS商业模式关键指标解析 在创业与数据分析的征程中,我们持续探索不同商业模式的运营奥秘。今天,我们带着共同进步的期望,深入研读《精益数据分析》,聚焦SaaS商业模式&am…...
【论文速读】《Scaling Scaling Laws with Board Games》
论文链接:https://arxiv.org/pdf/2104.03113 《Scaling Scaling Laws with Board Games》:探索棋盘游戏中的扩展规律 摘要 如今,机器学习领域中规模最大的实验所需的资源,超出了仅有几家机构的预算。幸运的是,最近的…...
C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同
在数字化技术高速发展的今天,C 凭借其卓越的性能优势和底层控制能力,成为连接上层应用与底层硬件的核心纽带。这种独特定位使其在与 AI 深度学习、Python 生态及硬件加速技术的融合中展现出不可替代的价值,构建起从算法实现到硬件优化的全栈技…...
AdaBoost算法的原理及Python实现
一、概述 AdaBoost(Adaptive Boosting,自适应提升)是一种迭代式的集成学习算法,通过不断调整样本权重,提升弱学习器性能,最终集成为一个强学习器。它继承了 Boosting 的基本思想和关键机制,但在…...
无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下
风扇灯市场热度持续攀升,根据行业数据,风扇灯市场规模从2010年的100亿元增长至2019年的200亿元,年均复合增长率超10%,预计2025年将达30%,借此其利天下有限公司进一步提升了无刷风扇灯驱动方案。 一、性能参数 电压&a…...
数据库系统综合应用与深度实践指南
前言 在当今数据驱动的时代,数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用,数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章,旨在为读者提供从基础到进阶的完整知识体系,涵…...
「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩
先看实现效果: 要实现这个效果,有三个方面的问题需要解决: 第一,输入框的高度扩展,内部子元素会随着锚点,拉伸变形——要解决这个问题,需要将内部元素改变父类,然后增加父类高度&am…...
SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解
在SAP系统中,**COEP表(成本控制对象行项目表)**是成本控制(CO)模块的核心数据表之一,主要用于存储与成本核算相关的详细行项目数据。以下是对其作用的详细解析: 一、 COEP表的核心作用 存储成本…...
crashpad 编译
一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools(此步骤可以跳过 最新工具包已上传下载使用即可) windows下载压缩包,然后放到系统PATH中 下载完以后,基本就是靠depot_tools这个工具集合了&am…...
Windows系统安装Docker(Win10系统升级,然后安装)
有时需要在自己笔记本跑下代码,所以安装Dockers,步骤如下: 1. 升级系统(Windows10专业版或者Windows11) Windows10家庭版装Docker较麻烦,所以我将Win10升级为Win11了(免费)&#x…...
【Fifty Project - D21】
今日完成记录 TimePlan完成情况9:00 - 10:00爬楼梯√12:00 - 14:00Leetcode√14:00 - 15:00《挪威的森林》√ Leetcode 每日一题 今天的每日一题是个easy:给定一个数组,要求统计…...
中央网信办部署开展“清朗·整治AI技术滥用”专项行动
为规范AI服务和应用,促进行业健康有序发展,保障公民合法权益,近日,中央网信办印发通知,在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示,本次专项行动分两个阶…...
《Python实战进阶》 No46:CPython的GIL与多线程优化
Python实战进阶 No46:CPython的GIL与多线程优化 摘要 全局解释器锁(GIL)是CPython的核心机制,它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构,实战演示如何突破GIL限制&#…...
BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来
在机器人技术日益发展的今天,六维力传感器对于提升机器人感知环境、增强操作精度发挥着重要作用。瑞士BOTA Systems是一家专注于机器人传感器技术的公司,致力于为原始设备制造商提供高性能的传感器解决方案。 PixONE是BOTA推出的一款创新的高精度传感器&…...
《PyTorch documentation》(PyTorch 文档)
PyTorch documentation(PyTorch 文档) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一个优化的张量库,用于使用GPU和CPU进行深度学习。) Features described in this documentation are classified by release status: (此…...
数据库的死锁相关(一)
目录 前言 一、什么死锁 二、产生死锁的必要条件 三、死锁发生的具体位置和场景 1. 数据行级别死锁(最常见) 2. 表级别死锁 3. 索引间隙锁死锁(InnoDB特有) 4. 外键约束死锁 5. 元数据锁死锁 6. 内存中的锁结构死锁 7.…...
数据编码(Encoding)
对数据做编码可以减少存储和 I/O开销,常见的技术比如 Dictionary Encoding,Run-Length Encoding,Bitpacking,Delta Encoding,Frame-of-Reference等。 本篇文章对这些编码方案进行介绍,举例说明,最后总结各种encoding的适用场景。 一、Dictionary Encoding(字典编码)…...
Wartales 战争传说 [DLC 解锁] [Steam] [Windows SteamOS]
Wartales 战争传说 [DLC 解锁] [Steam] [Windows & SteamOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表(仅供参考) 《战争传说》 - Pirates of Belerion 《战争传说》 - The Tavern …...
决策树在电信客户流失分析中的实战应用
在当今数据驱动的时代,数据分析和机器学习技术在各行业的应用愈发广泛。电信行业面临着激烈的竞争,客户流失问题成为影响企业发展的关键因素之一。如何准确预测客户是否会流失,并采取相应措施挽留客户,是电信企业关注的重点。决策…...
滚珠丝杆怎么选型?
滚珠丝杆的选型需要考虑多个因素,包括应用需求、性能参数、环境因素等,以确保选型的准确性和合理性。 1、负载:确定设备运行时滚珠丝杆需要承受的静载荷和动载荷,包括轴向载荷和径向载荷,根据实际工作情况计算出最大负…...
HTN77A0原理图提供聚能芯半导体禾润一级代理技术支持免费送样
在电源管理需求日益严苛的当下,禾润 HTN77A0 以卓越性能脱颖而出。它不仅适配多种应用场景,还兼具高效节能与稳定输出,为设备供能带来革新体验。 禾润 HTN77A0 同步降压变换器,凭借5V~130V 超宽输入电压范围,打破传统供…...
linux中sigint和sigterm的区别
SIGINT 和 SIGTERM 是在 Unix 及类 Unix 系统(包括 Linux)中用于进程间通信的信号,它们都可以用于请求进程终止,区别如下: 1、信号编号与定义 在信号机制里,每个信号都有对应的编号,这便于系统…...
errorno 和WSAGetlasterror的区别
errno 和 WSAGetLastError 是用于获取错误代码的机制,但它们应用于不同的编程场景,下面为你详细介绍二者的区别: 应用场景 errno:它是 C 和 C 等编程语言里用于表示系统调用和库函数错误的全局变量。在 Unix、Linux 等类 Unix 系…...
《操作系统真象还原》第十一章——用户进程
文章目录 前言为什么要有TSSTSS简介TSS描述符和TSS结构现代操作系统采用的任务切换方式 定义并初始化TSS修改global.h编写tss.c测试 实现用户进程实现用户进程的原理维护虚拟地址空间,修改thread.h为进程创建页表和3特权级栈,修改memory.c进入特权级3用户…...
第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析
一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …...
ES搜索知识
GET /categories/1/10?name手机 // 按名称过滤 GET /categories/1/10?type电子产品 // 按类型过滤 GET /categories/1/10?name手机&type电子产品 // 组合过滤 查询参数 ApiOperation(value "获取商品分类分页列表")GetMapping("{page}/{limit}")…...
Java高阶程序员学习计划(详细到天,需有一定Java基础)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 Java高阶程序员学习计划(详细到天,需有一定Java基础)第一阶段(30天)Java基础:Java生态工具链:设计模式与编码规范:第二阶段(15天…...
SALOME源码分析: SMESH模块
本文分析SALOME GEOM模块。 注1:限于研究水平,分析难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 一、核心组件 1.1 SMESHGUI 二、关键流程 网络资料 SALOME: Introduction to MESH Modulehttps://docs.salome-platform…...
提高程序灵活性和效率的利器:Natasha动态编译库【.Net】
从零学习构建一个完整的系统 今天推荐一个针对C#动态编译库,动态编译的使用场景有很多: 1、动态代码生成:可以根据用户的输入或者系统配置动态执行C#代码,比如很多Web在线编译器,就是这个原理; 2、代码反…...