声明:本文仅以最近牛市为场景,主要在于分享VsCode插件技术的学习和交流,并不提供任何投资建议!thx~
牛真的来了?
最近,咱们的大 A 真的是风风火火,有种要带入全民炒股的节奏。但是作为散户,作为搬砖仔,哪有时间关注突如其来的行情变化???那又怎么可能找到合适的上车机会呢???
于是乎决定整一个盯盘工具,最起码能快速感知到大盘的异动,以避免踏空、成千古恨。
怎么个盯盘法?
就本人而言,日常最常用的工具就是 VsCode 代码编辑器。所以考虑使用 VsCode 简单整个可以实时追踪行情的 VsCode 插件。
那么我们期待它应该需要有哪些能力呢?可以看到 2 个待办如下:
- 可以关注多只票,支持快速检索和添加
- 实时更新展示指数行情,能看到涨跌波动
最终产品效果如下演示,感兴趣的就接着往下看吧。
行情数据源怎么来?
针对上述 2 个能力,首先要解决的是数据问题,即需要 2 个数据源:
- 根据股票名查询股票信息的接口
- 根据股票代码查询股票当日实时行情的接口
咱们这边就不专门分析券商接口如何如何调用了,得力于 ChatGPT 的强大,简单问下很快就能找到解决办法😋:
关注的股票往哪存?
有了数据之后,那么搜索关注的股票肯定要做本地存储,避免丢失,那么应该放在哪里呢?
由于考虑存在用户设置的诉求,比如:持股成本、简化别名等以及后续扩展诉求,所以我们可以考虑把配置相关放在 VsCode 标准 settings.json 配置文件中。
数据结构定义
这里简单约定下配置对象的数据结构定义,大致如下:(PS: 没错我们的插件名就叫 stockbar )
{
"stockbar.stocks": [
{
"code": "sh000001", // 股票代码
"alias": "SZ", // 简化别名
"cost": 6000.00, // 持股成本
}
]
}
如何写入
在每次搜索选择时,我们就可以执行写入 setting.json 操作,大致如下:
const stocks = [{ code: "sh000001", alias: "SZ", cost: 6000 }];
// 读取配置读写
const stockBarConfig = vscode.workspace.getConfiguration('stockbar');
// 更新配置字段,并消息提示
stockBarConfig.update('stocks', stocks, true).then(() => {
vscode.window.showInformationMessage(`Stock Successfully add.`);
});
如何读取
因为考虑实时监听,所以定时器刷新渲染股价列表视图,理论每次都会读取配置文件。
这里呢,为了更好地性能,避免频繁读文件系统 IO 操作,使用 onDidChangeConfiguration 优化读取频率:
const stockBarConfig = vscode.workspace.getConfiguration('stockbar');
context.subscriptions.push(
// 监听配置变更时触发 视图刷新
vscode.workspace.onDidChangeConfiguration(() => {
const stocks = stockBarConfig.get('stocks');
// 定时刷新渲染视图
loopTaskRender();
}),
);
实时渲染展示怎么弄?
看到这里,我们知道咱们股票配置已经有了,获取实时行情接口也有了,所以这里要做的就是基于定时器去做两件事:查询实时股票行情 + 渲染即可。
关于渲染,我们使用 createStatusBarItem 渲染股票价格信息到VsCode底部。
const delay = Configuration.stockBarConfig.get('updateInterval')
// 定时循环任务
function loopTaskRender() {
setTimeout(() => {
render()
}, delay)
}
async function render() {
// 批量请求股票实时行情数据
const stockCodes = stocks.map((v) => v.code);
const stockDataList = await sinaStockProvider.fetch(stockCodes);
// 逐个渲染到 VsCode 左下角底部
for (const item of stockDataList) {
const barItem = vscode.window.createStatusBarItem(
item.code,
vscode.StatusBarAlignment.Left,
);
// 读取接口数据:'别名:股价 实时涨跌幅度 ♟盈亏比'
barItem.text = '上证:3284.3225 2.07% ♟-45.26%'
barItem.show();
}
loopTaskRender()
}
当然这里只是简单示例,实际上考虑性能,实时渲染策略是可以优化的,比如:仅在 工作日 && 开盘时间 执行请求和渲染逻辑。
如何快捷添加选股?
其实,我们添加关注的股票列表都可以在 settings.json 中配置,不需要检索也没关系。但考虑股票代码的登记成本,我们还是要支持根据股票名模糊检索股票,选股并添加到配置文件中。
这里我们使用 createQuickPick 唤起 VsCode 弹层选择器,用于输入关键词查询股票。
function addStock() {
const popup = vscode.window.createQuickPick();
popup.items = [{
label: 'Please enter keywords to search, such as: 0000001'
}];
// 检索词录入回调
popup.onDidChangeValue((keyword) => {
// 调用 根据关键词查询股票列表接口
})
// 点击选中股票回调
popup.onDidChangeSelection((evt) => {
// 读取evt得到选中的股票,更新到配置文件中
});
popup.show();
}
那么站在交互侧,应该以怎样的交互形式唤起选股弹窗选择器呢?
当然作为程序员,这里采用了最简单的快捷键方式:
- 使用
registerCommand注册命令
vscode.commands.registerCommand('stockbar.addStock', addStock);
- 在
package.json中声明快捷键绑定
{
"contributes": {
"keybindings": [{
"command": "stockbar.addStock",
"key": "shift+alt+s",
"mac": "shift+alt+s",
}]
}
}
最终,我们的盯盘神器 Stockbar 就诞生了~~~(^▽^)
Stockbar总结
这里也简单小结整理下功能架构,大致如下:
VsCode是大部分前端同学每天接触最多的东西,而 Stockbar 作为 VsCode 插件扩展,目的是给搬砖的各位时不时钉盘的助手,避免错过大牛市的最佳上车机会~
当然这里主要以分享学习为主,对于开发什么样的插件、实现怎样的功能、以及如何交互呈现,这就要靠你从工作和生活中去发现、去找寻灵感并提炼了。
看到这里,核心功能介绍和实现基本就结束了。后面【附录】会把 VsCode 插件开发的流程串一遍,想正儿八经实践下的可以了解下。
最后,祝点赞的在车上的各位都能接住牛市,财源滚滚!!!
附录:开始调试发布一把嗦
VsCode 底层主要基于 TypeScript 编写的,基于插件化设计的扩展包机制也是要基于 TypeScript 编写的, 所以作为前端同学,其实写插件是比较友好的,开发整体流程大致如下:
创建仓库
首先在准备好 Node 环境的情况下,直接在【命令终端】执行如下命令即可创建一个初始化的插件代码仓库:
# 环境 node.v18
npx --package yo --package generator-code -- yo code
非常清晰,src/extension.ts 即我们的插件启动入口文件。
开发调试
为了调试这个插件,我们在 VsCode 中打开该仓库,按下 F5(Mac系统请按 fn + F5),你会立即看到一个插件发开主机窗口,其中就运行着该插件。在命令面板(Ctrl+Shift+P)中输入 Hello World 命令,即可看到右下角提示(官方默认HelloWorld示例)。
打包发布
- 如果是第一次注册,你可能需要在 插件开发平台 上创建组织,然后再创建项目。
- 在用户设置中创建自己的
Token,创建完成后记得复制备份自己的Token。
- 在发布之前,你还需要拥有发行方账号,访问如下站点可创建,只填必填即可(请记住这个 Name)
marketplace.visualstudio.com/manage/crea…
- 在发布账号和密钥准备好之后,接下来就是命令式登录,快速发布了。
注意:这里 vsce 是一个 npm 包,可通过npm i -g vsce安装到全局。
# Flcwl即刚刚你要记下的Name; 再输入刚才的私钥Token
vsce login Flcwl
- 最后我们可以在自己的插件项目下,执行
vsce publish $version进行发布即可,对应就会更新到插件市场中去了。
记得更新下自己的版本号。