
【项目博客】基于DeepSeek的Python代码助手(五)
本文将详细介绍该项目vscode侧边栏的创建、前端用户界面的框架选择与搭建、主题背景的切换设计等。
本文将详细介绍该项目vscode侧边栏的创建、前端用户界面的框架选择与搭建、主题背景的切换设计等。
一、侧边栏创建与集成
1. 清单文件配置(package.json)
在 package.json
中声明视图容器和命令:
{
"contributes": {
"viewsContainers": {
"activitybar": [{
"id": "ai4python",
"title": "AI4Python",
"icon": "$(hubot)"
}]
},
"views": {
"ai4python": [{
"type": "webview",
"id": "ai4pythonView",
"name": "python编程助手"
}]
}
}
}
2. 视图注册(extension.ts)
在插件激活时注册侧边栏视图:
const sidebarProvider = new SidebarProvider(context.extensionUri);
context.subscriptions.push(
vscode.window.registerWebviewViewProvider("ai4pythonView", sidebarProvider)
);
3. 侧边栏类编写(SidebarProvider.ts)
通过 vscode.WebviewViewProvider
接口创建自定义视图,关键代码如下:
export class SidebarProvider implements vscode.WebviewViewProvider {
constructor(private readonly _extensionUri: vscode.Uri) {}
public resolveWebviewView(webviewView: vscode.WebviewView) {
webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);
// 消息通信处理
webviewView.webview.onDidReceiveMessage(/* ... */);
}
}
resolveWebviewView
方法是 由 VSCode 框架自动触发执行 的,该方法不会在插件激活时立即执行,而是在以下情况下由 VSCode 自动调用:
用户首次点击侧边栏图标打开视图时
视图被关闭后重新打开时
VSCode 窗口恢复时(如重启后恢复工作区)
二、前端框架选择与搭建
1. 技术选型理由
1)svelte:
-
编译时优化:在构建阶段将组件代码转换为高效的原生 JavaScript,而非依赖运行时库。这意味着无运行时开销,生成的代码直接操作真实 DOM,无需虚拟 DOM 的对比计算,减少了内存占用和性能损耗;代码体积极小,一个基础的 Svelte 应用仅需约 3KB,显著提升加载速度。
-
性能优势:更快的渲染速度,直接操作 DOM 的方式比虚拟 DOM 框架快 2-3 倍,尤其在复杂交互场景下表现突出。
-
简洁的语法与易用性:Svelte 的语法设计以开发者友好为核心,提供类原生开发体验,组件文件整合 HTML、CSS、JavaScript,且自动响应式更新。
2)Rollup:
- 高效的模块打包工具,完美支持 Svelte 组件。
2 . 构建过程
1)安装依赖
2)创建项目结构
3)Rollup 多页面配置(rollup.config.js)
这是Rollup 的配置文件,用于构建 Svelte 项目。Rollup 是一个 JavaScript 模块打包工具,通过动态扫描页面目录实现多入口打包:
export default fs
.readdirSync(path.join(__dirname, "webviews", "pages"))
.map((input) => ({
input: `webviews/pages/${input}`,
output: {
file: `out/compiled/${name}.js`,
format: "iife"
},
plugins: [
svelte({
dev: !production,
css: (css) => css.write(`${name}.css`)
}),
resolve({ browser: true }),
commonjs(),
typescript({ tsconfig: "webviews/tsconfig.json" })
]
}));
4)sidebar.ts
这是应用的入口文件,它将挂载 Svelte 组件:
import App from "../components/Sidebar.svelte";
const app = new App({
target: document.body,
});
export default app;
5)Sidebar.svelte
这是Svelte 组件文件,它包含了应用逻辑和视图,其基础框架如下:
<script>
let name = 'Svelte';
</script>
<style>
</style>
<h1>Hello {name}!</h1>
后续将详细介绍此文件内容。
三、主题背景的切换设计
1.设计思路
1)侧边栏的右上方设有主题选择按钮,点此按钮,会出现六个主题,分别对应春、夏、秋、冬四季主题以及黑白简约主题。
2)春夏秋冬渐变色搭配
3)图案设计:为每个季节搭配了其合适的图案,将svg图片转为base64后嵌入css。
如上图春季的桃花、夏季的荷花、秋季的枫叶、冬季的雪花。
2.实现方案
let isThemeSelectorOpen = false;
let currentTheme = 'spring';
const themes = [
{ name: '春', color: '#ffdbc1', gradient: 'linear-gradient(#ffdbc1, #fdc0f8)', pattern: springPattern, value: 'spring' },
{ name: '夏', color: '#cdd79f', gradient: 'linear-gradient(#cdd79f, #34a96b)', pattern: summerPattern,value: 'summer' },
{ name: '秋', color: '#ffe64b', gradient: 'linear-gradient(#ffe64b, #f66052)', pattern: autumnPattern,value: 'autumn' },
{ name: '冬', color: '#b2f2fe', gradient: 'linear-gradient(#e2f4f4, #86ceff)', pattern: winterPattern, value: 'winter' },
{ name: '黑', color: '#121212', gradient: 'linear-gradient(#121212, #1e1e1e)', value: 'dark' },
{ name: '白', color: '#ffffff', gradient: 'linear-gradient(#ffffff, #f5f5f5)', value: 'light' }
];
const toggleThemeSelector = () => {
isThemeSelectorOpen = !isThemeSelectorOpen;
};
const selectTheme = (theme) => {
currentTheme = theme;
isThemeSelectorOpen = false;
};
const getIconColor = () => {
return currentTheme === 'dark' ? '#ffffff' : '#000000';
};
-
isThemeSelectorOpen
:用于控制主题选择器是否打开。 -
currentTheme
:用于存储当前选中的主题。 -
themes
:定义多个主题对象。每个主题对象包含以下属性:name
:主题的名称。color
:主题的主色调。gradient
:主题的渐变背景。pattern
:主题的背景图案(SVG数据)。value
:主题的值(用于标识主题,如“spring”、“summer”等)。
-
toggleThemeSelector
:用于切换主题选择器的打开状态。 -
selectTheme
:用于选择主题。它接受一个主题值作为参数将其赋值给currentTheme
,并关闭主题选择器。 -
getIconColor
:一个函数,用于获取主题图标的颜色。如果当前主题是“dark”,则返回白色,否则返回黑色,避免黑色主题下按钮不显示。
<div class="sidebar" data-theme="{currentTheme}"
style="background: {themes.find(t => t.value === currentTheme).gradient}">
<div class="chat-up">chat</div>
<!-- 主题切换按钮 -->
<button class="theme-selector-toggle" on:click={toggleThemeSelector}>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="{getIconColor()}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
</svg>
</button>
<!-- 主题选择器 -->
<div class="theme-selector" class:open={isThemeSelectorOpen}>
<div class="theme-options-container">
{#each themes as theme}
<div
style="background-color: {theme.color}"
class="theme-option"
on:click={() => selectTheme(theme.value)}
title="{theme.name}"
></div>
{/each}
</div>
</div>
</div>
- 使用了
data-theme
属性来存储当前的主题值,并通过内联样式设置了背景渐变,这个渐变是根据当前主题动态确定的。
<button class="theme-selector-toggle" on:click={toggleThemeSelector}>
:这是主题切换按钮,用于打开或关闭主题选择器。当点击这个按钮时,会调用toggleThemeSelector
函数。<svg>
:这是主题切换按钮的SVG图标。它的stroke
属性(即边框颜色)是根据getIconColor
函数的返回值动态确定的,用于根据当前主题显示不同的图标颜色。
<div class="theme-selector" class:open={isThemeSelectorOpen}>
:这是主题选择器的容器。当isThemeSelectorOpen
为true
时,会添加open
类,用于通过CSS显示或隐藏主题选择器。<div class="theme-options-container">
:这是包含所有主题选项的容器。{#each themes as theme}
:这是一个Svelte的循环指令,用于遍历themes
数组中的每个主题对象。
<div style="background-color: {theme.color}" class="theme-option" on:click={() => selectTheme(theme.value)} title="{theme.name}"></div>
:这是每个主题选项的元素。它设置了背景颜色为当前主题的颜色,点击时调用selectTheme
函数并传入主题的值。title
属性用于显示主题的中文名称。
css样式
1)sidebar定义了侧边栏样式,sidebar::after定义了图案样式:
2)图案通过将svg转换为base64,写入对应的季节背景。
更多推荐
所有评论(0)