请问一下 unsafeWindow monkeyWindow 和 window 的区别 #102
-
中文资料讲这个的太少了, 我英文也不太好, 机翻找到的英文资料也一知半解, 能找到还在活跃的中文油猴开发可能就是这里了, 如果能解答一下我的疑问就太好了_(:3 我看别的资料说 unsafeWindow 是油猴修改成安全沙盒后为了方便操作网页的引用, 但是实际上我看了一下仓库里面的例子修改元素的时候也是直接使用 document 进行操作的, 而不需要添加 unsafeWindow 的前缀, 那这三个 window 主要是在哪些地方运用的呢? 主要是初学可能说得语无伦次还望见谅. |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 7 replies
-
一般来说,当你配置 grant 时,你的代码会被包裹在一个 例如油猴代码是 这个 customWindow 就是油猴脚本作用域下的 window,这样的好处是用户脚本的变量和函数定义不会与页面上已存在的变量和函数产生冲突,防止意外的命名冲突和变量污染 此外目标页面也有自己的 window,通常叫它 unsafeWindow ,很多时候页面的一些信息被放在页面的全局作用域上,比如 b 站当前用户信息可以通过 以上就脚本作用域内 window 和 unsafeWindow 当使用 vite-plugin-monkey 时,开发环境下的 window 来自页面模块作用域,构建后的代码获取到的 window 来自脚本作用域 也就是 因此为了统一获取方式,插件提供了 monkeyWindow 它总是返回 脚本作用域 的 window, GM_api/unsafeWindow 也能从它的属性上获取 |
Beta Was this translation helpful? Give feedback.
一般来说,当你配置 grant 时,你的代码会被包裹在一个
with(customWindow){ your_code }
里面,这里的 customWindow 是一个 Proxy 对象例如油猴代码是
console.log(document)
,当执行的时候会触发两次 customWindow 的 handler 的 get 方法,prop 参数分别是"console"
和"document"
这个 customWindow 就是油猴脚本作用域下的 window,这样的好处是用户脚本的变量和函数定义不会与页面上已存在的变量和函数产生冲突,防止意外的命名冲突和变量污染
此外目标页面也有自己的 window,通常叫它 unsafeWindow ,很多时候页面的一些信息被放在页面的全局作用域上,比如 b 站当前用户信息可以通过
unsafeWindow.__BiliUser__
获取以上就脚本作用域内 window 和 unsafeWindow
当使用 vite-plugin-monkey 时,开发环境下的 window 来自页面模块作用域,构建后的代码获取到的 window 来自脚本作用域
也就是
console.log(window)
在开发环境和构建环境的输出不一致因此为了统一获取方式,插件提供了 monkeyWindow 它总是返回 脚本作用域 的 window, GM_api/unsafeWindow 也能从它的属性上获取