李恒道 发表于 2023-8-29 04:19:19

一种很好玩的新Require姿势

https://github.com/scriptscat/userscript-learn-guide/pull/1/commits/0bb8898e60f7eeab58e4a788e6778219ef63ddfd

我一开始其实就在寻觅这种方法
没想到社区有人pr过来了

太秀了

steven026 发表于 2023-8-29 09:08:47

本帖最后由 steven026 于 2023-8-29 12:01 编辑

看错了
!(data/attachment/forum/202308/29/090808v8kx4330jh0wwb79.gif)

李恒道 发表于 2023-8-29 12:00:28

steven026 发表于 2023-8-29 09:08
!(data/attachment/forum/202308/29/090116mmlotb9vbnywknqz.png)
我觉得这种方式更直观、 ...

我不管我不管
他这种方式骚
小猫咪我已经腻了!

steven026 发表于 2023-8-29 12:09:04

李恒道 发表于 2023-8-29 12:00
我不管我不管
他这种方式骚
小猫咪我已经腻了!

看错了 想起来了
Vue的引入方式和React不一样,React直接require就导入了,Vue还要额外处理
好久没用Vue都快忘记了

cxxjackie 发表于 2023-8-29 23:05:14

我也有设想过做一个safeWindow的库,作用是自动修正其他库的window引用,大致思路是这样的:油猴对require的处理是将代码直接“粘贴”到脚本头部,那用2个require将待修正的库包裹,头尾用一个闭包函数包起来,中间的库就会变成函数内容,然后就可以转为字符串执行必要处理后再eval出去(也可以用字符串的引号来包裹库代码,但很容易因为转义问题出bug)。代码大概长这样:
// ==UserScript==
// ,,,
// @require .../safeWindow-start.js
// @require ...
// @require .../safeWindow-end.js
// ==/UserScript==
safeWindow-start.js:
const win = window.unsafeWindow ||window;
win.safeWindow = window;
window = win;
var {document, globalThis, self} = window;
const requires = (() => {
safeWindow-end.js:
}).toString().slice(7,-1);
// 将全局变量绑到window上
eval(requires);
我主要就是卡在将变量提升至全局这一步了,由于var声明在函数内部是局部变量,在外部是全局变量,js没有提供对词法环境的遍历接口,这使得要找出所有全局变量非常困难。用正则表达式来写的话,非严格模式下的变量甚至不需要显式声明,我想不出什么特别优雅的解法,所以最后搁置了这个想法。

李恒道 发表于 2023-8-30 20:52:45

cxxjackie 发表于 2023-8-29 23:05
我也有设想过做一个safeWindow的库,作用是自动修正其他库的window引用,大致思路是这样的:油猴对require ...

{:4_98:}我第一反应也是可行
然后心思心思又发现确实没什么好办法....
页: [1]
查看完整版本: 一种很好玩的新Require姿势