jscodeshift
+ codemods
就是项目重构/升级的超级利器,以前在react
和纯js
项目深刻体会到自动化发挥到巨大作用。
最近在工作中尝试用处理vue
代码,结果却不尽如人意。
- 无法只使用
jscodeshift
完成 - 需要区分
vue
后缀和js
后缀 template
代码无法输出
解析适配vue
代码
vue
文件包含三块内容:template
、script
、style
。
我首先采用的方案是:@vue/compiler-dom
获取 template
,vue-template-compiler
获取script
。
script
的内容不需要特殊处理,提取出代码后交由jscodeshift
即可。
const compiler = require('vue-template-compiler');
const sfcDescriptor = compiler.parseComponent(fileInfo.source);
// sfcDescriptor.script 就是对应的script代码块
console.log(sfcDescriptor.script)
sfcDescriptor
里面还包含了template
的内容,所以我们不需要单独获取模板内容,可以这样:
const domCompiler = require('@vue/compiler-dom');
const templateAST = domCompiler.compile(sfcDescriptor.template.content)
这种方式最大的问题在于处理AST
麻烦,如何输出源码也是很大的问题,我目前没有找到可以直接使用的工具,如果想打通整个流程,可能需要写一个generate
插件读取AST
结构,再输出源码。
让jscodeshift
支持vue
文件
function vueAdapterWrapper(transform) {
return function wrappedTransform(fileInfo, api, options) {
// 如果不是vue文件,则使用jscodeshift默认处理
if (!fileInfo.path.endsWith('.vue')) {
return transform(fileInfo, api, options);
}
// 否则按照vue文件处理
// 1. template
// 2. script
}
}
module.exports = function vueAdapter(transform) {
return vueAdapterWrapper(transform);
}
使用时通过下面方式:
const someCodemod = require('some-codemod');
module.exports = vueAdapter(someCodemod);
结果
使用jscodeshift
处理script
代码,目前看是没有问题的,麻烦在于template
的处理,我另外想到的是可以直接用babel
或者基于ast
的工具(如PostHTML
),这样只要能解决语法解析的问题,就什么都不是问题了。
版权声明:本文为原创文章,版权归 neo 所有。
本文链接:https://idayer.com/use-jscodeshift-to-transform-code-for-vue/
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
0 条评论