Skip to content

基金助手 fund-helper — 速记版

📋 速记表(面试前快速扫)

一句话结论关键词
Q1双端同格式数据,JSONBox 云同步+版本号对比JSONBox 版本号 二维码 LocalStorage
Q2双视图共用单例 FundDataManager,按交互分场景单例 分场景 TreeView/WebviewView
Q3普通基金走估值接口,QDII 用持仓×行情加权估算QDII 加权 过期检测 gztime
Q4分层代理绕 CORS:host/Vite/WorkerCORS 分层代理 环境感知
Q5图表封统一 init/resize,联暗黑主题ECharts dark 联动
Q6统一走 OpenAI 兼容 API,切 baseURL/modelOpenAI兼容 向导 归一
Q7Cloudflare+GitHub 双部署,PWA 分策略缓存PWA CacheFirst NetworkOnly
Q8本地 LocalStorage+云端 JSONBox 分工,VSCode 字段保护分层存储 字段保护

Q1: 双端架构 + 跨端同步

面试官可能问:VSCode 插件端和 Web 端怎么设计、怎么同步数据?

🗣️ 口述稿

两端导出同一种基金数据格式({code,num,cost} 加分组、排序配置),用 JSONBox 免费云存储同步,都带版本号加时间戳,谁版本新用谁的。Web 端生成二维码,VSCode 扫码把配置推上云端、另一端再拉下来。数据只有几 KB,自建后端不划算,所以用免费云存储。

💡 关键词提示JSONBox云同步 版本号对比 二维码扫码 LocalStorage兜底

⚠️ 备注

  • 冲突检测是防御性设计,没做 CRDT/多方并发压测,别吹成企业级分布式
  • 设计原则:云端只是同步介质,本地 LocalStorage 才是真相;JSONBox 挂了只是不能跨端同步,不影响本地用
  • 追问"为什么不用账号登录",可说为省一套账号体系,扫码本质是带 token 跨端,代价是流程略繁琐

追问①:为什么扫码传配置不登录?

为省一套账号注册登录体系,扫码本质是把 token 从一端带到另一端;代价是每换一次端要扫一次,不够优雅但够用。

追问②:JSONBox 挂了或超限怎么办?

本地 LocalStorage 兜底,云端只是同步介质不是唯一来源,挂了最多不能跨端同步,本地照常用。


Q2: VSCode 插件开发

面试官可能问:TreeView 和 WebviewView 两种视图怎么协作?

🗣️ 口述稿

两个视图共用同一个 FundDataManager 单例,谁拉数据都更新到同一份 store,避免重复请求。TreeView 是原生树,放加仓减仓这类高频轻操作;WebviewView 是嵌入网页,放列排序、拖拽这类重交互。刷新统一调 refreshFundData(),WebviewView 走 postMessage 增量推。

💡 关键词提示FundDataManager单例 分场景 postMessage增量 36命令when条件

⚠️ 备注

  • 早期两视图各拉各的,数据版本不一致,才收敛到单实例——可讲这个演进
  • 命令一多,"注册容易、想清楚每个命令在哪出现难",前期菜单又乱,后期收敛
  • 两视图强一致是相对的:store 一致但 Webview DOM 状态可能有几十毫秒差异,别吹强同步

追问①:两视图数据会强一致吗?

单例+同一 store 基本一致,但 WebviewView 有自己的 DOM 状态,极端情况会有几十毫秒差异,属于我没太上心的瑕疵。

追问②:为什么不用一个 Webview 搞定所有?

TreeView 原生稳定包小不用自建页面;全 Webview 要自己起 HTML 再通信。按操作频率和交互复杂度分场景选用更划算。


Q3: 基金计算引擎

面试官可能问:QDII 这类基金估值你怎么算?普通基金呢?

🗣️ 口述稿

普通基金直接拿第三方估值接口,QDII 投海外、人家不覆盖,所以我用季报的股票持仓权重,拉这些股票当日实时涨跌幅,加权平均算个估算涨幅。它不是官方值,总比看不到强。数据可靠性靠过期检测——接口返回的 gztime 不是今天就清掉估值,避免拿昨天数据当今天用。

💡 关键词提示QDII加权估算 持仓×行情 gztime过期检测

⚠️ 备注

  • [需自行确认]:"加权平均成本/收益法"没有零误差实测依据,别吹"验证过准",只讲"我做过期兜底+口径统一"
  • QDII 估算误差来源=季报持仓滞后+只算股票不算债券现金,行情剧烈波动明显偏高——被问量化误差没数据,别硬给数字

追问①:成本价怎么算?反复加减仓?

加权平均:(旧成本×旧份额+新买入成本)÷(旧份额+新份额),加减仓自动重算,分母变大被摊平是正确行为。

追问②:QDII 估算误差多大?

误差来自季报持仓滞后和只算了股票,行情剧烈时会明显偏。这是近似算法,量级误差我做过统计,没有数据。


Q4: 跨域代理方案

面试官可能问:浏览器端调基金接口被 CORS 挡了怎么办?

🗣️ 口述稿

基金接口有来源检测,浏览器 fetch 会被 CORS 拦死。我用分层代理+环境感知:VSCode 插件端在 Node 环境直接 fetch 没跨域;Web 本地开发走 Vite proxy;Web 生产走 Cloudflare Worker 转发。封装一个 proxyFetch,上层不用关心当前在哪层。

💡 关键词提示CORS 分层代理 Vite proxy Cloudflare Worker

⚠️ 备注

  • [重要][需自行确认]:简历写"四层代理",但 Netlify Serverless 那层其实只有注释掉的骨架,实际是 Worker/Vite/host 三层。别说满四层,要么承认第四层是雏形要么补全
  • 伪造 Referer/Origin 是灰色手段,立场是"低频自用",接口加严风控就会失效——被问不要有保障性承诺

追问①:伪造请求头不会被接口识破吗?

会,这是灰色手段,我只能低频自用别海量抓。接口一旦加签名或设备指纹就失效,我本身没有保障性对策。

追问②:Worker 域名被封了怎么办?

降级到其他代理层,核心是别依赖单一代理点——当初做分层就是为了任何一层挂了还有别的兜底。


Q5: ECharts 可视化

面试官可能问:图表这块做了什么?

🗣️ 口述稿

做了行情、详情、对比三类图:资金流向折线、板块排行柱状、净值走势(可切 1月/3月/半年/1年/3年)、多基金叠图。封了统一 init/resize 工具函数,并跟 Pinia 的暗黑模式联动自动切主题。

💡 关键词提示三类图 统一init/resize dark主题联动

⚠️ 备注

  • 这题别报菜名,收敛讲一个点:主题切换不重建 chart,读 Pinia 的 isDark 后 setOption 更新变量,避免重复 init
  • "图表数量"不是量化亮点,别用来凑

追问①:主题切换会不会重建图表?

不会,读 Pinia 的 isDark 后对现有 chart 做 setOption 更新样式变量,避免重复初始化。


Q6: AI 多模型集成

面试官可能问:怎么接多个 AI 模型?

🗣️ 口述稿

因为各家都兼容 OpenAI 的 API,所以统一用 OpenAI SDK,靠切 baseURLmodel 适配阿里云、硅基流动、DeepSeek 等。配了个 5 步 Webview 向导(厂商→Key→模型→参数→测试),Prompt 按 6 个维度组织控制在 1000 字内。

💡 关键词提示OpenAI兼容 baseURL切换 5步向导 Prompt六维

⚠️ 备注

  • 难点在配置引导而不在接入:不同厂商 baseURL/model 名不一致,所以加"测试连接"步骤把常见填错映射成可读提示
  • 兼容度不齐,后端返回格式和 OpenAI 有细微差别需归一——别把"一把梭"说成"零适配"

追问①:全是 OpenAI 兼容,会被坑吗?

会,各家兼容程度不一(流式、工具调用),实际遇到过后端返回格式和 OpenAI 有差别,我做了一层格式归一。


Q7: PWA + 部署

面试官可能问:PWA 和部署怎么做的?

🗣️ 口述稿

部署 Cloudflare Pages(全球 CDN)+ GitHub Pages(Actions 自动构建)双站点;PWA 用 vite-plugin-pwa,Manifest standalone 可装桌面。缓存三策略:API 用 NetworkOnly 保实时,静态资源 CacheFirst,字体 StaleWhileRevalidate。

💡 关键词提示双站部署 vite-plugin-pwa 缓存三分策略

⚠️ 备注

  • 选 vite-plugin-pwa 因为把 register worker 样板省了;基金估值这种几分钟变的必须 NetworkOnly,CacheFirst 会让用户看旧值
  • [需自行确认]:GitHub Pages 那站功能相对阉割(没 Worker 代理),别把双站讲成完全对等

追问①:为什么不用 CacheFirst 缓存估值?

估值几分钟内会变,CacheFirst 会让用户看到旧值误导判断;只有静态资源和字体这种不change的才适合缓存。


Q8: 数据存储架构

面试官可能问:LocalStorage 和 JSONBox 怎么分工?

🗣️ 口述稿

本地数据经 storageService 存 LocalStorage,fund_helper_ 前缀隔离;JSONBox 只做云端备份和跨端同步。同步按版本号决定推还是拉,冲突让用户选。Web 端没有的 VSCode 专属字段(hideStatusBar 等)在同步时要保护不被覆盖。

💡 关键词提示LocalStorage JSONBox备份 版本号 字段保护

⚠️ 备注

  • 为敢用 LocalStorage:总数据几百 KB 顶天,5MB 上限够用,省 IndexedDB 异步心智——这是有边界的判断题,MB 级或全文检索就要迁 IndexedDB
  • "按来源保护字段"是防两端字段模型不等对互相覆盖

追问①:LocalStorage 够用吗?

基金配置几百 KB、100 只也就几 KB,够用;一旦到 MB 级或要全文搜索就迁 IndexedDB,这条边界我说得出所以是有意选的。


🎙️ 行为面试

为什么做这个项目?

我自己定投,写代码时想瞄一眼收益又不想掏手机,市场没有顺手的 VSCode 基金插件就自己写了,顺便验证双端+同步+代理链路。

💡 关键词自用痛点 独立全链路

⚠️ 备注:动机要落在"解决自己的痒"而非"我有能力",面试官更信前者。


最大难点?

跨域最磨人:浏览器端调基金接口被 CORS 拦死,试过 JSONP(只部分接口支持)、第三方代理(不稳)、自建代理(要运维),最后才落地 Vite proxy(开发)+Cloudflare Worker(生产)的分层。是试错试出来的,不是一开始想好的。

💡 关键词CORS 试错三轮 分层收口

⚠️ 备注:[需自行确认]"具体试几个、每个卡哪"按真实试错过程填,别照搬口吻。


遗憾/弯路?

  1. 测试覆盖几乎为零,计算引擎靠手测很心虚
  2. 双端共享代码是复制粘贴的两份,更新易漏,该抽 shared package
  3. 四层代理里 Netlify 那层是半成品没收尾,文档说四层、实际三层

💡 关键词零测试 代码复制 Netlify半成品

⚠️ 备注:第三条第比第一二条能体现诚实度,强烈建议保留。


🃏 极简速记卡(面试前5分钟看)

  • Q1 双端同步:JSONBox云同步+版本号对比,本地LocalStorage兜底
  • Q2 双视图:单例FundDataManager,TreeView轻/Webview重
  • Q3 QDII:持仓行情加权估算+gztime过期检测
  • Q4 跨域:host/Vite/Worker分层代理
  • Q5 图表:统一init并联动暗黑主题
  • Q6 AI:OpenAI兼容切baseURL,5步向导
  • Q7 部署:CF+GH双站,PWA三策略缓存
  • Q8 存储:本地LocalStorage,云端JSONBox,字段保护
  • 行为 动机:自用痛点;难点:CORS试错;遗憾:零测试+代码复制+Netlify半成品

下一篇:02-智能回潮率检测仪系统

前端开发工程师 · 面试准备