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

软件开发中seo公司多少钱

软件开发中,seo公司多少钱,做视频资源网站有哪些,电子书新手学做网站Cline源码分析 --- vscode插件开发与cline的界面系统 vscode插件开发基础知识开发基础‌核心概念核心API调试与发布调试 学习路线React开发界面前端代码分析package.jsonview/title(视图标题栏菜单)‌editor/title(编辑器标题栏菜单&#xff…

Cline源码分析 --- vscode插件开发与cline的界面系统

  • vscode插件开发基础知识
    • 开发基础‌
    • 核心概念
    • 核心API
    • 调试与发布
      • 调试
    • 学习路线
    • React开发界面
    • 前端代码分析
      • package.json
      • view/title(视图标题栏菜单)‌
      • editor/title(编辑器标题栏菜单)‌
      • editor/context(编辑器右键菜单)‌
      • terminal/context(终端右键菜单)‌
      • extension.ts
        • 视图加载机制:
        • 注册菜单点击对应的命令

vscode插件开发基础知识

开发基础‌

‌语言要求‌

主语言:TypeScript(推荐)或 JavaScript
配置文件:JSON(package.json)
‌必备工具‌

Node.js(≥ 16.x)
VS Code(建议最新版)
脚手架工具:

npm install -g yo generator-code

‌## 项目初始化

‌创建项目‌

yo code

选择插件类型(例如:“New Extension (TypeScript)”)

‌项目结构‌
├── .vscode # VS Code 调试配置
├── src
│ └── extension.ts # 插件入口文件
├── package.json # 插件清单文件
├── tsconfig.json # TypeScript 配置
└── node_modules

核心概念

  1. ‌激活事件(Activation Events)‌
    定义插件何时被加载
"activationEvents": ["onCommand:myExtension.helloWorld", // 命令触发加载"onLanguage:javascript",            // 打开JS文件时加载"*"                                  // 启动即加载(不推荐)
]
  1. ‌贡献点(Contribution Points)‌
    通过 package.json 扩展 VS Code 功能:
"contributes": {"commands": [{"command": "myExtension.helloWorld","title": "Hello World"}],"menus": {"editor/context": [{"command": "myExtension.helloWorld","group": "navigation"}]}
}
  1. ‌命令(Commands)‌
    注册命令:
vscode.commands.registerCommand('myExtension.helloWorld', () => {vscode.window.showInformationMessage('Hello World!');
});
  1. ‌生命周期‌
    ‌激活‌:activate() 函数
    ‌销毁‌:返回 deactivate() 清理资源
export function activate(context: vscode.ExtensionContext) {// 初始化代码
}

核心API

‌模块‌ ‌功能‌ ‌常用方法‌
vscode.window 界面交互 showInformationMessage createWebview
vscode.workspace 文件/编辑器操作 openTextDocument onDidChangeTextDocument
vscode.languages 语言支持 registerHoverProvider registerCompletionItemProvider
vscode.debug 调试相关 startDebugging onDidTerminateDebugSession

调试与发布

调试

按 F5 启动调试实例
使用 VS Code 的调试断点
‌发布‌

npm install -g vsce
vsce package  # 生成 .vsix 文件
vsce publish  # 发布到市场

学习路线

‌官方资源‌

插件API文档
示例代码库
‌实战建议‌

从修改官方示例开始
优先使用 TypeScript 获得更好类型提示
善用 Ctrl+Space 查看 API 自动补全

React开发界面

前端代码分析

package.json

		"viewsContainers": {"activitybar": [{"id": "claude-dev-ActivityBar","title": "Cline","icon": "assets/icons/icon.svg"}]},"views": {"claude-dev-ActivityBar": [{"type": "webview","id": "claude-dev.SidebarProvider","name": ""}]}

定义插件的视图id:claude-dev-ActivityBar,以及插件显示图标。插件视图提供者ID:claude-dev.SidebarProvider
菜单注册的代码如下:

"menus": {"view/title": [{"command": "cline.plusButtonClicked","group": "navigation@1","when": "view == claude-dev.SidebarProvider"},{"command": "cline.mcpButtonClicked","group": "navigation@2","when": "view == claude-dev.SidebarProvider"},{"command": "cline.historyButtonClicked","group": "navigation@3","when": "view == claude-dev.SidebarProvider"},{"command": "cline.popoutButtonClicked","group": "navigation@4","when": "view == claude-dev.SidebarProvider"},{"command": "cline.accountButtonClicked","group": "navigation@5","when": "view == claude-dev.SidebarProvider"},{"command": "cline.settingsButtonClicked","group": "navigation@6","when": "view == claude-dev.SidebarProvider"}],"editor/title": [{"command": "cline.plusButtonClicked","group": "navigation@1","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"},{"command": "cline.mcpButtonClicked","group": "navigation@2","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"},{"command": "cline.historyButtonClicked","group": "navigation@3","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"},{"command": "cline.popoutButtonClicked","group": "navigation@4","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"},{"command": "cline.accountButtonClicked","group": "navigation@5","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"},{"command": "cline.settingsButtonClicked","group": "navigation@6","when": "activeWebviewPanelId == claude-dev.TabPanelProvider"}],"editor/context": [{"command": "cline.addToChat","group": "navigation","when": "editorHasSelection"}],"terminal/context": [{"command": "cline.addTerminalOutputToChat","group": "navigation"}]}

view/title(视图标题栏菜单)‌

‌功能定义‌
控制自定义视图(如侧边栏、面板)标题栏的按钮或下拉菜单,常用于扩展视图操作能力。

editor/title(编辑器标题栏菜单)‌

‌功能定义‌
控制编辑器标签页(Tab)右侧的操作区域,用于扩展文件相关操作。

editor/context(编辑器右键菜单)‌

‌功能定义‌
控制代码编辑区域的右键上下文菜单项,常用于代码操作、格式化等场景。

terminal/context(终端右键菜单)‌

‌功能定义‌
控制集成终端(Terminal)的右键上下文菜单项,适用于终端操作增强。

从代码来看主要是view/title和editor/title里面分别定义了当显示为view和activeWebviewPanelId 是的6个菜单,也就是Cline的主菜单项目:新建task,mcp服务器,任务历史,在编辑器打开,Cline账号和设置面板。
以下是 activeWebviewPanelId 与 view 两个上下文条件的核心区别解析:

‌一、作用区域差异‌
‌条件表达式‌	‌作用区域‌	‌典型应用场景‌
"when": "view == claude-dev.SidebarProvider"	‌侧边栏视图容器‌	控制侧边栏自定义视图的显示逻辑(如工具栏按钮)‌
"when": "activeWebviewPanelId == claude-dev.TabPanelProvider"	‌编辑器主区域‌	控制 Webview 面板的激活状态(如标签页操作)‌
‌二、上下文键含义‌
‌view‌对应通过 package.json 的 contributes.views 注册的侧边栏视图容器 ID17
示例配置:
json
Copy Code
"contributes": {"views": {"explorer": [{"id": "claude-dev.SidebarProvider","name": "Claude 侧边栏"}]}
}
‌activeWebviewPanelId‌对应通过代码动态创建的 Webview 面板 ID(vscode.window.createWebviewPanel 的 viewType 参数)‌58
示例代码:
typescript
Copy Code
vscode.window.createWebviewPanel('claude-dev.TabPanelProvider', // 此处定义ID'Claude 面板',vscode.ViewColumn.One
);
‌三、触发场景示例‌
1. ‌侧边栏视图 (view)‌
json
Copy Code
"menus": {"view/title": [{"command": "claude-dev.refreshSidebar","when": "view == claude-dev.SidebarProvider"}]
}
仅在侧边栏的「Claude 侧边栏」视图中显示「刷新」按钮‌17
2. ‌Webview 面板 (activeWebviewPanelId)‌
json
Copy Code
"commands": [{"command": "claude-dev.closePanel","title": "关闭面板","enablement": "activeWebviewPanelId == claude-dev.TabPanelProvider"
}]
当用户聚焦在 claude-dev.TabPanelProvider 面板时,允许执行关闭命令‌58
‌四、关键注意事项‌
‌视图类型限制‌view 仅适用于侧边栏/面板等静态视图容器
activeWebviewPanelId 专用于动态创建的 Webview 交互面板‌58
‌生命周期差异‌侧边栏视图 (view) 在插件激活期间持续存在
Webview 面板 (activeWebviewPanelId) 随用户打开/关闭动态变化‌

extension.ts

这个是插件的入口文件,

方法export function activate(context: vscode.ExtensionContext)定义了插件加载时执行的代码。

视图加载机制:
	context.subscriptions.push(vscode.window.registerWebviewViewProvider(ClineProvider.sideBarId, sidebarProvider, {webviewOptions: { retainContextWhenHidden: true },}),)
以上代码是注册试图提供者的代码,下面是对应vscode机制的解析:
‌一、代码执行阶段的作用‌
typescript
Copy Code
context.subscriptions.push(vscode.window.registerWebviewViewProvider(ClineProvider.sideBarId, sidebarProvider, { webviewOptions: { retainContextWhenHidden: true } })
)1. 注册阶段‌
操作	结果
注册视图类型	将 ClineProvider.sideBarId 加入 VS Code 的可用视图列表
配置持久化选项	retainContextWhenHidden 控制视图隐藏时是否保持 Webview 实例
‌未创建 Webview 实例‌	此时仅注册元信息,不分配任何 DOM 资源
‌2. 触发加载的条件‌
场景	加载时机
用户手动激活视图	点击侧边栏对应图标时创建 Webview
插件主动调用 reveal()	通过 vscode.commands.executeCommand('workbench.view.extension.viewId')
VS Code 恢复上次会话状态	当用户重新打开包含该视图的工作区时自动加载(需配置 "visible": true)
‌二、生命周期控制参数解析‌
‌retainContextWhenHidden 的作用‌
typescript
Copy Code
{ retainContextWhenHidden: true }
值	内存管理策略	适用场景
true	视图隐藏时保留 Webview 的 DOM 状态,再次显示时无需重新初始化	包含复杂表单/图表的交互式视图
false	视图隐藏后立即销毁 Webview 实例,再次显示时触发 resolveWebviewView 重新创建	简单静态内容视图
‌三、视图加载流程验证方法‌
‌1. 调试技巧‌
typescript
Copy Code
// 在 WebviewViewProvider 实现中增加日志
class SidebarProvider implements vscode.WebviewViewProvider {resolveWebviewView(webviewView: vscode.WebviewView) {console.log('Webview 实例化:', Date.now()); // 首次加载时触发}
}2. 行为观察‌
执行注册代码后检查 VS Code 内存占用(无明显增长)
首次点击侧边栏图标时观察到:
内存占用上升
开发者工具中可见新 Webview 的 DOM 元素
‌四、强制预加载的实现方式‌
typescript
Copy Code
// 注册后立即尝试显示视图(不推荐)
setTimeout(() => {vscode.commands.executeCommand('workbench.view.extension.' + ClineProvider.sideBarId);
}, 1000);
方案	优点	缺点
主动显示	确保视图即时可用	破坏用户体验,可能导致界面闪烁
按需加载	节省资源,自然交互	首次显示有短暂延迟(通常 100-300ms)
通过这种机制,VS Code 实现了插件视图的高效资源管理,开发者需要根据具体场景平衡即时性和性能消耗^^
注册菜单点击对应的命令
context.subscriptions.push(vscode.commands.registerCommand("cline.plusButtonClicked", async () => {Logger.log("Plus button Clicked")const visibleProvider = ClineProvider.getVisibleInstance()if (!visibleProvider) {Logger.log("Cannot find any visible Cline instances.")return}await visibleProvider.clearTask()await visibleProvider.postStateToWebview()await visibleProvider.postMessageToWebview({type: "action",action: "chatButtonClicked",})}),)context.subscriptions.push(vscode.commands.registerCommand("cline.mcpButtonClicked", () => {const visibleProvider = ClineProvider.getVisibleInstance()if (!visibleProvider) {Logger.log("Cannot find any visible Cline instances.")return}visibleProvider.postMessageToWebview({type: "action",action: "mcpButtonClicked",})}),)const openClineInNewTab = async () => {Logger.log("Opening Cline in new tab")// (this example uses webviewProvider activation event which is necessary to deserialize cached webview, but since we use retainContextWhenHidden, we don't need to use that event)// https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.tsconst tabProvider = new ClineProvider(context, outputChannel)//const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefinedconst lastCol = Math.max(...vscode.window.visibleTextEditors.map((editor) => editor.viewColumn || 0))// Check if there are any visible text editors, otherwise open a new group to the rightconst hasVisibleEditors = vscode.window.visibleTextEditors.length > 0if (!hasVisibleEditors) {await vscode.commands.executeCommand("workbench.action.newGroupRight")}const targetCol = hasVisibleEditors ? Math.max(lastCol + 1, 1) : vscode.ViewColumn.Twoconst panel = vscode.window.createWebviewPanel(ClineProvider.tabPanelId, "Cline", targetCol, {enableScripts: true,retainContextWhenHidden: true,localResourceRoots: [context.extensionUri],})// TODO: use better svg icon with light and dark variants (see https://stackoverflow.com/questions/58365687/vscode-extension-iconpath)panel.iconPath = {light: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "robot_panel_light.png"),dark: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "robot_panel_dark.png"),}tabProvider.resolveWebviewView(panel)// Lock the editor group so clicking on files doesn't open them over the panelawait setTimeoutPromise(100)await vscode.commands.executeCommand("workbench.action.lockEditorGroup")}context.subscriptions.push(vscode.commands.registerCommand("cline.popoutButtonClicked", openClineInNewTab))context.subscriptions.push(vscode.commands.registerCommand("cline.openInNewTab", openClineInNewTab))context.subscriptions.push(vscode.commands.registerCommand("cline.settingsButtonClicked", () => {//vscode.window.showInformationMessage(message)const visibleClineProvider = ClineProvider.getVisibleInstance()if (!visibleClineProvider) {Logger.log("Cannot find any visible Cline instances.")return}visibleClineProvider.postMessageToWebview({type: "action",action: "settingsButtonClicked",})}),)context.subscriptions.push(vscode.commands.registerCommand("cline.historyButtonClicked", () => {const visibleProvider = ClineProvider.getVisibleInstance()if (!visibleProvider) {Logger.log("Cannot find any visible Cline instances.")return}visibleProvider.postMessageToWebview({type: "action",action: "historyButtonClicked",})}),)context.subscriptions.push(vscode.commands.registerCommand("cline.accountButtonClicked", () => {const visibleProvider = ClineProvider.getVisibleInstance()if (!visibleProvider) {Logger.log("Cannot find any visible Cline instances.")return}visibleProvider.postMessageToWebview({type: "action",action: "accountButtonClicked",})}),)

这里主要是注册了6个菜单对应的命令处理逻辑。大部分与视图相关的代码基本上就在这里了,active函数剩余的部分在下一篇内容中分析。

http://www.dtcms.com/wzjs/187678.html

相关文章:

  • 做网站虚拟主机有没有专门做营销的公司
  • 职业生涯规划网站开发背景北京百度关键词推广
  • 福步外贸论坛注册南宁seo费用服务
  • 帝国cms做新闻网站企业建站平台
  • 茂名网站建设服务seo学徒
  • tech域名可以做网站吗交换友链要注意什么
  • 网站制作网络推广方案网页制作平台有哪些
  • 西安免费做网站公司聊城优化seo
  • 手机网站建设系统优化seo网站
  • 做pc端网站渠道百度广告位价格表
  • 老年大学网站开发留电话的广告网站
  • 一个网站如何做推广方案建站公司排名
  • 备案名称和网站名称不一致高级搜索引擎
  • 哈尔滨营销网站建设友情链接交换平台有哪些
  • 合肥网站制作公司东莞seo网站优化排名
  • 天河区门户网站官网站外推广免费网站
  • 广东住房和城乡建设局网站首页seo日常优化内容是什么
  • 珠海互联网公司淘宝seo搜索引擎原理
  • 网站开发培训费google play商店
  • 网站开发课程的建议企业互联网推广
  • 深圳品牌网站制作公司seo还有前景吗
  • 改网站js代码电商怎么做
  • 微信公众号和wordpress东莞seo优化排名
  • 独立网站建设的步骤游戏优化大师手机版
  • 怎么找人帮做网站优化网站排名如何
  • 做网站和做系统的区别网址
  • 微商如何做网站引流百度企业认证怎么认证
  • 佛山网站设计制作公司郑州今日头条
  • 如何搭建情侣网站推广普通话内容50字
  • 网页制作网站开发室内设计培训哪个机构比较好