- 前言
大家好,我是若川。最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,或者关注我的公众号若川视野,回复“源码”参与。已进行三个月,大家一起交流学习,共同进步,很多人都表示收获颇丰。
想学源码,极力推荐之前我写的《学习源码整体架构系列》 包含jQuery
、underscore
、lodash
、vuex
、sentry
、axios
、redux
、koa
、vue-devtools
、vuex4
、koa-compose
、vue 3.2 发布
、vue-this
、create-vue
、玩具vite
等10余篇源码文章。
本文仓库地址:
git clone https://github.com/lxchuan12/open-in-editor.git
,本文最佳阅读方式,克隆仓库自己动手调试,容易吸收消化。
要是有人说到怎么读源码,正在读文章的你能推荐我的源码系列文章,那真是无以为报啊。
我的文章尽量写得让想看源码又不知道怎么看的读者能看懂。我都是推荐使用搭建环境断点调试源码学习,哪里不会点哪里,边调试边看,而不是硬看。正所谓:授人与鱼不如授人予渔。
阅读本文后你将学到:
- 如何解决该功能报错问题
- 如何调试学习源码
launch-editor-middleware、launch-editor
等实现原理
1.1 短时间找不到页面对应源文件的场景
不知道你们有没有碰到这样的场景,打开你自己(或者你同事)开发的页面,却短时间难以找到对应的源文件。
这时你可能会想要是能有点击页面按钮自动用编辑器打开对应文件的功能,那该多好啊。
而vue-devtools
提供了这样的功能,也许你不知道。我觉得很大一部分人都不知道,因为感觉很多人都不常用vue-devtools
。
你也许会问,我不用vue
,我用react
有没有类似功能啊,有啊,请看react-dev-inspector。你可能还会问,支持哪些编辑器呀,主流的 vscode、webstorm、atom、sublime
等都支持,更多可以看这个列表 Supported editors。
本文就是根据学习尤大写的 launch-editor 源码,本着知其然,知其所以然的宗旨,探究 vue-devtools
「在编辑器中打开组件」功能实现原理。
1.2 一句话简述其原理
1 | sh复制代码code path/to/file |
一句话简述原理:利用nodejs
中的child_process
,执行了类似code path/to/file
命令,于是对应编辑器就打开了相应的文件,而对应的编辑器则是通过在进程中执行ps x
(Window
则用Get-Process
)命令来查找的,当然也可以自己指定编辑器。
1.3 打开编辑器无法打开组件的报错解决方法
而你真正用这个功能时,你可能碰到报错,说不能打开这个文件。
1 | sh复制代码Could not open App.vue in the editor. |
这里说明下写这篇文章时用的是
Windows
电脑,VSCode
编辑器,在Ubuntu
子系统下使用的终端工具。同时推荐我的文章使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具,用过的都说好。
解决办法也简单,就是这句英文的意思。
1.3.1 方法一:先确保在终端能用命令打开你使用的编辑器,文中以VSCode
为例
如果你的命令行本身就不能运行code
等命令打开编辑器,那肯定是报错的。这时需要把VSCode
注入到命令行终端中。
注入方法也简单。我的交流群里有小伙伴提供了mac
电脑的截图。Windows 用户安装VSCode后,终端默认支持 code 命令无需此操作。
mac
电脑在 VSCode
command + shift + p
,Windows
则是 ctrl + shift + p
。然后输入shell
,选择安装code
。如下图:
这样就能在终端中打开VSCode
的了。
如果能在终端打开使用命令编辑器能打开,但实际上还是报错,那么大概率是没有识别到你的编辑器。
那么可以通过方法二设置指定编辑器。
1.3.2 方法二:具体说明编辑器,在环境变量中说明指定编辑器
在vue
项目的根目录下,对应本文则是:vue3-project
,添加.env.development
文件,其内容是EDITOR=code
。这里重点说明下,我的 vue-cli
版本是4.5.12
,好像在vue-cli 3.5
及以上版本才支持自定义EDITOR
这样的环境变量。
1 | sh复制代码# .env.development |
不用指定编辑器的对应路径(
c/Users/lxchu/AppData/Local/Programs/Microsoft VS Code/bin/code
),因为会报错。为什么会报错,因为我看了源码且试过。因为会被根据空格截断,变成c/Users/lxchu/AppData/Local/Programs/Microsoft
,当然就报错了。
也有可能你的编辑器路径有中文路径导致报错,可以在环境变量中添加你的编辑器路径。
如果你通过以上方法,还没解决报错问题。欢迎留言,或者加我微信 ruochuan12
交流。毕竟电脑环境不一,很难保证所有人都能正常执行,但我们知道了其原理,就很容易解决问题。
接下来我们从源码角度探究「在编辑器中打开组件」功能的实现原理。
- vue-devtools Open component in editor 文档
探究原理之前,先来看看vue-devtools
官方文档。
Open component in editor
To enable this feature, follow this guide.
这篇指南中写了在Vue CLI 3
中是开箱即用。
1 | sh复制代码Vue CLI 3 supports this feature out-of-the-box when running vue-cli-service serve. |
也详细写了如何在Webpack
下使用。
1 | sh复制代码# 1. Import the package: |
同时也写了如何在Node.js
中使用等。
Node.js
You can use the launch-editor package to setup an HTTP route with the
/__open-in-editor
path. It will receive file as an URL variable.
查看更多可以看这篇指南。
- 环境准备工作
熟悉我的读者,都知道我都是推荐调试看源码的,正所谓:哪里不会点哪里。而且调试一般都写得很详细,是希望能帮助到一部分人知道如何看源码。于是我特意新建一个仓库open-in-editor git clone https://github.com/lxchuan12/open-in-editor.git
,便于大家克隆学习。
安装vue-cli
1 | sh复制代码npm install -g @vue/cli |
1 | sh复制代码node -V |
这里同时说明下我的vscode版本。
1 | sh复制代码code -v |
前文提到的Vue CLI 3
中开箱即用和Webpack
使用方法。
vue3-project/package.json
中有一个debug
按钮。
选择第一项,serve vue-cli-service serve
。
我们来搜索下'launch-editor-middleware'
这个中间件,一般来说搜索不到node_modules
下的文件,需要设置下。当然也有个简单做法。就是「排除的文件」右侧旁边有个设置图标「使用“排查设置”与“忽略文件”」,点击下。
其他的就不赘述了。可以看这篇知乎回答:vscode怎么设置可以搜索包含node_modules中的文件?
这时就搜到了vue3-project/node_modules/@vue/cli-service/lib/commands/serve.js
中有使用这个中间件。
如下图所示:
- vue-devtools 开箱即用具体源码实现
接着我们来看Vue CLI 3
中开箱即用具体源码实现。
1 | js复制代码// vue3-project/node_modules/@vue/cli-service/lib/commands/serve.js |
本文项目使用的是Vue3,如果无法访问谷歌应用商店,如果未安装 vue3 对应的 vue-devtools,可以点此下载安装Vue3对应版本的vue-devtools
若平时项目开发使用的是vue2,可以点此下载安装vue2版本的vue-devtools
点击vue-devtools
中的图中 open in editor
按钮时,会有一个请求,http://localhost:8080/__open-in-editor?file=src/App.vue
,不出意外就会打开该组件啦。
接着我们在launchEditorMiddleware
的具体实现。
- launch-editor-middleware
看源码时,先看调试截图。
在launch-editor-middleware
中间件中作用在于最终是调用 launch-editor
打开文件。
1 | js复制代码// vue3-project/node_modules/launch-editor-middleware/index.js |
上一段中,这种切换参数的写法,在很多源码中都很常见。为的是方便用户调用时传参。虽然是多个参数,但可以传一个或者两个。
可以根据情况打上断点。比如这里我会在launch(path.resolve(srcRoot, file), specifiedEditor, onErrorCallback)
打断点。
1 | js复制代码// vue3-project/node_modules/launch-editor-middleware/index.js |
- launch-editor
跟着断点来看,走到了launchEditor
函数。
1 | js复制代码// vue3-project/node_modules/launch-editor/index.js |
6.1 wrapErrorCallback 包裹错误函数回调
1 | js复制代码onErrorCallback = wrapErrorCallback(onErrorCallback) |
这段的代码,就是传递错误回调函数,wrapErrorCallback
返回给一个新的函数,wrapErrorCallback
执行时,再去执行 onErrorCallback(cb)。
我相信读者朋友能看懂,我单独拿出来讲述,主要是因为这种包裹函数的形式在很多源码里都很常见。
这里也就是文章开头终端错误图Could not open App.vue in the editor.
输出的代码位置。
1 | js复制代码// vue3-project/node_modules/launch-editor/index.js |
6.2 guessEditor 猜测当前正在使用的编辑器
这个函数主要做了如下四件事情:
- 如果具体指明了编辑器,则解析下返回。
- 找出当前进程中哪一个编辑器正在运行。
macOS
和Linux
用ps x
命令windows
则用Get-Process
命令 - 如果都没找到就用
process.env.VISUAL
或者process.env.EDITOR
。这就是为啥开头错误提示可以使用环境变量指定编辑器的原因。 - 最后还是没有找到就返回
[null]
,则会报错。
1 | js复制代码const [editor, ...args] = guessEditor(specifiedEditor) |
1 | js复制代码// vue3-project/node_modules/launch-editor/guess.js |
看完了 guessEditor 函数,我们接着来看 launch-editor
剩余部分。
6.3 launch-editor 剩余部分
以下这段代码不用细看,调试的时候细看就行。
1 | js复制代码// vue3-project/node_modules/launch-editor/index.js |
这一大段中,主要的就是以下代码,用子进程模块。简单来说子进程模块有着执行命令的能力。
1 | js复制代码const childProcess = require('child_process') |
行文至此,就基本接近尾声了。原理其实就是利用nodejs
中的child_process
,执行了类似code path/to/file
命令。
- 总结
这里总结一下:首先文章开头通过提出「短时间找不到页面对应源文件的场景」,并针对容易碰到的报错情况给出了解决方案。
其次,配置了环境跟着调试学习了vue-devtools
中使用的尤大写的 yyx990803/launch-editor。
7.1 一句话简述其原理
我们回顾下开头的原理内容。
1 | sh复制代码code path/to/file |
一句话简述原理:利用nodejs
中的child_process
,执行了类似code path/to/file
命令,于是对应编辑器就打开了相应的文件,而对应的编辑器则是通过在进程中执行ps x
(Window
则用Get-Process
)命令来查找的,当然也可以自己指定编辑器。
最后还能做什么呢。
可以再看看 umijs/launch-editor 和 react-dev-utils/launchEditor.js 。他们的代码几乎类似。
也可以利用Node.js
做一些提高开发效率等工作,同时可以学习child_process
等模块。
也不要禁锢自己的思维,把前端禁锢在页面中,应该把视野拓宽。
Node.js
是我们前端人探索操作文件、操作网络等的好工具。
如果读者朋友发现有不妥或可改善之处,再或者哪里没写明白的地方,欢迎评论指出。另外觉得写得不错,对您有些许帮助,可以点赞、评论、转发分享,也是对我的一种支持,万分感谢。如果能关注我的前端公众号:「若川视野」,就更好啦。
最后可以持续关注我@若川。欢迎加我微信 ruochuan12 交流,参与 源码共读 活动,大家一起学习源码,共同进步。
参考链接
vue-devtools open-in-editor.md
“Open in editor” button doesn’t work in Win 10 with VSCode if installation path contains spaces
react-dev-utils/launchEditor.js
关于 && 交流群
最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,长期交流学习。
作者:常以若川为名混迹于江湖。欢迎加我微信ruochuan12
。前端路上 | 所知甚少,唯善学。
关注公众号若川视野,每周一起学源码,学会看源码,进阶高级前端。
segmentfault
若川视野专栏,开通了若川视野专栏,欢迎关注~
掘金专栏,欢迎关注~
知乎若川视野专栏,开通了若川视野专栏,欢迎关注~
github blog,求个star
^_^~
本文转载自: 掘金