TypeScript + React 我用下来感觉没啥问题。
我自己本职就是前端开发,工作用的也是 React ,最早不会 TypeScript ,就用自带的 jsx-mode 。
后面会 TypeScript 了后,就开始研究各种 tsx 解决方案,用过 web-mode ,但感觉总有各种小问题,尤其是 web-mode 里面插件开多了好像还有性能问题。太久了,具体问题现在已经不记得了。
下面分享一下我的解决方案吧,可以作为一个前端开发的参考。
现在我稳定在 major-mode 用 tsx-ts-mode
,相关插件就 emmet
、 eglot
和 flymake
。
要是内置的 tsx-ts-mode
没法用就用 typescript-mode
+ elisp-tree-sitter
+ tree-sitter-langs
+ tsi
这几个组合,自己定义一个 tsx 的 major-mode
(define-derived-mode typescript-tsx-mode typescript-mode "Tsx"
"Major mode for editing TSX file."
(require 'tree-sitter)
(require 'tree-sitter-hl)
(require 'tree-sitter-langs)
(require 'tree-sitter-debug)
(require 'tree-sitter-query)
(require 'tsi-typescript)
(tsi-typescript-mode))
但是 eslint
现有的都多多少少有点问题, 而且项目大了后还有点慢,因为每次检查都得重新运行 eslint 命令行,公司里面大点的项目都是秒级的耗时,后面自己用 jsonrpc
封装了一个 eslint 检查的后端,用 node 的 worker 让 eslint 常驻,现在 eslint 响应在毫秒级别,基本不会超过 100ms,只有第一次因为需要初始化 eslint 配置,耗时和命令行检查差不多,但后续就能快到飞起了。
需要注意的就是我开发都是在 gentoo 系统下,装 tree-sitter 相关的软件啥的都很方便,公司的电脑我也装成 gentoo 系统了。
话说是不是用 flutter 的人还是不太多?我咋感觉都是用 React 的?
kholin
43
tree-sitter 还主要是客户端语法解析和高亮层面,缺少 lsp 能提供的补全、语法报错等更全面的支持,我都折腾过,最后发现 tree-sitter 作用不大,就禁用了。
正好昨晚我借助claude code分析扩展源码折腾出来一个配置,目前算是能够正常运行了,主要方案是 lsp-mode + tsserver + web-mode + flycheck + eslint, 等有时间写个更详细的分享。
目前这里面最耗费时间的是 flycheck + eslint ,因为我不希望 eslint 走 lsp ,而 flycheck 跟 lsp 的集成度还挺高的感觉,所以要把 eslint 剥离 lsp 这个步骤尝试了很多次,最后工夫不负有心人,还是成功解决了。
1 个赞
flutter 主要受众还是移动端吧。React 多是因为 Web 开发者多,而现在 web 开发者在国内主要技术栈就 React 和 Vue 两个。
1 个赞
这么看来我们的选择思路其实差不多,只是我的 lsp client 用的是 eglot
,major-mode 用的是内置的 tsx-ts-node
这种自带的 package 而已。
我会自己写 flymake 的 eslint 后端就是基于你上面说的这个原因。而且我这个后端其实是剥离了 eslint 后端和 flymake 的耦合的,要集成到 flycheck 也很简单。只是我自己现在不用 flycheck 了所以没写 flycheck 的支持。
你可以参考一下我写的这个后端,检查代码很快。而且修改了 eslint 配置后会自动更新 worker 里面的 eslint 运行实例,不用手动重启。
对,我也是这个思路。lint什么的可以直接用flymake,补全用lsp,简单方便。
kholin
47
eglot
不支持多个 lsp 服务同时运行吧,就是因为这个原因,我选择了 lsp-mode
,而 lsp-mode
又只兼容 flycheck ,连锁反应,导致最后我不得不手动解决 flycheck 和 eslint 的配置问题。不然我可能优先考虑 flymake 直接调用 eslint 的方案,相关的资料也更多一些。
另外,你这个插件为什么感觉像是重新实现了一遍 eslint-lsp ,在 lsp-mode
里面这个模块是内置的 。我最早的配置就是用这个方案,默认情况下 lsp-mode
自动启用 eslint-lsp 并通过 flycheck 返回报错。这套方案最主要的瓶颈在于客户端和服务端通信时的 json 序列化和反序列化,以及 emacs 本身的通信阻塞问题。一旦文件稍微大一点,保存一下文件要停顿2-3秒,挺夸张的,这就是为什么我宁愿让 flycheck 直接调用 eslint 命令,而不是走服务端。虽说每次都要重启进程,但暂时来看比我之前的配置性能好多了。
1 个赞
我知道有 eslint-lsp 这个东西,但是我不想啥都往 lsp 里面放,所以没用。
另外我最早也是用 lsp-mode
的,但是由于之前用的时候感觉性能不是很好,然后就换成 eglot
了。我记得 lsp-mode
后面支持了 flymake
了吧。
不过 eglot
不支持多个 lsp server 确实是一个问题。但好在我写 React 的时候只开 typescript
的补全就够了。要是想同时用 tailwindcss 那就没法补全了。
我写自己项目的时候也试过 lsp-bridge
但 tailwindcss
和 typescript
的补全同时开还是有问题。另外一个就是习惯了 eglot
和 flymake
这些内置的 package ,lsp-bridge
用着还是不习惯,所以到现在也没切换过去。
是的,lsp 只管补全和跳转。lint 放在 flymake 这种专用的里面。让各个功能相互隔离,这样能降低复杂度。不然 lsp 就会太重了。
我不用 lsp-mode 另一个原因就是 lsp-mode 里面的功能太多了,很多我用不上。
是的,我的Centaur Emacs提供eglot和lsp-mode 两种选择,默认也是用eglot。lsp-mode比较重,功能更丰富,需要特别定制下才能让功能和性能达到平衡,弄不好还会卡住Emacs。eglot内置,更轻量,和flymake集成更好,日常使用没问题。
2 个赞
shynur
51
已经有人建议你自己动手配置了. Doom 适合有能力去看 Doom 源码的人, 或者完全不打算自己定制的人去用
嗯嗯, 是的, 所以打算开始使用 Centaur.
是的, 今天使用了一下 Centrua, 这个配置的思路其实更科学, 但我发现我看起来很费劲, 更别说改了… 这让我就突然发现, 我一直了解的不是 Emacs, 而是 Doom Emacs… 而且我的 Emcas 配置基本上没办法很方便的移植到 Centrua 上, 因为我用的很多变量全是 Doom 的私有变量, 原生的 Emacs 根本没有这玩意儿:sweat_smile:… tnnd, 真痛苦… 我感觉之后空了, 我要推到重来了 
yibie
56
你能不能简单的去找一下手册看看。别再这里唠叨一些低级问题?
1 个赞
嗯呢, 您说的有道理. 我就只是给您说下我想法, 不好意思哈
yibie
58
第一,你眼高手低,完全不进行任何基础的了解,就要求定制。
第二,诸如不知道基本快捷键这种常识性的问题,我建议你直接问问 AI,哪怕是跑在本地的 Gemma3:4b 都可以给你很优秀的答案。
第三,不要过度消耗别人的注意力与耐心。这是一个非常忙碌的世界。请你的表达,以及你的问题,足够清晰有效。
第四,论坛是一个公共场合,注意言行。
1 个赞
- 您说的是对的, 但是这里有个误会, 老哥, 就是我不是没有进行任何基础的了解和要求定制, 眼高手低确实是有的.
- 嗯嗯, 这个是的, 也在问 AI 的.
- 我以为是闲聊灌水的主题就是可以真的像闲聊一样… 因为您一直在帮助我, 所以您的回答对我十分重要, 在您给我推荐了 Centrua 之后, 我的回答是空了我会了解, 然后我今天空了, 了解了, 所以给您一个反馈, 这个是我认知下的礼貌. 但是我对于这个行为的认知和定义与您对于这个行为的认知和定义不同, 而产生了误会.
- 所以我贴的是闲聊灌水的类别呀. 老哥. 不然我直接就问问题, 然后快速撤退了呀.
所以总结下就是
- 我认为的礼貌, 给您添加了负担
- 我以为闲聊灌水真的就是闲聊灌水
所以十分抱歉我的自以为是
老哥, 其实就像您说的一样, 这个世界很忙碌, 我不想也不能也无权继续占用您的时间. 早点休息, 晚安, 老哥.
yibie
60
闲聊灌水,不代表别人有时间理解你的类似呓语一样的表达。
不要增加别人的负担,这是基础的礼貌。
闲聊的意思是,可以聊和 Emacs 无关的话题。
嗯嗯, 因为这个是我逛的唯一一个论坛, 此前没有任何逛论坛的经验, 对于这方面的认知真的很差劲, 谢谢老哥的澄清.
那么我转换一下您的表达意思就是: 希望我的表达更加的结构化和书面化, 就类似现在这样的表达方式
关于礼貌的定义这一点我是十分赞同的, 这一点产生的原因是我不了解上下文, 这个是论坛而非微信群组之类的, 所以我现在明白了我自以为是的礼貌其实是在给您增加负担.
1 个赞
emui8
62
楼主态度很诚恳,相信不会再有这样的行为了
希望多看自带的手册,会补全你的很多常用概念,为进一步折腾打下基础,祝你在折腾emacs的路上一发不可收拾
1 个赞