发布于 2026-01-06 1 阅读
0

我制作了一个 Visual Studio Code 插件,参加了由 Mux 主办的 DEV's Worldwide Show and Tell Challenge:展示你的项目!

我制作了一个 Visual Studio Code 插件

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

我最近发现了remove.bg 这个项目。它非常棒,正如其名,它可以移除图片的背景。所以我决定为 VS Code 做一个插件,让我可以右键点击图片并移除背景。

最近我一直在 vscode 和 vim 之间来回切换,但 vscode 最吸引我的一点是它的插件是用 JavaScript 编写的。

我喜欢 JavaScript 以及整个 Web 技术栈的主要原因在于它的无所不在。即使你想编写 Sketch 插件、移动应用、后端、命令行界面或桌面应用,掌握 JavaScript 知识仍然至关重要。

好了,关于 JavaScript 就说到这里,让我们开始吧!

开始

首先,我需要创建一个项目。为此,我遵循了官方文档。可以使用Yeoman来搭建新项目的框架。我之前就了解过Yeoman ,所以当微软选择使用它来搭建项目框架时,我感到非常惊喜。

于是我决定做些研究。我知道remove.bg有一个 HTTP API 可以用,但更棒的是!已经有一个npm 包帮我搞定了这一切。

运行扩展程序

项目搭建完成后,我接下来要做的就是弄清楚如何运行它;这反而是最简单的一步。整个过程非常简单,只需切换到调试选项卡,然后点击运行即可。一个新的 VS Code 窗口打开,我的插件已经安装完毕,可以直接使用,真棒!

在 Visual Studio Code 中封装 NPM 包

我首先安装了 NPM 包。这与安装普通 Node 或 Web 项目的依赖项一样简单。

npm install remove.bg

首先,我知道这个 API 需要 API 密钥。所以如果能在 VS Code 设置中指定这个 API 密钥就太好了。通过在package.json文件中添加以下几行代码,名为“API 密钥”的设置项就被添加到了 VS Code 的设置菜单中(位于名为“移除背景”的部分下):

{
  "contributes": {
    "configuration": [
      {
        "title": "Remove.bg configuration",
        "properties": {
          "remove-bg.apiKey": {
            "type": "string",
            "description": "The API key for remove.bg"
          }
        }
      }
    ]
  }
}

下一步是让菜单在右键单击文件时显示。遗憾的是,这方面的资料较少,但我经过一番尝试后找到了解决方案:

  "contributes": {
    ...
    "menus": {
      "explorer/context": [
        {
          "command": "remove-bg.removeBg",
          "when": "resourceExtname =~ /\\.png$|\\.jpg$|\\.jpeg$/",
          "group": "navigation"
        }
      ]
    },
    "commands": [
      {
        "command": "remove-bg.removeBg",
        "title": "Remove background"
      }
    ]
  },

好的,这里的信息量很大,我们先从命令部分开始。命令部分告诉 VS Code,这个扩展程序会提供一个名为remove-bg.removeBg的命令;我们稍后会讲到这个命令是如何实现的,请耐心等待。

接下来是菜单部分。在这里,我们定义要向下拉菜单添加一个项目,该菜单会在用户右键单击资源管理器选项卡中的某个项目时显示。我们设置了一个条件,即只有当用户单击的文件扩展名与正则表达式匹配时,该菜单才应显示:

/\.png$|\.jpg$|\.jpeg$/;

基本上,任何被remove.bg支持的图片都可以。我们还指定此菜单项应触发我们在命令部分指定的命令。

让我们来编写一些 JavaScript 代码吧!

所以,当我说 VS Code 插件是用 JavaScript 编写的时,我并没有撒谎——不过,我决定使用TypeScript,而且 TypeScript 也是通常用于编写 VS Code 插件的语言。

在脚手架项目的 src 文件夹中,有一个名为extension.ts的文件。这是扩展程序加载后将要运行的文件。起初我知道我必须想办法获取用户在设置中指定的 API 密钥。

function loadApiKey(): string | undefined {
  const config = vscode.workspace.getConfiguration('remove-bg');
  return config.get('apiKey');
}

上面的函数尝试从设置中获取apiKey;如果未指定设置,则返回 undefined。

接下来,我决定在去除背景后不覆盖原文件,而是创建一个新文件。我决定在输出文件后添加后缀`-no-bg`,并为此添加了一个实用函数。这样,​​如果需要,我可以快速地将其更改为其他后缀/扩展名;该函数如下所示:

interface SuffixConfig {
  path: string;
  suffix: string;
  extension: string;
}


export function addSuffix({ path, suffix, extension }: SuffixConfig): string {
  const dots = path.split('.');
  return `${dots.slice(0, -1).join('.')}${suffix}.${extension}`;
}

这里的问题在于对 0 到 -1 之间的切片操作。它的作用是返回一个新数组,其中原数组的最后一个元素被移除。在本例中,最后一个小数点后面的元素将被移除。

现在我有了最初的构建模块,就可以使用官方文档npm 包将各个部分拼接起来。

这是extensions.ts文件中的最终代码

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
  const disposable = vscode.commands.registerCommand(
    'remove-bg.removeBg',
    async (uri: vscode.Uri) => {
      const apiKey = loadApiKey();
      if (!apiKey) {
        vscode.window.showErrorMessage('No API key was set.');
        return;
      }


      const sourceFile = uri.path;
      const outFile = addSuffix({
        path: sourceFile,
        suffix: '-no-bg',
        extension: 'png',
      });


      try {
        await removeBackgroundFromImageFile({
          path: sourceFile,
          apiKey: apiKey,
          outputFile: outFile,
          size: 'regular',
          type: 'auto',
        });


        vscode.window.showInformationMessage('Background remove successfully!');
      } catch (e) {
        vscode.window.showErrorMessage('Failed to remove background.');
      }
    },
  );


  context.subscriptions.push(disposable);
}

结语

插件在这里,插件代码在这里。我特意给remove.bg的开发者发了封邮件,询问是否可以使用他们的 logo。他们欣然同意,而且回复得非常迅速。

整个过程对我来说是一次很棒的学习经历,我经常会冒出一些新的 VS Code 插件的想法——如果一天能有更多的时间就好了。

我知道这篇文章可能算不上什么高深的教育性文章,但希望它能启发一些人为自己常用的工具开发插件。很多时候,像封装别人开发的工具这样简单的事情,只要能让工具更容易使用,就足够了。

我还要特别感谢remove.bg的工作人员,他们非常棒,允许我使用他们的徽标,并且抽出时间回复了我这个制作了 vscode 插件的瑞典陌生人。

文章来源:https://dev.to/antonholmberg/i-made-a-visual-studio-code-plugin-42k2