本文将详细介绍该项目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}>:这是主题选择器的容器。当isThemeSelectorOpentrue时,会添加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,写入对应的季节背景。
在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐