产品经理又开始为难我了???我。。。。(二)

简介: 插件开发——配置右键菜单这个功能描述大概就是,你在写的时候突然要上传,直接点击鼠标右键,然后直接选择图片。对就是这个简单的东西,做东西需要从用户的角度考虑,一定要爽,能省一步是一步。呵呵哈哈哈这个配置其实就是在 还是在刚才的「package.json」 上继续配置:"menus": { "editor/context": [ { "when": "editorFocus", "command": "extension.choosedImage", "group": "navigation" } ]w

插件开发——配置右键菜单



这个功能描述大概就是,你在写的时候突然要上传,直接点击鼠标右键,然后直接选择图片。对就是这个简单的东西,做东西需要从用户的角度考虑,一定要爽,能省一步是一步。呵呵哈哈哈


这个配置其实就是在 还是在刚才的「package.json」 上继续配置:


"menus": {
    "editor/context": [
      {
        "when": "editorFocus",
        "command": "extension.choosedImage",
        "group": "navigation"
      }
    ]


when:就是你鼠标在编辑的时候


command: 就是自定义的事件,我叫他选择图片, 这个其实就是在extension.js 注册的


事件名字 tips:就是对应的事件名称


let texteditor = vscode.commands.registerTextEditorCommand(
  'extension.choosedImage', ...


这个其实就是在extension .js 注册对应的事件名,这里的「事件名」 一定要和 「package.json」 中文件对应不然会出不来的。给大家演示下:


image.png


图片


图片


重启插件 按下f5 然后按下右键就有我们自定义的右键菜单了。但是问题来了我们按住右键 是不是得弹出一个选择图片的框哇,不然怎么上传对吧?


打开图片上传 弹框


强大的vscode支持了内置的api, 支持打开:


const uri = await vscode.window.showOpenDialog({
    canSelectFolders: false,
    canSelectMany: false,
    filters: {
      images: ['png', 'jpg','apng','jpeg','gif','webp'],
    },
  });


就是这个 api, 你可以过滤出想要的图片, 在filters 里面,然后呢 吐出给我们的是对应图片的路径。


我们看下效果:

image.png

读取图片数据


其实这个时候我们我们已经有了图片的路径,这时候就要利用 「node.js」的fs 模块 去读取 这个图片的数据 buffer ,这个其实为了方便我们将图片上传到oss 上。代码如下:


const uri = await vscode.window.showOpenDialog({
    canSelectFolders: false,
    canSelectMany: false,
    filters: {
      images: ['png', 'jpg','apng','jpeg','gif','webp'],
    },
  }); 
let imgBuffer =  await fs.readFile(uri[0].path);


这里还涉及到一个就是说:本地图片的名字 进行加密, 不能上传到oss 各种中文啥的, 显示的我们很不专业哇


所以这里写了一个MD5的转换


function md5Name(name) {
 const index = name.lastIndexOf('.')
 const sourceFileName = name.substring(0, index)
 const suffix = name.substring(index)
 const fileName = md5(sourceFileName + Date.now()) + suffix
 return fileName.toLowerCase()
}


就是将名字搞成花里胡哨的样子,呵呵哈哈哈!


图片压缩


我们得到图片的buffer 数据后其实要对图片要支持压缩, 其实社区里面有很多方案, 这里的话我调研的很多还是决定使用tinfiy, 他也有对应的「node.js」 使用的他主要理由主要是看下面这张图:


                                image.png


apng


对的这家伙支持「apng」, 其他的不是很清楚。但是他不是免费的一个人一个月免费「500」 次, 思考了下还行,我们也用不到辣么多次最终还是考虑用它去实现。


安装

安装npm包并添加到您应用的依赖中,您就可以使用Node.js客户端:


npm install --save tinify


认证


您必须提供您的API密钥来使用API。您可以通过注册您的姓名和Email地址来获取API密钥。请秘密保存API密钥。


const tinify = require("tinify");
tinify.key = "YOUR_API_KEY";


这个的话其实就是你的邮箱去注册一下,然后把你对应的「key」 去激活其实就可以了


image.png如图


如图


其实就是下面这个你的key 设置激活就好了


tinify压缩图片


您可以上传任何JPEG或PNG图片到Tinify API来进行压缩。我们将自动检测图片类型并相应的使用TinyPNG或TinyJPG引擎进行优化。只要上传文件或提供图片URL,就会开始压缩。


您可以选择一个本地文件作为源并写入到另一个文件中。


const source = tinify.fromFile("unoptimized.webp");
source.toFile("optimized.webp");


您还可以从缓冲区(buffer)(二进制字符串)上传图片并获取压缩后图片的数据。


const fs = require("fs");
fs.readFile("unoptimized.jpg", function(err, sourceData) {
  if (err) throw err;
  tinify.fromBuffer(sourceData).toBuffer(function(err, resultData) {
    if (err) throw err;
    // ...
  });
});


代码实现


function compressBuffer(sourceData, key = 'xxx') {
 return new Promise((resolve,reject) => {
  tinify.key = key;
  tinify.fromBuffer(sourceData).toBuffer(function(err, resultData) {
   if(resultData) {
    resolve(resultData)
   }
   if (err) {
    reject(err);
   }
   // ...
  });
 })
}


基于他这个封装了一个promise, 这个「fromBuffer」 , 到 「toBuffer」 是真的好用。哈哈哈哈很香,记得一定要设置key 不然promise 直接会报错的, 设置key的方法 就在上面👆🏻, 然后这样其实我们就获得了压缩的图片数据了。


上传图片到oss


这里的话其实有的使用七牛云、 有的使用阿里云。去上传图片,或者是ajax 去上传其实都可以


一般都是要获取token 啥的以及各种签名信息,然后直接上传就好了, 然后呢你就可以获得一张图片地址了。代码我就不展示了, 都是前端应该都懂。这里我说下我遇到的一些问题


  1. 第一个就是js 跑的 是node js 的环境, 如果使用「FormData」 这个类的话 他直接会报找不到, 这个方法是 undefined, 还有「fetch」, 所以说要去安装对应node js 包 ,我这里使用的是 「cross-fetch」「form-data」



这里我说一下配置的问题就是你在扩展中如何获得的你配置的参数:


"configuration": [
   {
    "title": "压缩图片",
    "properties": {
     "upload_image.secretKey": {
      "type": "string",
      "default": "",
      "description": "设置tinify的ApIKey"
     },
     "upload_image.secretTokenUrl": {
      "type": "string",
      "default": "",
      "description": "设置得物的tokenUrl"
     }
    }
   }
  ]
复制代码


每个属性前面对应的 upload_image 其实你在扩展中你可以通过:


const imageConfig =  vscode.workspace.getConfiguration('upload_image')


然后你就可以拿到配置了,upload_image 后面的属性 其实对应的就是对象中的key 然后呢你就可以对吧操作了


这个东西还是具体项目, 具体分析,你们自己 可以针对自己的项目去配置


插件开发——图片链接写入编辑器中



通过上面的方法已经可以获得图片上传后的链接,接下来就是将链接写入编辑器中:首先判断编辑器选择位置,editor.selection中可以获得光标位置、光标选择首尾位置。若光标有选中内容则editBuilder.replace替换选中内容,否则

editBuilder.insert在光标位置插入图片链接:


// 将图片链接写入编辑器
function addImageUrlToEditor(url) {
 let editor = vscode.window.activeTextEditor
 if (!editor) {
   return
 }
 const { start, end, active } = editor.selection
 if (start.line === end.line && start.character === end.character) {
   // 在光标位置插入内容
   const activePosition = active
   editor.edit((editBuilder) => {
  editBuilder.insert(activePosition, url)
   })
 } else {
   // 替换内容
   const selection = editor.selection
   editor.edit((editBuilder) => {
  editBuilder.replace(selection, url)
   })
 }


插件发布



到这里,其实一整个vscode插件 其实已经可以开发完成了, 然后我们要把他进行打包发布到vscode 的应用市场


创建账号


我是直接github 登录创建, 首先我们进入文档中提到的主页,完成验证登录后创建一个组织。


image.png

image.png

创建一个组织

创建发布者


进入下面这个页面 marketplace.visualstudio.com/manage/publ…** 插件发布者, 给大家看下我的:

image.png发布者


发布者

打包发布

首先全局 安装脚手架


npm install -g vsce
复制代码


然后 cd 到当前插件目录 使用下面命令


$ cd myExtension
$ vsce package
# myExtension.vsix generated
复制代码


这里的打包会报一些error:


第一个就是插件的package.json 增加发布者


"publisher": "Fly",
复制代码


如果给插件加图标:其实在项目中创建一个文件夹:image 然后把图片放进去:同时也要在package.json 中配置


"icon": "images/dewu.jpeg",
复制代码


这里可能有⚠️,不过没什么关系,继续跑就完事了


image.png

warn


最后的话其实就是要写readme ,不然 不让你发布。


打包上传


一切准备就绪:命令行 输入


vsce package


然后项目中就会出现:

image.png


照片


照片


然后可以把这个东西拖到页面这个页面


marketplace.visualstudio.com/manage/publ…

image.png


上传


然后点击上传就好了,你就可以在vscode 插件商场可以看到自己写的插件了


image.png

插件

相关文章
产品经理又开始为难我了???我。。。。(一)
前言 大家好,我是Fly哥。最近做项目的时候,就是产品经理给的图总是很大,不压缩。每天要处理这些图片真的很累哇。于是一怒之下写下了这个「vscode 插件」。「插件核心功能是压缩,然后上传图片」。压缩的网站其实就是「tinypng」 这个网站然后图片压缩后,然后再上传到cdn上,然后然后这个压缩过的url 直接放到我们的粘贴板上。下面跟着我的步伐一步一步来写实现它。先看效果图: 图片 效率对比 开发这个主要是提高团队开发效率, 绝不是为了炫技。看图: 图片 image-20211017224316386 image-20211017224316386 需求分析 可在vscodde的set
产品经理又开始为难我了???我。。。。(一)
|
SQL 缓存 NoSQL
冲刺金三银四,这份豪礼【面试锦囊】真舍不得给你们
大家好,我是小羽马上就是金三银四啦,最近有很多粉丝跟我交流关于面试方面的经验以及分享,也有部分是在准备今年的金三银四的春招。小羽也一直没出关于面试方面的文章,这篇就结合自己之前的面试经历以及...
150 0
冲刺金三银四,这份豪礼【面试锦囊】真舍不得给你们
|
消息中间件 分布式计算 负载均衡
阿里技术面全A,终面却被产品经理拉下马,我不服
阿里技术面全A,终面却被产品经理拉下马,我不服
阿里技术面全A,终面却被产品经理拉下马,我不服
|
缓存 NoSQL 前端开发
揭密!程序员面试不得不知道的潜规则
规则1:面试的本质不是考试,而是告诉面试官你会做什么 很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来知道你会什么
揭密!程序员面试不得不知道的潜规则
|
消息中间件 架构师 NoSQL
做好职业规划,做一个平凡而不平庸的自己
做好职业规划,做一个平凡而不平庸的自己
155 0
做好职业规划,做一个平凡而不平庸的自己
在IT界,应聘企业去上班如果老板一点不懂技术那绝对是作茧自缚
如标题所述为何如此评价一个一点都不懂技术的老板的公司呢
|
架构师 程序员 CDN
周鸿祎:怎样才能成为一个优秀的产品经理?
导读:本文来自奇虎360董事长周鸿祎的博客,分享了个人对于“一个优秀产品经理的必备素质”的经验与理念。 现在,互联网公司里开始重视产品经理了,这是一个好事。以前互联网谈融资,谈商业模式,谈战略,很少有谈产品的,因为产品可以从国外抄,谁下手快谁就能获得先发优势。
1742 0
|
Java 程序员 定位技术
程序员职业规划的3个锦囊
我们在面试时经常会被问到一个问题——“你未来五年的职业规划是什么?”很多小伙伴不理解HR为什么这么问,也不知道怎么回答。 实际上,即便HR不问,我们也应该多多想想这个问题。因为它指向的是我们自己的职业生涯规划。
6459 0
|
架构师 物联网 Java
倾听程序员的心声真的很重要
说到开发产品,没有人比程序员更了解产品。程序员知道产品的优点、缺陷、用途和潜在用途。说起这些,程序员了如指掌,如数家珍。 在这个似乎无所不在的数字时代,倾听程序员必须要说的内容非常重要,而且也许比以往任何时期都更加重要。
985 0