20 行代码实现一个外置式 Stylus 扩展 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
autoxbc
V2EX    前端开发

20 行代码实现一个外置式 Stylus 扩展

  •  
  •   autoxbc 2019-10-31 13:37:07 +08:00 3150 次点击
    这是一个创建于 2254 天前的主题,其中的信息可能已经有所发展或是发生改变。

    长久以来我对很多浏览器扩展都是不满意的,这次重写 Stylus

    理想中的 User CSS loader 应该符合以下条件

    1 . CSS 应该是外置的,这样才能满足
    1). 方便用顺手的编辑器改写
    2). 使用预处理器
    3). 同时给多个浏览器使用
    4). 避免浏览器崩溃毁数据

    2 . CSS 应该是自匹配的,不需要额外编写规则。把 v2ex.com.css 放在硬盘上,立即对网站生效,删除后立即失效 styles.png

    3 . CSS 模块化,163.com.css 先加载,news.163.com.css 后加载,规则叠加,互不引用 link.png

    4 . CSS 应该有简单的地址查询能力

    >> www.bilibili.com.css /* 只对 B 站文章页面生效 */ html[location*="/read/cv"] { ...some code } /* 只对 B 站视频页面生效 */ html[location*="/video/av"] { ...some code } 

    按照这个标准,写了个简易版

    Tampermonkey UserJS

    // ==UserScript== // @name outboard user css loader // @author autoxbc // @version 1.0 // @match *://*/* // @run-at document-start // @require https://wzrd.in/standalone/tldjs // ==/UserScript== if(location.hostname) { const root = document.documentElement ; root.setAttribute('location', location ); let domain = tldjs.getDomain(location); const domains = [ domain ]; const subs = tldjs.getSubdomain(location).split('.').filter( e => e ).reverse(); subs.forEach( sub => domains.push( domain = sub + '.' + domain ) ); domains.forEach( async domain => { const link = Object.assign( document.createElement('link') , { rel:'stylesheet', href:`https://localhost/styles/${ domain }.css`, } ); root.append(link); const { ok } = await fetch( link.href , { mode:'cors', cache:'no-cache', } ); if(!ok) link.remove(); } ); } 

    tld.js 的 standalone 版本地址是 tld.js 作者 oncletom 给出的,比较安全
    https://github.com/oncletom/tld.js/issues/37

    注意:
    既然是外置式,需要准备一个文件服务器来传递数据,这里用 node.js + http-server

    http-server 启动参数

    http-server -a localhost --cors --ssl --cert cert.pem --key key.pem 

    CORS 标志使得这里不使用特权方法 GM_xmlhttpRequest 也能跨域;
    启用 SSL 避免了浏览器的混合内容安全策略错误,需要给文件服务器添加自签名证书,OpenSSL 或者 LibreSSL 或者在线生成;
    这里也没有使用 GM_addStyle,GM_addStyle 会把 CSS 内嵌,不利于调试;现在这样更容易区分代码来自那个文件

    addStyle.png

    事实上,在我自己的系统里,不止 User CSS 外置,这个加载器也用 Tampermonkey 的 @require 外置了,所有浏览器都可以同时对接这个加载器,即 EaaS -- Extensions as a Service

    有人喜欢 Chrome,有人喜欢 Firefox,如果他们都用外置式的扩展,会不会更有趣?

    第 1 条附言    2020-08-03 02:40:13 +08:00
    对于给文件服务器生成私钥和证书,建议按照 Deno 里的教程操作
    https://github.com/denoland/deno/tree/master/cli/tests/tls
    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2365 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:32 PVG 19:32 LAX 03:32 JFK 06:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86