用 Tauri 注入 UserScript
一篇由付费游戏价格计算器引发的思考 注意:该方式注入的脚本具备接近页面最高权限的执行能力。 如若涉及远程加载,必须实现签名、证书检查等完整性保护机制,否则可导致页面被完全接管。 在使用 Tauri 构建桌面 WebView 应用时,笔者偶然发现 它允许在 WebView 初始化阶段注入 JavaScript,在页面业务代码执行之前运行。这使得将 UserScript 直接内置进应用成为可能。 Tauri 提供的注入方式如下: 这个阶段发生在 WebView 初始化早期,比 DOMContentLoaded 更靠前,因此可以影响页面最初的运行环境。 UserScript 通常运行在 TamperMonkey / GreaseMonkey 环境中,依赖 在必要时,我们可以手动提供兼容的对象,供 UserScript 使用。 这种方式本质上是在把 UserScript 作为应用内置能力使用。 相比传统 UserScript 流程,它减少了外部依赖: 在分发层面,它更接近: “带脚本能力的桌面 Web 应用” 该模式的关键风险在于:注入脚本等同于页面最高权限执行环境。 需要注意: append_invoke_initialization_script 提供了一个非常直接的能力:在 WebView 初始化阶段注入 JavaScript。 借助这一机制,可以将 UserScript 作为应用内部逻辑层进行封装,实现: 这是一种将“浏览器扩展式能力”迁移到桌面应用分发体系中的实现路径。 示例项目:fknc-calculatorBuilder::append_invoke_initialization_script 这个 API。注入机制
tauri::Builder::default()
// Example script
// or: include_str!("script.js")
.append_invoke_initialization_script(r#"
// modify window properties directly
window.__APP__ = true;
// Overriding `fetch()`
window.fetch = () => {};
// inject custom stylesheets on the document, e.g.
window.addEventListener(
"DOMContentLoaded",
() => {}
);
"#)
.run(tauri::generate_context!())
.expect("error while running tauri application");UserScript 兼容性的处理方式
GM_* API 或 unsafeWindow 等扩展能力。而在普通 WebView 环境中,这些对象不存在。const unsafeWindow = 'undefined' === typeof GM_info ? window : unsafeWindow;使用价值
安全边界
总结