1.22款Visual Studio Code实用插件推荐
2.精读ãwebreflowã
3.介绍几种Obsidian的阅读源码阅读源码进阶版插件
4.20款VS Code实用插件推荐
5.BetterScroll之插件化 的架构设计
6.盘点23个提高开发效率和美观性的 VSCode 插件!
22款Visual Studio Code实用插件推荐
Visual Studio Code凭借其插件式设计,成为了开发者的工具得力工具。为了提升开发效率和避免长时间工作(如),阅读源码阅读源码这里精选了款实用的工具VS Code插件,助你优化工作流程。阅读源码阅读源码以下是工具c 的项目实例源码其中一些关键插件:C# Dev Kit for VS Code:提供了C#开发的全方位支持,安装方法:Ctrl+Shift+x搜索C# Dev Kit。阅读源码阅读源码
C# for VS Code:C#语言的工具专门支持,安装方式:同样通过Ctrl+Shift+x搜索C#。阅读源码阅读源码
vscode-icons:提供个性化文件和文件夹图标,工具有助于代码管理,阅读源码阅读源码安装地址:marketplace.visualstudio.com。工具
Tabnine AI Autocomplete:AI代码补全工具,阅读源码阅读源码适用于多种语言,工具快速提升编码效率。阅读源码阅读源码
GitHub Copilot:AI辅助编程,智能代码建议,可在VS Code中使用。
CodeGeeX:强大智能助手,支持代码生成、注释和聊天功能。
Docker for VS Code:简化容器管理和部署,官方对战存档源码适用于Node.js、Python等。
Auto Close Tag:自动添加HTML/XML标签,前端开发者的好帮手。
Better Comments:智能注释工具,支持多种注释类型和样式。
ESLint:代码规范检查工具,提升代码质量。
GitLens:强大的Git源代码管理工具,提供代码作者信息和仓库浏览功能。
其他插件如Vue开发必备的Vetur、Element-UI助手、Angular Language Service等,助力特定框架开发。
以上插件均可以在VS Code的扩展市场(marketplace.visualstudio.com)轻松获取。通过这些工具,你可以更好地定制你的开发环境,提升编码体验和效率。如果你有更多的推荐,欢迎在文末留言分享。精读ãwebreflowã
ç½é¡µéæï¼åæµï¼æ¯é»ç¢æµç æ§çéè¦åå ä¹ä¸ï¼ç»åWhatforceslayout/reflowè¿ç¯æç« ä¸å¼ç¨ï¼æ´çä¸ä¸åæµçèµ·å ä¸ä¼åæèãåç¨è¿å¼ ç»å ¸å¾ï¼
ç½é¡µæ¸²æä¼ç»åDOM->CSSOM->Layout(éæorreflow)->Paint(éç»)->Composite(åæ)ï¼å ¶ä¸Compositeå¨ç²¾è¯»ãæ·±å ¥äºè§£ç°ä»£æµè§å¨åã详ç»ä»ç»è¿ï¼æ¯å¨GPUè¿è¡å æ åã
é£ä¹æé¤JSãDOMãCSSOMãCompositeå¯è½å¯¼è´çæ§è½é®é¢å¤ï¼å©ä¸çå°±æ¯æ们è¿æ¬¡å ³æ³¨çéç¹ï¼reflowäºãä»é¡ºåºä¸å¯ä»¥çåºæ¥ï¼éæåä¸å®éç»ï¼èéç»ä¸ä¸å®è§¦åéæã
æ¦è¿°ä»ä¹æ¶åä¼è§¦åLayout(reflow)å¢ï¼ä¸è¬æ¥è¯´ï¼å½å ç´ ä½ç½®åçååæ¶å°±ä¼ãä½ä¹ä¸å°½ç¶ï¼å 为æµè§å¨ä¼èªå¨å并æ´æ¹ï¼å¨è¾¾å°æ个æ°éææ¶é´åï¼ä¼å并为ä¸æ¬¡reflowï¼èreflowæ¯æ¸²æ页é¢çéè¦ä¸æ¥ï¼æå¼æµè§å¨å°±ä¸å®ä¼è³å°reflowä¸æ¬¡ï¼æ以æ们ä¸å¯è½é¿å reflowã
é£ä¸ºä»ä¹è¦æ³¨æreflow导è´çæ§è½é®é¢å¢ï¼è¿æ¯å 为æäºä»£ç å¯è½å¯¼è´æµè§å¨ä¼å失æï¼å³ææè½å并reflowæ¶æ²¡æå并ï¼è¿ä¸è¬åºç°å¨æ们ç¨jsAPI访é®æ个å ç´ å°ºå¯¸æ¶ï¼ä¸ºäºä¿è¯æ¿å°çæ¯ç²¾ç¡®å¼ï¼ä¸å¾ä¸æå触åä¸æ¬¡reflowï¼å³ä¾¿åå¨for循ç¯éã
å½ç¶ä¹ä¸æ¯æ¯æ¬¡è®¿é®å ç´ ä½ç½®é½ä¼è§¦åreflowï¼å¨æµè§å¨è§¦åreflowåï¼ææå·²æå ç´ ä½ç½®é½ä¼è®°å½å¿«ç §ï¼åªè¦ä¸å触åä½ç½®çååï¼ç¬¬äºæ¬¡å¼å§è®¿é®ä½ç½®å°±ä¸ä¼è§¦åreflowï¼å ³äºè¿ä¸ç¹ä¼å¨åé¢è¯¦ç»å±å¼ãç°å¨è¦è§£éçæ¯ï¼è¿ä¸ªâ触åä½ç½®çååâï¼å°åºæåªäºï¼
æ ¹æ®Whatforceslayout/reflowææ¡£çæ»ç»ï¼ä¸å ±æè¿ä¹å ç±»ï¼
è·å¾çå模åä¿¡æ¯elem.offsetLeft,S922源码elem.offsetTop,elem.offsetWidth,elem.offsetHeight,elem.offsetParent
elem.clientLeft,elem.clientTop,elem.clientWidth,elem.clientHeight
elem.getClientRects(),elem.getBoundingClientRect()
è·åå ç´ ä½ç½®ã宽é«çä¸äºæ段é½ä¼å¯¼è´reflowï¼ä¸åå¨ç»è¿ä¸è¯´ï¼å 为åªè¦è·åè¿äºä¿¡æ¯ï¼é½å¿ é¡»reflowæè½ç»åºåç¡®çå¼ã
æ»å¨elem.scrollBy(),elem.scrollTo()
elem.scrollIntoView(),elem.scrollIntoViewIfNeeded()
elem.scrollWidth,elem.scrollHeight
elem.scrollLeft,elem.scrollTop访é®åèµå¼
对scrollLeftèµå¼çä»·äºè§¦åscrollToï¼ææ导è´æ»å¨äº§ççè¡ä¸ºé½ä¼è§¦åreflowï¼ç¬è æ¥äºä¸äºèµæï¼ç®å主è¦æ¨æµæ¯æ»å¨æ¡åºç°ä¼å¯¼è´å¯è§åºååçªï¼æ以éè¦reflowã
focus()elem.focus()(æºç )
å¯ä»¥æ ¹æ®æºç çä¸ä¸æ³¨éï¼ä¸»è¦æ¯è¿ä¸æ®µï¼
//Ensurewehavecleanstyle(includingforceddisplaylocks).GetDocument().UpdateStyleAndLayoutTreeForNode(this)å³å¨èç¦å ç´ æ¶ï¼è½ç¶æ²¡ææ¿å ç´ ä½ç½®ä¿¡æ¯çè¯æ±ï¼ä½æä¸å®è¦è¢«èç¦çå ç´ è¢«éèæè 移é¤äºï¼æ¤æ¶å¿ é¡»è°ç¨UpdateStyleAndLayoutTreeForNodeéæéç»å½æ°ï¼ç¡®ä¿å ç´ ç¶ææ´æ°åæè½ç»§ç»æä½ã
è¿æä¸äºå ¶ä»elementAPIï¼
elem.computedRole,elem.computedName
elem.innerText(æºç )
innerTextä¹éè¦éæåæè½æ¿å°æ£ç¡®å 容ã
è·åwindowä¿¡æ¯window.scrollX,window.scrollY
window.innerHeight,window.innerWidth
window.visualViewport.height/width/offsetTop/offsetLeft(æºç )
åå ç´ çº§å«ä¸æ ·ï¼ä¸ºäºæ¿å°æ£ç¡®å®½é«åä½ç½®ä¿¡æ¯ï¼å¿ é¡»éæã
documentç¸å ³document.scrollingElementä» éç»
document.elementFromPoint
elementFromPointå 为è¦æ¿å°ç²¾ç¡®ä½ç½®çå ç´ ï¼å¿ é¡»éæã
Formç¸å ³inputElem.focus()
inputElem.select(),textareaElem.select()
focusãselect触åéæçåå åelem.focus类似ã
é¼ æ äºä»¶ç¸å ³mouseEvt.layerX,mouseEvt.layerY,mouseEvt.offsetX,mouseEvt.offsetY(æºç )
é¼ æ ç¸å ³ä½ç½®è®¡ç®ï¼å¿ é¡»ä¾èµä¸ä¸ªæ£ç¡®çæå¸ï¼æä»¥å¿ é¡»è§¦åreflowã
getComputedStylegetComputedStyleé常ä¼å¯¼è´éæåéç»ï¼æ¯å¦è§¦åéæåå³äºæ¯å¦è®¿é®äºä½ç½®ç¸å ³çkeyçå ç´ ã
Rangeç¸å ³range.getClientRects(),range.getBoundingClientRect()
è·åéä¸åºåç大å°ï¼å¿ é¡»reflowæè½ä¿é精确æ§ã
SVG大éSVGæ¹æ³ä¼å¼åéæï¼å°±ä¸ä¸ä¸æ举äºï¼æ»ä¹ä½¿ç¨SVGæä½æ¶ä¹è¦åæä½domä¸æ ·è°¨æ ã
contenteditable被设置为contenteditableçå ç´ å ï¼å æ¬å°å¾åå¤å¶å°åªè´´æ¿å¨å ï¼å¤§éæä½é½ä¼å¯¼è´éæã(æºç )
精读Whatforceslayout/reflowä¸é¢å¼ç¨äºå ç¯å ³äºreflowçç¸å ³æç« ï¼ç¬è æå 个éè¦çæ»ç»ä¸ä¸ã
repaint-reflow-restylerepaint-reflow-restyleæå°ç°ä»£æµè§å¨ä¼å°å¤æ¬¡domæä½å并ï¼ä½åIEçå ¶ä»å æ ¸æµè§å¨å°±ä¸ä¿è¯æè¿æ ·çå®ç°äºï¼å æ¤ç»åºäºä¸ä¸ªå®å ¨åæ³ï¼
//badvarleft=,top=;el.style.left=left+"px";el.style.top=top+"px";//betterel.className+="theclassname";//orwhentopandleftarecalculateddynamically...//betterel.style.cssText+=";left:"+left+"px;top:"+top+"px;";æ¯å¦ç¨ä¸æ¬¡classNameçä¿®æ¹ï¼æä¸æ¬¡cssTextçä¿®æ¹ä¿è¯æµè§å¨ä¸å®è§¦åä¸æ¬¡éæãä½è¿æ ·å¯ç»´æ¤æ§ä¼éä½å¾å¤ï¼ä¸å¤ªæ¨èã
avoidlargecomplexlayoutsavoidlargecomplexlayoutséç¹å¼ºè°äºè¯»åå离ï¼é¦å çä¸é¢çbadcaseï¼
functionresizeAllParagraphsToMatchBlockWidth(){ //Putsthebrowserintoaread-write-read-writecycle.for(vari=0;i<paragraphs.length;i++){ paragraphs[i].style.width=box.offsetWidth+'px';}}å¨for循ç¯ä¸ä¸æ访é®å ç´ å®½åº¦ï¼å¹¶ä¿®æ¹å ¶å®½åº¦ï¼ä¼å¯¼è´æµè§å¨æ§è¡N次reflowã
è½ç¶å½JavaScriptè¿è¡æ¶ï¼åä¸å¸§ä¸çæææ§å¸å±å¼é½æ¯å·²ç¥çï¼ä½å½ä½ 对å¸å±åäºä¿®æ¹åï¼åä¸å¸§ææå¸å±å¼ç¼åé½ä¼ä½åºï¼å æ¤å½ä¸æ¬¡è·åå¼æ¶ï¼ä¸å¾ä¸éæ°è§¦åä¸æ¬¡reflowã
è读åå离çè¯ï¼å°±ä»£è¡¨äºéä¸è¯»ï¼è½ç¶è¯»ç次æ°è¿æ¯é£ä¹å¤ï¼ä½ä»ç¬¬äºæ¬¡å¼å§å°±å¯ä»¥ä»å¸å±ç¼åä¸æ¿æ°æ®ï¼ä¸ç¨è§¦åreflowäºã
å¦å¤è¿æå°flexå¸å±æ¯ä¼ ç»floatéæé度快å¾å¤ï¼3msvsmsï¼ï¼æ以è½ç¨flexåçå¸å±å°±å°½éä¸è¦ç¨floatåã
reallyfixinglayoutthrashingreallyfixinglayoutthrashingæå°äºç¨fastdomå®è·µè¯»åå离ï¼
ids.forEach(id=>{ fastdom.measure(()=>{ consttop=elements[id].offsetTopfastdom.mutate(()=>{ elements[id].setLeft(top)})})})fastdomæ¯ä¸ä¸ªå¯ä»¥å¨ä¸å离代ç çæ åµä¸ï¼å离读åæ§è¡çåºï¼å°¤å ¶éåç¨å¨reflowæ§è½ä¼ååºæ¯ãæ¯ä¸ä¸ªmeasureãmutateé½ä¼æ¨å ¥æ§è¡éåï¼å¹¶å¨window.requestAnimationFrameæ¶æºæ§è¡ã
æ»ç»åæµæ æ³é¿å ï¼ä½éè¦æ§å¶å¨æ£å¸¸é¢çèå´å ã
æ们éè¦å¦ä¹ 访é®åªäºå±æ§ææ¹æ³ä¼å¯¼è´åæµï¼è½ä¸ä½¿ç¨å°±ä¸è¦ç¨ï¼å°½éåå°è¯»åå离ãå¨å®ä¹è¦é¢ç¹è§¦ååæµçå ç´ æ¶ï¼å°½éä½¿å ¶è±ç¦»ææ¡£æµï¼åå°åæµäº§ççå½±åã
讨论å°åæ¯ï¼ç²¾è¯»ãwebreflowã·Issue#·dt-fe/weekly
å¦æä½ æ³åä¸è®¨è®ºï¼è¯·ç¹å»è¿éï¼æ¯å¨é½ææ°ç主é¢ï¼å¨æ«æå¨ä¸åå¸ãå端精读-å¸®ä½ çéé è°±çå 容ã
çæ声æï¼èªç±è½¬è½½-éåç¨-éè¡ç-ä¿æç½²åï¼åæå ±äº«3.0许å¯è¯ï¼
åæï¼/post/介绍几种Obsidian的进阶版插件
本文介绍几种Obsidian的进阶版插件,帮助用户提升笔记管理与编辑效率。
Markdown Table Editor插件用于新建表格,通过快捷键Ctrl+P打开命令面板即可使用,无需额外插件,简化了表格操作。
Media Extended与Media Extended BiliBili Plugin插件允许在Obsidian中预览视频,Media Extended支持多种视频链接,而Media Extended BiliBili专为Bilibili视频提供支持。通过鼠标左键点击链接,视频将在Obsidian内部播放。
Note Refactor插件帮助用户将长笔记快速拆分为多个小笔记,只需在笔记界面按Ctrl+P打开命令面板,选择拆分功能即可操作。
Mind Map插件支持创建思维导图,用户可以使用快捷键Ctrl+P搜寻“mindmap”命令,为当前Markdown文件生成思维导图。
proxyGithub插件用于访问第三方插件市场,但在使用时需注意每次打开需在安全模式下进行,确保数据安全。
Excalidraw插件提供手绘风格的流程图工具,满足创意与可视化需求。iOS应用网站源码
Better Word Count插件在页面右下角显示文字数量,方便用户了解笔记长度。
Reading Time插件在页面右下角显示阅读时间,帮助用户预估完成阅读所需时间。
Emoji Toolbar插件允许添加小表情,增强笔记的趣味性与表达力。
Calendar插件在页面右上角显示日历,并支持新建笔记记录待完成事项,方便用户规划与管理时间。
Open 3D Graph View插件打开3D视图,适用于需要三维展示的数据或结构。
Outliner插件提供大纲节点功能,清晰显示文字层级结构,支持使用快捷键调整节点位置,便于查看与管理。
Word工具栏1 Cmenu提供常用功能的快捷访问,适合鼠标操作习惯的用户,通过Ctrl+P打开命令面板后可见菜单栏。
obsidian-editing-toolbar插件类似Word的工具栏,简化了Markdown编辑过程,通过github链接可获取该插件。源码转换为移码
Obsidian-Table-Generator插件用于生成表格,通过github链接可获取源代码,便于用户自行修改与应用。
jupyter plugin允许在Obsidian中编写Python代码,通过Bilibili视频教程了解安装与使用方法,试验代码以熟悉功能。
obsius插件将笔记发布为网址,方便分享链接,通过右键选择publish to obsius即可分享。
quickshare插件提供快速分享Obsidian笔记链接功能,通过点击create share link即可生成链接。
open link with和custom frame插件配合使用,允许在Obsidian中以默认浏览器打开链接网站,提高浏览体验。
obsidian-web-browser插件提供Obsidian内置浏览器功能,通过链接可直接在Obsidian内访问网页。
滚动快捷键Ctrl+end和Ctrl+home分别实现滚动到页面底部和顶部,提高操作效率。
款VS Code实用插件推荐
VS Code是一个轻量级但功能强大的源代码编辑器,通过安装插件可以支持多种语言的环境开发,使其成为开发语言工具中的佼佼者。以下是一些我整理的实用VS Code插件,希望能够提升大家的日常开发和工作效率:
1. <a href="marketplace.visualstudio.com...中文(简体)语言包
2. C# Dev Kit for Visual Studio Code
3. <a href="marketplace.visualstudio.com...vscode-icons
4. <a href="marketplace.visualstudio.com...Tabnine AI Autocomplete
5. <a href="marketplace.visualstudio.com...Copilot AI辅助编程工具
6. <a href="marketplace.visualstudio.com...Auto Close Tag
7. <a href="marketplace.visualstudio.com...Better Comments
8. <a href="marketplace.visualstudio.com...ESLint
9. <a href="marketplace.visualstudio.com...GitLens
. <a href="marketplace.visualstudio.com...Git History
. Drawio Preview
. <a href="marketplace.visualstudio.com...Path Intellisense
. Vetur
. vscode-element-helper
. Vue VSCode Snippets
. Angular Snippets (Version 9)
. <a href="marketplace.visualstudio.com...Code Runner
. Icon Fonts
. Gitlink
. GraphQL
请根据您的具体需求安装和使用这些插件,希望它们能帮助您提高开发效率。如有更好的插件推荐,欢迎在文末留言。
BetterScroll之插件化 的架构设计
在深入理解BetterScroll 2.0的插件化架构设计之前,我们先对BetterScroll的基本信息进行简要了解。BetterScroll 是一款为移动端(已支持PC)设计的插件,主要解决各种滚动场景需求。它在保持与iscroll兼容的基础上,引入了更多特色功能和性能优化。该插件在发布多个版本后,获得了5万次npm月下载量和+的star数量。发展至2.0版本,其核心是为了支持插件的按需加载,采取了插件化架构设计。
BetterScroll 2.0采用了插件化架构,将CoreScroll作为最小的滚动单元,通过丰富事件和钩子暴露核心功能,其余功能则由不同插件扩展实现。这种设计使得BetterScroll更加灵活,能够适应多种场景需求。具体架构图请参考如下链接(注意:链接可能失效或无法直接引用)。
BetterScroll 2.0采用monorepos组织方式,使用lerna进行多包管理,每个组件独立为一个npm包。此架构与西瓜播放器类似,通过插件化设计,CoreScroll作为基础单元,其他功能通过插件实现,如长列表中的上拉加载和下拉刷新功能,分别通过pull-up和pull-down插件实现。
插件化架构的好处之一在于支持按需加载,将独立功能拆分为独立插件,核心系统更加稳定,具有一定的健壮性。接下来,本文将深入分析BetterScroll插件化架构的实现细节。
在插件化架构设计中,关键点包括插件管理、插件连接和插件通信。BetterScroll 2.0通过统一的插件开发规范进行插件管理。插件开发需遵循特定规范,如静态属性和接口实现,通过构造函数注入BetterScroll实例进行逻辑注入。
插件连接机制允许核心系统管理可用插件,通过插件注册表确定加载时机和插件信息。以PullUp插件为例,用户首先安装插件,通过BScroll.use方法注册插件,并在实例化BetterScroll时传入配置项。内部实现通过观察BScroll.use方法及源码,我们可以了解到插件注册和初始化过程。
插件通信机制依赖核心系统的事件总线功能,提供统一的通信途径。在BetterScroll中,核心系统以EventEmitter类形式提供事件总线,插件通过注入的实例进行事件通信,实现插件间的协作。
除了插件化架构设计,BetterScroll在工程化方面也采用了现代解决方案,如使用lerna进行多包管理,遵循开源库实践。项目中package.json文件和npm scripts配置展示了工程化实践。对于更多细节和学习资源,读者可以访问原作者的文章链接(注意:链接可能失效或无法直接引用)。
盘点个提高开发效率和美观性的 VSCode 插件!
VSCode插件集合,提升开发效率与美观性 VSCode是一款功能强大的源代码编辑器,提供了语法高亮、代码自动补全、代码重构等功能,内置命令行工具与Git版本控制,支持多种编程语言与调试功能。本文为您推荐款VScode插件,涉及美观、编程、效率等多个方面,满足不同开发需求。 美观类插件: CodeSnap:轻松生成高分辨率精美代码 :emojisense::为Markdown文档或命令行添加表情,提升编程趣味性 Marquee:改造编程主屏幕,展示新闻、天气等信息 Material Theme:安装不同主题,自定义编辑器外观 Bookmarks:为文件特定行添加书签 Bracket Pair Colorizer:给括号添加不同颜色,区分区块 vscode-icons:更换更好看的文件图标 前端编程类插件: Vetur:为Vue项目提供语法高亮、智能感知等 Auto Close Tag:自动闭合HTML/XML标签 Auto Rename Tag:自动重命名HTML/XML标签 formate: CSS/LESS/SCSS formatter:格式化CSS/LESS/SCSS,增强可读性 Live Server:为静态和动态页面启动本地服务器 Debugger for Chrome:将JS代码调试嵌入Chrome浏览器 C/C++编程类插件: C/C++:为VSCode添加C/C++语言支持,包括IntelliSense和Debugging C++ Intellisense:为C/C++提供智能感知 CMake Tools:为VSCode添加CMake支持与感知 Python编程类插件: Python:为VSCode添加Python语言支持,包括IntelliSense和Debugging Jupyter:为VSCode添加Jupyter Notebook功能 效率类插件: Git Graph:可视化Git提交流程 koroFileHeader:格式化文件头部注释与函数注释 Code Runner:直接运行多种语言代码片段或文件 Better Comments:提供特定类型注释的高亮 CodeTime:分析每天敲代码时间 推荐技术交流群与资源获取方式: 本文建有技术交流群,欢迎进群获取最新优质文章、岗位推荐与互动交流。添加微信号:dkl,备注研究方向、学校/公司与知乎,即可入群。 关注Python与数据挖掘知乎账号与公众号,快速获取最新技术资讯与学习资源。