上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

一种很好玩的新Require姿势

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5214

    回帖

    6089

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6089

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-8-29 04:19:19 | 显示全部楼层 | 阅读模式

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

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

    太秀了

    已有1人评分油猫币 理由
    朱焱伟 + 7 很给力!

    查看全部评分 总评分:油猫币 +7 

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    慵懒
    20 小时前
  • 签到天数: 640 天

    [LV.9]以坛为家II

    30

    主题

    536

    回帖

    1413

    积分

    荣誉开发者

    积分
    1413

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2023-8-29 09:08:47 | 显示全部楼层

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

    看错了
    a05A0322936323868928A39A72F836516.gif

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5214

    回帖

    6089

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6089

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-8-29 12:00:28 | 显示全部楼层
    steven026 发表于 2023-8-29 09:08
    [md]![image.png](data/attachment/forum/202308/29/090116mmlotb9vbnywknqz.png)
    我觉得这种方式更直观、 ...

    我不管我不管
    他这种方式骚
    小猫咪我已经腻了!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    20 小时前
  • 签到天数: 640 天

    [LV.9]以坛为家II

    30

    主题

    536

    回帖

    1413

    积分

    荣誉开发者

    积分
    1413

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2023-8-29 12:09:04 | 显示全部楼层
    李恒道 发表于 2023-8-29 12:00
    我不管我不管
    他这种方式骚
    小猫咪我已经腻了!

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

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-8-29 23:05:14 | 显示全部楼层
    我也有设想过做一个safeWindow的库,作用是自动修正其他库的window引用,大致思路是这样的:油猴对require的处理是将代码直接“粘贴”到脚本头部,那用2个require将待修正的库包裹,头尾用一个闭包函数包起来,中间的库就会变成函数内容,然后就可以转为字符串执行必要处理后再eval出去(也可以用字符串的引号来包裹库代码,但很容易因为转义问题出bug)。代码大概长这样:
    1. // ==UserScript==
    2. // ,,,
    3. // @require .../safeWindow-start.js
    4. // @require ...
    5. // @require .../safeWindow-end.js
    6. // ==/UserScript==
    复制代码

    safeWindow-start.js:
    1. const win = window.unsafeWindow ||  window;
    2. win.safeWindow = window;
    3. window = win;
    4. var {document, globalThis, self} = window;
    5. const requires = (() => {
    复制代码

    safeWindow-end.js:
    1. }).toString().slice(7,-1);
    2. // 将全局变量绑到window上
    3. eval(requires);
    复制代码

    我主要就是卡在将变量提升至全局这一步了,由于var声明在函数内部是局部变量,在外部是全局变量,js没有提供对词法环境的遍历接口,这使得要找出所有全局变量非常困难。用正则表达式来写的话,非严格模式下的变量甚至不需要显式声明,我想不出什么特别优雅的解法,所以最后搁置了这个想法。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5214

    回帖

    6089

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6089

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

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

    我第一反应也是可行
    然后心思心思又发现确实没什么好办法....
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表