Skip to content

请问一下 unsafeWindow monkeyWindow 和 window 的区别 #102

Answered by lisonge
kayanouriko asked this question in Q&A
Discussion options

You must be logged in to vote

一般来说,当你配置 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 也能从它的属性上获取

Replies: 1 comment 7 replies

Comment options

You must be logged in to vote
7 replies
@lisonge
Comment options

@kayanouriko
Comment options

@kayanouriko
Comment options

@lisonge
Comment options

@kayanouriko
Comment options

Answer selected by kayanouriko
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants