
前端开发者工具插件系统【免费下载链接】scriptcatScriptCat, a browser extension that can execute userscript; 脚本猫一个可以执行用户脚本的浏览器扩展项目地址https://gitcode.com/gh_mirrors/sc/scriptcat点击查看免费下载ScriptCat 的 Cloud Script Export 模块packages/cloudscript/负责把单个用户脚本连同其GM_*values、cookies 和元数据一起打包为一个可独立执行的 zip 归档供脚本迁移或离线执行使用。读完本文你将掌握该模块的架构与类型定义、导出参数value/cookie 表达式的语法规则、打包产物结构与运行方式并能通过源码级证据理解本地打包执行与云端同步备份两条路径的根本区别。定位本地打包而非云端同步packages/cloudscript/README.md开篇就强调了一个容易混淆的关键点Cloud Script Export 是把单个脚本连同其数据打包为可独立执行的归档而不是同步到远端云存储它与packages/filesystem提供的云同步完全是两回事。Cloud Script Export本文主题产出物是一个 zip 归档落地到本地当前唯一 target 为local不涉及任何远端上传目的是脚本迁移与离线执行云端同步/备份由 packages/filesystem 提供支持 WebDAV、OneDrive、Google Drive、Dropbox、百度网盘、S3 等存储后端语义细节见 docs/cloud-sync.md。两者可以这样区分一个负责把脚本包成一个可运行的程序带走另一个负责把脚本仓库同步到远端存储。下文所有内容均围绕前者展开。架构总览工厂 Target 实现cloudscript包采用工厂 目标实现的结构核心文件有三个文件职责packages/cloudscript/cloudscript.ts定义导出接口CloudScript、参数类型ExportParams、cookie/value 表达式解析函数packages/cloudscript/factory.tsCloudScriptFactory工厂按ExportTarget创建对应实现packages/cloudscript/local.tsLocalCloudScript将脚本与数据写入 zip 的本地打包实现在 src/app/repo/export.ts 中可以看到导出目标的类型定义export type ExportTarget local | tencentCloud;ExportTarget目前声明了local与tencentCloud两个可能值但工厂侧只落地了local。在 packages/cloudscript/factory.ts 中export default class CloudScriptFactory { static create(type: ExportTarget, params: ExportParams) { switch (type) { case local: return new LocalCloudScript(params); default: throw new Error(unknown type ${type}); } } static params(): { [key: string]: CloudScriptParams } { return { local: {} }; } }从源码结构看tencentCloud是预留的扩展点目前调用CloudScriptFactory.create(tencentCloud, ...)会直接抛出unknown type异常。扩展一个新的导出目标只需在ExportTarget中追加类型、在create()的 switch 中注册对应实现类、在params()中补充该目标需要的 UI 参数声明title/type: select/options。LocalCloudScript实现了统一的CloudScript接口export default interface CloudScript { exportCloud(script: Script, code: string, values: Value[], cookies: ExportCookies[]): Promisevoid; }该接口的四个入参正是导出包的四大数据来源脚本对象、脚本源码、已筛选的 values、已筛选的 cookies。导出参数与表达式语法ExportParams是导出行为的所有可调参数packages/cloudscript/cloudscript.tsexport type ExportParams { [key: string]: any; exportValue: string; // value 导出表达式 exportCookie: string; // cookie 导出表达式 overwriteValue: boolean; // 导入时是否覆盖原 value overwriteCookie: boolean; // 导入时是否覆盖原 cookie };参数明细如下参数类型默认值含义exportValuestring脚本exportvalue元数据无则为空字符串指定要导出哪些GM_*values 的 key 表达式exportCookiestring脚本exportcookie元数据无则为空字符串指定要导出哪些域下 cookies 的表达式overwriteValuebooleanfalse运行时utils.js导入逻辑是否覆盖原有 valueoverwriteCookiebooleanfalse运行时utils.js导入逻辑是否覆盖原有 cookievalue 表达式一行一个 key逗号分隔parseExportValue(script, exportValue)负责解析 value 表达式。语法规则按换行分隔每一行内再用逗号分隔多个 key只导出当前脚本中真实存在的 key。export async function parseExportValue(script: Script, exportValue: string): PromiseValue[] { const lines exportValue.split(\n); const values await valueClient.getScriptValue(script); for (const line of lines) { if (line.trim()) { const s line.split(,); for (const key of s) { const k key.trim(); if (k values[k]) { result.push(values[k]); } } } } return result; }示例表达式三行第一行含两个 keyapiToken theme,language lastLoginAt解析时theme与language都会被导出。由于有values[k]的存在性校验不存在的 key 会被静默跳过。cookie 表达式一行一个站点分号分隔参数parseExportCookie(exportCookie)的语法规则按换行分隔站点每个站点行内用分号分隔keyvalue参数必须提供url或domain之一才会触发抓取抓取结果挂在cookies字段上。export function parseExportCookie(exportCookie: string): PromiseExportCookies[] { const lines exportCookie.split(\n); for (const line of lines) { const detail: ExportCookies {}; for (const param of line.split(;)) { const s param.split(); if (s.length ! 2) continue; detail[s[0].trim()] s[1].trim(); } if (detail.url || detail.domain) { result.push( new PromiseExportCookies((resolve) { getCookies(detail).then((cookies) { detail.cookies cookies; resolve(detail); }); }) ); } } return Promise.all(result); }getCookies内部走chrome.cookies.getAll并处理了chrome.runtime.lastError记录错误后继续执行不阻断导出流程。实际抓取时传入的参数即chrome.cookies.GetAllDetails所支持的条件url、domain、name等。示例表达式两行urlhttps://example.com;namesession_id domain.example.orgExportCookies的结构为export type ExportCookies { [key: string]: any; domain?: string; url?: string; cookies?: chrome.cookies.Cookie[]; };默认值来源脚本元数据在 src/pages/components/CloudScriptPlan/index.tsx 中导出对话框打开时会从脚本 metadata 读取默认表达式export function cloudDefaultParams(script: Script): PickExportParams, exportValue | exportCookie { return { exportValue: script.metadata.exportvalue?.[0] ?? , exportCookie: script.metadata.exportcookie?.[0] ?? , }; }即脚本头部元数据exportvalue与exportcookie可以作为导出表达式的默认值用户仍可在导出对话框中手动覆盖。打包产物zip 内部结构LocalCloudScript.exportCloud是打包的核心packages/cloudscript/local.ts它把六类内容写入 zipexportCloud(script: Script, code: string, values: Value[], cookies: ExportCookies[]): Promisevoid { this.zip.file(userScript.js, code); this.zip.file(cookies.js, exports.cookies ${JSON.stringify(cookies)}); this.zip.file(values.js, exports.values ${JSON.stringify(values)}); this.zip.file(config.js, export default ${JSON.stringify({ version: ExtVersion, uuid: script.uuid, overwrite: { value: this.params.overwriteValue, cookie: this.params.overwriteCookie, }, })}); this.zip.file(package.json, stringpackageTpl); this.zip.file(utils.js, stringutilsTpl); this.zip.file(index.js, stringindexTpl); return Promise.resolve(); }归档内文件内容来源userScript.js用户脚本完整源码ScriptCodeDAO读取的脚本代码cookies.jsexports.cookies [...]即按表达式筛选出的 cookiesparseExportCookie的产物values.jsexports.values [...]即按表达式筛选出的 valuesparseExportValue的产物config.js元数据扩展版本、脚本 uuid、overwrite.value/overwrite.cookieExtVersion与导出参数package.jsonnpm 包声明依赖scriptcat-nodejssrc/template/cloudcat-package/package.tplutils.js运行时引导逻辑读取源码与数据驱动ScriptCat执行src/template/cloudcat-package/utils.tplindex.jsnpm 入口require(./utils)后调用utils.run()src/template/cloudcat-package/index.tpl元数据 config.jsconfig.js记录了三个关键信息{ version: 扩展版本号, uuid: 脚本uuid, overwrite: { value: false, cookie: false } }version取自App/app/const中的ExtVersion标识打包时使用的 ScriptCat 扩展版本uuid是脚本的唯一标识供恢复/迁移时关联原始脚本overwrite来自导出参数overwriteValue/overwriteCookie由运行时导入逻辑消费。package.json 与外部依赖src/template/cloudcat-package/package.tpl 声明了包的基本信息{ name: cloudcat-package, version: 1.0.0, description: scriptcat后台脚本打包项目, main: index.js, scripts: { run: node index.js }, license: MIT, dependencies: { scriptcat-nodejs: ^0.1.7 } }关键点package.json声明了外部依赖scriptcat-nodejs^0.1.7因此产出的包不是解压后即可直接node index.js运行的。运行时引导 utils.jssrc/template/cloudcat-package/utils.tpl 展示了实际的离线执行逻辑const fs require(fs); const { ScriptCat } require(scriptcat-nodejs/dist/src/scriptcat); const { ModelValues } require(scriptcat-nodejs/dist/src/storage/values); const { cookies } require(./cookies); const { values } require(./values); exports.run function () { const code fs.readFileSync(userScript.js, utf8); const run new ScriptCat(); run.RunOnce(code, { cookies: cookies, values: new ModelValues(values), }).then((res) { console.log(res); }); }执行时读取同目录userScript.js作为脚本源码读取cookies.js/values.js中的数据通过scriptcat-nodejs提供的ScriptCat.RunOnce在 Node.js 环境中运行脚本一次values 用ModelValues包装以模拟GM_*value 存储执行结果res输出到控制台。运行方式两步走由于依赖scriptcat-nodejs产出的 zip 需要两步才能运行# 1. 解压归档 unzip script-uuid.zip -d cloudcat-package cd cloudcat-package # 2. 安装外部依赖 npm install # 3. 运行等价于 node index.js npm run runnpm run run由 index.tpl 驱动最终调用utils.run()。这种先安装依赖、再执行的设计使得归档可以在任意具备 Node.js 与 npm 的环境中离线运行脚本达到脚本迁移或离线执行的目的。完整调用链从导出对话框到 zip 下载从 src/pages/components/CloudScriptPlan/index.tsx 可以还原完整的导出流程读取导出计划ExportDAO.findByScriptID(script.uuid)查询该脚本是否已有保存的导出计划目标、参数组装参数优先取已保存参数否则回退到cloudDefaultParamsexportvalue/exportcookie元数据与默认开关值解析数据parseExportValue(script, params.exportValue)筛选 valuesparseExportCookie(params.exportCookie)筛选 cookies创建 zip 与导出CloudScriptFactory.create(local, { zip, ...params })创建LocalCloudScriptScriptCodeDAO.findByUUID读取脚本源码然后exportCloud(script, code, values, cookies)写入全部文件压缩与下载zipFile.generateAsync({ type: blob, compression: DEFLATE, compressionOptions: { level: 9 }, comment: Created by Scriptcat })生成 Blob再通过chrome.downloads.download以saveAs: true、文件名${script.uuid}.zip触发下载。值得注意的压缩细节导出使用 DEFLATE 压缩、等级 9最高压缩比zip 包注释为Created by Scriptcat相关实现见 src/pkg/utils/jszip-x.ts。导出计划的持久化由ExportDAOsrc/app/repo/export.ts负责以脚本uuid为主键保存target与各目标的参数快照下次打开对话框时自动回填。与 filesystem 云同步的边界再次强调最后再次明确边界避免误用需要把脚本打包带走、离线执行或迁移使用 Cloud Script Export本文产物是 zip本地下载需要把脚本同步/备份到 WebDAV、OneDrive、Google Drive、Dropbox、百度网盘、S3使用 packages/filesystem语义细节见 docs/cloud-sync.md。Cloud Script Export 全程不产生任何远端网络上传产出物完全由用户本地持有这一点是它与云同步路径最本质的区别。赞分享前端开发者工具插件系统【免费下载链接】scriptcatScriptCat, a browser extension that can execute userscript; 脚本猫一个可以执行用户脚本的浏览器扩展项目地址https://gitcode.com/gh_mirrors/sc/scriptcat点击查看免费下载相关推荐Nexe项目完整指南将Node.js应用打包为独立可执行文件Nexe项目完整指南将Node.js应用打包为独立可执行文件 Nexe是一个功能强大的命令行工具能够将Node.js应用程序编译成单个可执行文件。通过使用N构建工具开发工具CLIGemstash调试技巧解决私有gem服务器常见问题的实用方法Gemstash调试技巧解决私有gem服务器常见问题的实用方法 你是否在使用Gemstash作为RubyGems缓存和私有gem服务器时遇到了问题 作为PyInstaller终极指南3步将Python脚本打包成独立可执行文件PyInstaller终极指南3步将Python脚本打包成独立可执行文件 PyInstaller是一个功能强大的Python应用程序打包工具它能够将你的Py开发工具构建工具上一篇Ant Design Vue Pro中的CI/CD流程搭建自动化部署的最佳实践下一篇Qwen2.5-VL-3B30亿参数重构多模态AI应用边界创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考