当前位置: 首页 > news >正文

免费开源的WPS AI插件 察元AI助手:globalSettings:文件与 localStorage 双读策略

摘要

注释说明 PluginStorage 不持久化,因此设置落盘在数据目录 settings.json,并辅以 localStorage 键 NdGlobalSettings。排查「重启丢配置」时应先确认 FileSystem API 是否可用。

关键词

settings.json;持久化;WPS FileSystem

扩展阅读与维护提示

本篇围绕「globalSettings:文件与 localStorage 双读策略」组织材料。仓库内与主题最直接相关的检索词包括:settings.json、持久化、WPS FileSystem。建议在阅读正文所列片段后,用 IDE 全局搜索这些符号,沿 import 与调用栈向上追问「谁在什么时机调用」,而不是只记住单文件路径。

摘要所概括的要点为:注释说明 PluginStorage 不持久化,因此设置落盘在数据目录 settings.json,并辅以 localStorage 键 NdGlobalSettings。排查「重启丢配置」时应先确认 FileSystem API 是否可用。落地到排障时,可把现象粗分为三类交叉验证:配置是否按预期写入持久化介质;WPS COM 上下文是否可用(例如是否缺少 ActiveDocument);以及网络与证书策略是否拦截了 fetch。本篇涉及的模块通常只覆盖其中一两类,需要与相邻篇目拼成完整拼图。

教程文件名「30-quanshezhi-localStorage-yu-wenjian.md」仅用于导航与排序,不等价于源码模块名。若正文中的行号与本地分支不一致,多半因合并导致行偏移,此时应以函数名、导出名为锚重新检索;团队若维护了生成脚本,可在变更大段源码后重新运行以保持摘录大致对齐。

本文刻意避免对产品能力做营销式承诺:所述行为均以当前仓库可见实现为准。若组织策略要求离线或内网模型,应在网关、证书与代理层收口,而不是假设加载项能绕过浏览器安全模型。

若你同时阅读 docs/chayuan-llm-chain-series,可先对照其中的总体链路图理解「请求从 UI 到 chatApi」的次序,再回到本教程看数据结构、默认值与修改风险面;两者互补,不重复堆砌功能列表。

正文

1. 策略说明与路径

getSettingsPath 拼接数据根目录与 FILE_NAME。

阅读源码摘录时,请把它当作「定位入口」而非完整实现:同一函数可能在其他分支还有早退条件或 try/catch。修改默认行为前,建议用最小文档手工走一遍相关助手或对话框,并观察任务清单与日志中的字段是否与预期一致,再决定是否做数据迁移或配置重置。

// src/utils/globalSettings.js 第1-23行 /** * 全局设置 - 持久化存储 * 注意:WPS PluginStorage 在加载项关闭后不持久化,必须使用文件或 localStorage * 策略:优先文件(数据路径下 settings.json),备用 localStorage(跨会话持久化) */ import { getEffectiveDataDir, joinDataPath, ensureDir, getDefaultDataPath } from './dataPathSettings.js' const FILE_NAME = 'settings.json' const PLUGIN_STORAGE_KEY = 'NdGlobalSettings' const LOCAL_STORAGE_KEY = 'NdGlobalSettings' function getSettingsBaseDir() { return getEffectiveDataDir() || getDefaultDataPath() } function getSettingsPath() { const base = getSettingsBaseDir() if (!base) return null const sep = base.includes('\\') ? '\\' : '/' const part = (FILE_NAME || '').replace(/^[/\\]+/, '').replace(/[/\\]+/g, sep) return base + sep + part }

2. 从文件读取

readFileString 与 ReadFile 两种 API 兼容分支。

阅读源码摘录时,请把它当作「定位入口」而非完整实现:同一函数可能在其他分支还有早退条件或 try/catch。修改默认行为前,建议用最小文档手工走一遍相关助手或对话框,并观察任务清单与日志中的字段是否与预期一致,再决定是否做数据迁移或配置重置。

// src/utils/globalSettings.js 第25-36行 function loadFromFile() { try { const path = joinDataPath(FILE_NAME) || getSettingsPath() if (!path) return null const fs = window.Application?.FileSystem if (!fs?.readFileString && !fs?.ReadFile) return null const raw = fs.readFileString ? fs.readFileString(path) : fs.ReadFile(path) if (!raw) return null return JSON.parse(raw) } catch (e) { return null }
http://www.jsqmd.com/news/689521/

相关文章:

  • Qt Creator新建QML项目踩坑记:为什么选了Qt 5.8就报‘No valid kits found’?
  • 从OOSEM到MagicGrid:一文理清主流MBSE方法论,帮你找到最适合团队的那一款
  • SAP自动化新思路:当Python遇到Scripting Tracker,如何优雅地绕过SAP GUI Scripting的授权难题?
  • 室内空间管理为什么必须走向“高精度无感感知”——基于镜像视界(浙江)科技有限公司核心技术体系的下一代空间智能方案
  • 保姆级教程:在Colab和本地用safetensors加速你的Hugging Face模型加载
  • 如何用Resemble Enhance实现专业级语音降噪与增强:4大特色让你轻松优化音频质量
  • AFL内核探秘:从插桩到反馈的闭环模糊测试引擎
  • 为什么92%的医院Docker集群仍在裸奔?Docker 27透明加密模块上线首周已拦截47次敏感数据越权访问,
  • Java项目里用ZeroMQ实现发布订阅,比你想的简单:一个股票行情推送的实战案例
  • 面试官最爱问的10个计算机网络问题,从TCP/IP到DNS,一次讲透
  • AI辅助编程:Vibe Coding实践与传统技能平衡
  • 嵌入式Linux开机自启踩坑记:从BusyBox init到Systemd的迁移思考
  • Sentinel控制台(Dashboard)从下载到生产环境部署的完整指南:Docker打包、开机自启与安全配置
  • AI 会话记忆模块静默失效:一次从链路耦合到分层治理的工程复盘
  • 【仅限首批2000名VSCode Insider】:获取VSCode 2026多智能体协同私有扩展包(含Agent权限沙箱+可信执行环境TEEs预编译模块)
  • PyCharm死活找不到Anaconda虚拟环境?别慌,手把手教你定位并修复那个烦人的‘Conda executable not found‘
  • Python微信自动化管理实战方案:WeChat Toolbox技术架构解析
  • 避开这些坑!用STM32定时器主从模式精准控制松下伺服电机转指定圈数
  • Docker日志不再“黑盒”:27天打通采集→传输→存储→分析→告警闭环(金融级SLA保障配置曝光)
  • 免费开源的WPS AI插件 察元AI助手:generateMultimodalAsset:类型校验与分支派发
  • 大模型时代,普通程序员如何逆袭?掌握AI工具,抢占高薪先机!
  • 告别 Cygwin 编译烦恼:在 Windows 上使用 MSYS2 + MinGW-w64 一键搞定 OpenOCD 最新版
  • C#调用ONNX模型时,你可能会遇到的3个坑及解决方案(输入维度、数据类型、性能优化)
  • 线性判别分析(LDA)理论原理、应用与实现指南
  • 从CSAPP的DataLab实验,聊聊那些让你“拍大腿”的位运算奇技淫巧
  • 别再为CUDA内存错误发愁了!MMDetection3D复现MVXNet时,这个学习率参数必须调小
  • 公式转文本
  • 别再空谈‘金字塔原理’了!聊聊冯唐《金线》里那些程序员更容易踩的‘思维坑’
  • ESP32无人机开发终极指南:从零构建开源四轴飞行器
  • 保姆级教程:在ROS中手把手配置激光雷达(laser_link)到机器人(base_link)的静态TF