San DevTools 技术解析(下) #581
BUPTlhuanyu
started this conversation in
技术分享
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
San DevTools 技术解析(下)
文章导航
San-Devtools传送门
前言
我们已经连续分享了《San DevTools 技术解析》上篇与中篇,讲了其中四大模块:
Backend
、Frontend
、Message Channel
和Debugging Protocol
,基本完成了San DevTools
整体架构与核心技术讲解,除这些技术外,我们还有哪些有意思的技术?今天来讲下:DevTools 扩展开发
和项目中其他比较有价值的技术。DevTools 扩展开发
插件技术的文章业内有些比较不错,具体可参考最后的参考资料。本文主要从DevTools的角度来简单介绍下插件技术。
简介
概念:从Chrome官方资料来看,我们正在说的应该叫Chrome扩展(
Chrome Extension
),真正意义上的Chrome插件是浏览器底层的功能扩展,可能需要C++的代码,且了解浏览器底层技术去开发。鉴于Chrome插件的叫法已经习惯,本文所说的插件也是Chrome扩展。Chrome插件是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包。
DevTools 扩展
什么是DevTools扩展?它是为 Chrome DevTools 添加新功能的插件,功能上可新增加Panel UI面板和侧边栏,与被检查的页面交互,获取类似网络请求、Dom等信息。与其他扩展类似:有Backgroud、Content Script和其他项。DevTools 扩展都有一个 DevTools 页面,可以访问DevTools Api:
官方提供的DevTools扩展架构图,感觉没有之前的图更直接清晰,大家可比对下如下两图,加深理解,其实说的是同一件事情。
DevTools 扩展实例
实现扩展可通过简单的三步实现:
Manifest.json:指向HTML文件
HTML只引入JS文件,一般啥也没有
调用 API 创建自定义面板,同一个插件可以创建多个自定义面板
关键技术:
chrome.devtools.panels.create
DevTools 扩展调试方式
因扩展需要多个页面与JS,调试时各模块方式也不同,这里做个汇总:
Content Script 调试:F12或右键->检查,包括Inject Script
Devtools Panel 调试:panel 面板里右键 -> 检查
总结:
其它技术
Monorepo 项目管理
Monorepo 是管理项目代码的一种方式,指在一个项目仓库(repo)中管理多个模块/包(packages),不同于常见的每个模块建立一个repo。适合于大型前端项目的代码管理。
San DevTools
采用这种代码组织方式,通过yarn workspace
管理依赖和运行项目。比传统git-submodule
的多个repo管理上方便很多。模块解析
代码里经常可以看到如下的引入:
@shared
和@backend
的路径是如何解析的呢,只需要配置两个文件:简易中间件服务器
没看过 TJ 大神的Koa源码吧?听说过Koa的
洋葱模型
吗?这种模式开发和使用中间件非常方便。在San DevTools
里我们简易实现一个中间件服务器。消息合并
做移动端Hybird等通信方案的同学,可能知道消息发送过于频繁时,不能立即发送所有事件,需要合并消息后发送,降低发送频次。在
San DevTools
中,消息不是立即发送,先放入堆栈中,通过requestAnimationFrame
自动根据系统的帧频来发送事件。简化后的示例代码如下:有三个点可以关注下:
_emit
方法接收数据时有个chunk模式,先把数据接收到_receivingQueue
,当标志为最后一条数据时,把_receivingQueue
整体emit
出去;send
方法里有个BATCH_DURATION的变量,控制事件的最小时间;_nextSend
中通过requestAnimationFrame
根据系统帧频发送事件;字体图标Iconfont
阿里的iconfont提供了非常丰富的字体图标,可以通过项目管理的方式,在平台管理一系列图标,并做为整体下载提供一个字体文件,包含了所有的图标。对于多人维护的项目,管理起来不是很方便,也不便于确认哪些图标没有使用。
DevTools
中我们通过一定的技巧,通过代码的方式维护所有的图标,使用起来非常方便。首先实现
icon.san
基础字体组件,核心是通过type
属性,渲染不同的字体图标其中
icons.ts
定义/维护全部的字体图标最后使用时就非常简单了,指定type即可
最后
San生态全景,繁荣的生态建设,落地在Feed、搜索、小程序等百度核心主航道业务,已经成为百度大前端的基础设施。
参考资料
Beta Was this translation helpful? Give feedback.
All reactions