createTransformContext 创建转换器上下文
这部分主要就是通过一个对象,内部去维护了一些数据,用于在之后的过程中进行转换,整体并没什么太多内容。
export function createTransformContext(
root: RootNode,
{
filename = '',
prefixIdentifiers = false,
hoistStatic = false,
cacheHandlers = false,
nodeTransforms = [],
directiveTransforms = {},
transformHoist = null,
isBuiltInComponent = NOOP,
isCustomElement = NOOP,
expressionPlugins = [],
scopeId = null,
slotted = true,
ssr = false,
ssrCssVars = ``,
bindingMetadata = EMPTY_OBJ,
inline = false,
isTS = false,
onError = defaultOnError,
onWarn = defaultOnWarn,
compatConfig
}: TransformOptions
): TransformContext {
// 匹配文件名,应该是用于.vue文件
const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/)
const context: TransformContext = {
// options
selfName: nameMatch && capitalize(camelize(nameMatch[1])),
prefixIdentifiers,
hoistStatic,
cacheHandlers,
nodeTransforms, // 内置一些需要转换的方法
/**
* bind、cloak、html、model、on、show、text
*/
directiveTransforms, // 内置一些需要转换的一个指令
transformHoist,
isBuiltInComponent, // 是否内置组件
isCustomElement, // 是否自定义元素
expressionPlugins,
scopeId,
slotted,
ssr, // 是否ssr
ssrCssVars,
bindingMetadata,
inline,
isTS, // 是否ts
onError,
onWarn,
compatConfig, // V2的兼容配置
// state
root, // AST的一个根节点
/**
* 转换的过程,用于维护的一个帮助函数,用于后面生成render funciton
*
* Symbol(toDisplayString)
* Symbol(createVNode)
* Symbol(vModelText)
* Symbol(withDirectives)
* Symbol(resolveComponent)
* Symbol(renderList)
* Symbol(Fragment)
* Symbol(openBlock)
* Symbol(createBlock)
* Symbol(Suspense)
* Symbol(withCtx)
* Symbol(Teleport)
*/
helpers: new Map(),
components: new Set(), // 转换过程,组件内注册的组件
directives: new Set(), // 转换过程,组件内注册的指令
hoists: [],
imports: [],
constantCache: new Map(),
temps: 0,
cached: 0,
identifiers: Object.create(null),
scopes: {
vFor: 0,
vSlot: 0,
vPre: 0,
vOnce: 0
},
parent: null, // 父级AST节点
currentNode: root, // 当前转换过程的AST节点
childIndex: 0, // 当前转换过程的Index
// methods
helper(name) {
const count = context.helpers.get(name) || 0
context.helpers.set(name, count + 1)
return name
}
}
//...
return context
}