如何仅针对部分文件启用Tern插件与类型定义?
问题
我搭建了一个包含静态HTML与原生JavaScript的Web项目,用Jest做单元测试,同时用Emacs搭配Tern实现代码补全。现在需要根据路径规则区分配置:
- 仅在匹配
.*.test.js的Jest测试文件中激活node插件,以获取process、__dirname等Node.js环境变量的补全 - 仅在非测试文件(不匹配
.*.test.js)中应用browser类型定义,以获得DOM API(比如Document接口)的补全
当前的.tern-project配置如下:
{ "libs": [ "ecmascript", "browser" ], "plugins": { "es_modules": {}, "node": {} } }
请问该如何实现这种条件化配置?有没有更优的解决方案?
实现方案:利用Tern的conditional配置
Tern原生支持通过conditional字段结合路径匹配,实现不同场景下的库和插件加载,具体配置修改如下:
1. 更新.tern-project配置
替换原有内容为以下代码,通过正则匹配文件名实现条件加载:
{ "libs": [ "ecmascript" ], "plugins": { "es_modules": {} }, "conditional": [ { "condition": "filename.match(/\\.test\\.js$/)", "plugins": { "node": {} } }, { "condition": "!filename.match(/\\.test\\.js$/)", "libs": [ "browser" ] } ] }
配置说明
- 全局默认只加载基础的
ecmascript库,避免Node.js与Browser环境的类型冲突 conditional数组中的每个对象通过condition字段指定判断逻辑:- 第一条规则:当文件名匹配
.*.test.js后缀时,自动激活node插件 - 第二条规则:当文件名不属于测试文件时,加载
browser类型库以支持DOM API补全
- 第一条规则:当文件名匹配
condition字段支持简单JavaScript表达式,filename变量代表当前处理的文件路径
更优方案:拆分配置文件+Emacs自动切换
如果项目结构清晰,拆分配置文件的方式会更直观易维护,尤其适合后续扩展更多场景配置:
- 新建测试文件专用配置
.tern-project-test:
{ "libs": [ "ecmascript" ], "plugins": { "es_modules": {}, "node": {} } }
- 保留原
.tern-project作为非测试文件专用配置:
{ "libs": [ "ecmascript", "browser" ], "plugins": { "es_modules": {} } }
- 在Emacs配置中添加自动切换逻辑:
(add-hook 'js-mode-hook (lambda () (if (string-match-p "\\.test\\.js$" (buffer-file-name)) (setq tern-project-file ".tern-project-test") (setq tern-project-file ".tern-project"))))
这种方式通过Emacs层面的判断直接加载对应配置,比Tern的conditional规则更易调试和修改。
内容的提问来源于stack exchange,提问作者Amessihel
相关产品推荐
相关产品推荐

