首页
Search
1
解决visual studio code (vscode)安装时没有选择安装路径问题
138 阅读
2
Linux 下 Bash 脚本 bad interpreter 报错的解决方法
131 阅读
3
Arch Linux 下解决 KDE Plasma Discover 的 Unable to load applications 错误
107 阅读
4
如何在 Clash for Windows 上配置服务
78 阅读
5
Uniapp如何引入自定义样式文件
75 阅读
clash
服务器
javascript
全部
游戏资讯
登录
Search
加速器之家
累计撰写
1,061
篇文章
累计收到
0
条评论
首页
栏目
clash
服务器
javascript
全部
游戏资讯
页面
搜索到
624
篇与
的结果
2024-08-24
Web Extension Live Reloading
TL;DRUse neutrino-webextension which works out of the box.Read on if you are interested in the theory behind the scene.Reload APIThere is a browser.management API which is used by many extension-livereload extensions. But looks like it does not work when manifest.json changes.Instead we use another API browser.runtime.reload() which reloads the extension itself.Reload TimingHow do we know when to reload? It should happens after file changes. If using bundler there usually be hooks for performing jobs after bundling. Otherwise take a look at fs.watch or node-watch.Reload SignalHow does the extension know when to reload itself? It is not ideal using WebSocket or extension messaging API which involves native setups. Instead we try to leverage the browser extension API itself.The idea is that the extension monitors web requests for a special url. Whenever the browser requests this url the extension gets notified and performs reloading logic.Project StructureThis is an example project structure for the sake of this post.project/ ├── livereload │ ├── background.js │ ├── livereload.html │ └── livereload.js ├── src │ ├── background │ │ └── index.js │ └── popup │ ├── index.html │ └── index.js └── manifest.jsonWeb Request RedirectingFirst we need to be able to redirect web requests.manifest.json{ "background": { "persistent": true, "scripts": [ "livereload/background.js", "src/background/index.js" ] }, "permissions": [ "*://neutrino-webextension.reloads/*", "webRequest", "webRequestBlocking" ], "web_accessible_resources": [ "livereload/*" ] }http://neutrino-webextension.reloads is the special url that we are going to monitor.livereload/background.jsconst b = typeof browser === 'undefined' ? chrome : browser b.webRequest.onBeforeRequest.addListener( () => ({ redirectUrl: b.runtime.getURL('livereload/livereload.html') }), { urls: ['*://neutrino-webextension.reloads/*'], types: ['main_frame'] }, ['blocking'] )It will redirect the request to livereload/livereload.html.Dummy PageWe first send a message to background, then close the page immediately.livereload/livereload.html Live Reload Script has to be in separate file.livereload/livereload.jsconst b = typeof browser === 'undefined' ? chrome : browser b.runtime.sendMessage('_neutrino-webextension.reloads_') if (window.history.length ({ redirectUrl: b.runtime.getURL('livereload/livereload.html') }), { urls: ['*://neutrino-webextension.reloads/*'], types: ['main_frame'] }, ['blocking'] ) b.runtime.onMessage.addListener(message => {if (message === '_neutrino-webextension.reloads_') {b.runtime.reload()}})Browsing HistorySo far so good! Except there is one tiny issue. The redirection will leave browsing histories in the browser. Let's remove it!manifest.json{ "background": { "persistent": true, "scripts": [ "livereload/background.js", "src/background/index.js" ] }, "permissions": [ "browsingData", "*://neutrino-webextension.reloads/*", "webRequest", "webRequestBlocking" ], "web_accessible_resources": [ "livereload/*" ] }Remove before reloading.livereload/background.jsconst b = typeof browser === 'undefined' ? chrome : browser b.webRequest.onBeforeRequest.addListener( () => ({ redirectUrl: b.runtime.getURL('livereload/livereload.html') }), { urls: ['*://neutrino-webextension.reloads/*'], types: ['main_frame'] }, ['blocking'] ) b.runtime.onMessage.addListener(message => { if (message === '_neutrino-webextension.reloads_') { b.browsingData.remove({hostnames: ['neutrino-webextension.reloads'],originTypes: {unprotectedWeb: true,protectedWeb: true},since: Date.now() - 2000},{ history: true })b.browsingData.remove({originTypes: {extension: true},since: Date.now() - 2000},{ history: true }) b.runtime.reload() } })This will remove the history of the special url and the livereload.html.Open BrowserTo open the brower with the special url:npm install --save-dev openAfter file changes, callopen('http://neutrino-webextension.reloads') // specify browser open('http://neutrino-webextension.reloads', { app: 'firefox' }) // with arguemnts open( 'http://neutrino-webextension.reloads', { app: ['google-chrome', '--profile-directory=Profile 1'] } )The extension should recognise the request and reload itself.ConclusionEven though it works, this is still a lot of work to setup if implementing manually. It is recommended use a preset like neutrino-webextension which is battery included.
2024年08月24日
2 阅读
0 评论
0 点赞
2024-08-24
如何在 Sass 中方便引用祖先选择器
双亲选择器在 Sass 中双亲选择器(Parent Selector 有时也叫父选择器) & 是一个十分有用且常用的选择器,它可以复用外部选择器的名字,从而更轻松地实现多重样式编写。.btn{ background: transparent; &:hover{ background: grey; } }会输出.btn { background: transparent; } .btn:hover { background: grey; }祖先选择器有时候我们遇到这样一种模式,如主题样式,在元素根处可能有 .dark-theme 来说明目前处于黑暗模式;或者使用 Modernizr 检测浏览器特性,在根元素会根据环境添加相应 class 表示特性支持情况。这时候我们写样式可能就需要拆分开来写。.btn{ background: transparent; &:hover{ background: grey; } } .dark-theme .btn{background: linear-gradient(cornflowerblue, rebeccapurple);}这里有两点不太舒服的地方: 处理同个逻辑的样式需要拆开写。 与祖先选择器名耦合,不方便修改。 我们来看看如何解决这两个痛点。@at-root在 Sass 中有一个 at 规则叫 @at-root,它可以跳出当前嵌套直接在文档根输出内容。.btn{ background: transparent; &:hover{ background: grey; } @at-root .dark-theme & {background: linear-gradient(cornflowerblue, rebeccapurple);}}会输出.btn { background: transparent; } .btn:hover { background: grey; } .dark-theme .btn { background: linear-gradient(cornflowerblue, rebeccapurple); }但这里依然没有解决祖先选择器名耦合的问题,于是我们进一步抽象。Mixin将以上用法封装为 mixin 即可达到复用。@mixin dark-theme{ @at-root .dark-theme & { @content; } } .btn{ background: transparent; &:hover{ background: grey; } @include dark-theme{ background-image: linear-gradient(cornflowerblue, rebeccapurple); } }支持修饰符一些过渡库,如 Vue transition 和 React Transition Group 会设置一系列的类型名,如 .fade-enter、.fade-exit,在 Sass 中我们可以直接拼接 &-enter 进行复用,现在让我们的 mixin 也支持:@mixin dark-theme($modifiers...) { @if length($modifiers) > 0{ @each $modifier in $modifiers{ @at-root .dark-theme {$modifier} { @content; } } } @else { @at-root .dark-theme & { @content; } } } .btn{ background: transparent; &:hover{ background: grey; } @include dark-theme{ background: linear-gradient(cornflowerblue, rebeccapurple); } @include dark-theme(-enter) { background: cornflowerblue; } @include dark-theme(-enter-active, -exit) { background: rebeccapurple; } }输出.btn { background: transparent; } .btn:hover { background: grey; } .dark-theme .btn { background: linear-gradient(cornflowerblue, rebeccapurple); } .dark-theme .btn-enter { background: cornflowerblue; } .dark-theme .btn-enter-active { background: rebeccapurple; } .dark-theme .btn-exit { background: rebeccapurple; }可以看到 @include dark-theme(-enter-active, -exit) 在多个修饰符的情况下生成了单独的重复内容。要去掉重复我们可以直接拼接选择器。@mixin dark-theme($modifiers...) { @if length($modifiers) > 0{ $selectors: (); @each $modifier in $modifiers{ $selectors: append( $selectors, #{".dard-theme "}#{&}#{$modifier}, comma ); } @at-root #{$selectors} { @content; } } @else { @at-root .dark-theme & { @content; } } }输出.btn { background: transparent; } .btn:hover { background: grey; } .dark-theme .btn { background: linear-gradient(cornflowerblue, rebeccapurple); } .dard-theme .btn-enter { background: cornflowerblue; } .dard-theme .btn-enter-active, .dard-theme .btn-exit {background: rebeccapurple;}抽象出通用 Mixin最后我们将这个模式再进一步抽象出来,成为通用的 at-root mixin。@mixin at-root($ancestor, $modifiers...) { @if length($modifiers) > 0{ $selectors: (); @each $modifier in $modifiers{ $selectors: append( $selectors, #{$ancestor}#{" "}#{&}#{$modifier}, comma ); } @at-root #{$selectors} { @content; } } @else { @at-root #{$ancestor} & { @content; } } }现在 dark-theme 可以这么定义。@mixin dark-theme($modifiers...) { @include at-root('.dark-mode', $modifiers...) { @content; } }最后通过封装 mixin 我们可以方便地在规则内部直接引用祖先选择器定义规则,同时摆脱与祖先类型名的耦合,使到代码可以灵活应对变更。
2024年08月24日
1 阅读
0 评论
0 点赞
2024-08-24
摸鱼游戏推荐:经典小游戏大全
在工作疲劳后,我们需要适当放松自己,为自己注入新的动力。这篇优秀的摸鱼小游戏盘点将为你提供一些游戏,让你提高效率。这些游戏的节奏与休息相结合,因此它们非常适合放松。以下是五款适合摸鱼的优秀小游戏:《迷雾大陆》在游戏中,当你接近怪物时,攻击会自动触发。你只需要控制自己的移动,因此游戏技术要求几乎为零。你只需要收集流派装备,跟随游戏的成长曲线,就可以轻松通过关卡。你还可以创造一个新的流派,游戏的刷怪系统非常有趣。《汤姆猫跑酷》这款游戏只需要一根手指就可以畅玩。只要不撞到障碍,你就可以一直奔跑。你可以通过跳跃、左右滑动和弯腰等方式来解决障碍。这些操作需要一些预判,但你可以使用道具来辅助你的跑酷之旅,比如金币吸引。这款游戏非常适合快节奏的摸鱼。《负之遗产》在游戏中,你一觉醒来发现自己背负着巨额的负债!通过打败敌怪,你可以获得用于锻造的素材,从而还清自己的欠债。但怪物对你来说是很有威胁的,你需要一些强大的装备来挽回劣势。这些兵器有着非常帅气的外观和强力的数值,收藏价值满满。游戏的乐趣主要在于收集各种高级兵装,看着金币的增长,也会让你别有一番收获感。《荒岛生存指南》在这款游戏中,你流落在荒岛上,面临着各种野生动物和幻想设计的敌人。你可以逃避,也可以对这些怪物发起讨伐。游戏的乐趣在于探索,看看你能否在这个荒岛上完成成就,最终获救。《主神模拟器2》在这款游戏中,你可以掌控多个世界,让你控制的小人下去历练。世界根据你的行动会有不同的结局和分支,养成角色也是一个很有意思的事情。因为轮回者们的成长路线是不一样的,有操纵元素的魔术师,也有一加入空间就自带超级功法的修仙者。这款游戏非常适合放松,让你摆脱工作的疲劳。
2024年08月24日
3 阅读
0 评论
0 点赞
2024-08-24
魔兽世界国服金币价格大起大落:怀旧服跌至新低,正式服则翻倍!
魔兽世界国服商城开放以来,时光徽章的价格一直备受关注。但经过一个多月的对比,我们发现怀旧服和正式服的时光徽章走势完全不同。怀旧服的时光徽章近一个月涨缓慢涨,从约6000金币到7286金币,最高点为7639金币。这表明怀旧服的金币逐渐贬值,符合游戏规律。反观正式服,8月1日开服时时光徽章最高价为100万金币,随后持续下跌,如今不到40万金币,跌幅达60%。虽然开局100万金币可能是系统设置有问题,但后续阴跌说明正式服金币价格在缓慢上涨。这与正式服人气回归有关,越来越多的玩家进入正式服,虽然金币价值不如怀旧服高,但仍有很多地方需要大量金币,玩家数量增加将推动金价上涨。正式服人气是否更旺不好判断,但说明奥杜尔版本并非如玩家和暴雪所想象的那么好。台服奥杜尔阶段金价经历过一次暴跌,到最低点时约为一万金币35元左右。但在TOC即将开放时,金价开始缓慢上涨,几乎翻倍并一直维持到ICC阶段。TOC版本人气旺盛,助推金币需求。正式服即将开放11.0地心之战,金价暂时稳定,但一旦新资料片开放,初期需要大量金币,金价仍有上涨空间。怀旧服处于不如意阶段,但正式服处于玩家急速回流时刻,所以出现了当前金价冰火两重天的情况。
2024年08月24日
4 阅读
0 评论
0 点赞
2024-08-24
必玩的赛车手游大全-全部赛车游戏盘点
手游必玩!五款经典赛车游戏大全推荐竞速游戏带来的刺激感十分强烈,尤其是赛车类游戏,在游戏中驾驶赛车在道路上狂飙,能够获得极具爽感的游戏体验,成为经典的玩法类型之一。本文将介绍五款手游必玩的赛车游戏,供玩家们选择和体验。1、《极品飞车:集结》在《极品飞车:集结》中,玩家可以尝试不受限制的街头竞速玩法,驾驶赛车在大世界的街头行驶观光,并参与自定义赛事,在他人自行规划的赛道路线上与对手进行速度比拼。该作的追逐模式是极品飞车系列端游生涯玩法的延续,相当的热血。2、《狂野飙车9:竞速传奇》《狂野飙车9:竞速传奇》有着多款可供玩家收集和驾驶的知名超跑,每一辆车在模型的搭建上都做得十分精细,很好地将原型的特色在游戏里展现了出来。游戏还开放了多种赛事玩法,可让玩家直接拿到各类赛车图纸或整车钥匙,提供了更多能解锁车辆的途径。3、《拉力竞速2》《拉力竞速2》是一款氛围十分浓郁的拉力赛车游戏,每条赛道都经过了极为细致的设计,在道路细节上更是做得极为还原,能最大化地将拉力赛的魅力展现出来。该作在竞速玩法之外,还提供了较为全面的改车功能,可让玩家根据所要驾驶的赛道条件去更换车辆的配件,令赛车能更适配赛道的环境,整体的操控难度也不大,游玩门槛也并不高。4、《哆啦A梦飞车》《哆啦A梦飞车》将动画中的所有主要角色都收录到了游戏里,成为玩家们能选用的驾驶员。游戏在玩法上也提供了很欢乐的道具模式,玩家们可在捡到哆啦A梦中的各种神奇道具后,用它们来拦住对手为自己创造优势,也可前往更考验技术的竞速模式,与他人通过速度来分出高下。5、《城市飞车2》《城市飞车2》在玩法上延续了前作中口碑很不错的贴纸、车队等玩法,并为玩家们提供了几乎全部赛车的试驾功能,可让玩家尽情地去寻找适合自己的赛车,或是通过练习来磨练各赛车的竞速技巧。该作的赛道地图很是丰富,每一条都有着自己的独特之处,能为玩家们奉上极具爽感的竞速体验,享受飞驰的激情和热血。以上就是五款经典赛车游戏大全的介绍,想要尝试驾驶赛车进行狂飙疾驰的玩家可千万不能错过,毕竟在这五部赛车游戏里,无论哪一部都是不错的竞速佳作,能为玩家带来很棒的体验。
2024年08月24日
4 阅读
0 评论
0 点赞
1
...
67
68
69
...
125