-
Notifications
You must be signed in to change notification settings - Fork 1
/
vueparser.js
114 lines (92 loc) · 2.28 KB
/
vueparser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const compiler = require('vue-template-compiler')
const parser = require('@babel/parser')
const traverse = require('@babel/traverse').default
const generator = require('@babel/generator').default
const t = require('@babel/types')
const core = require('@babel/core')
const template = require('@babel/template').default
const generate = require('@babel/generator').default
const source = `
<template>
<div class="home">
<div :title="中文">中文</div>
</div>
</template>
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
import eztalkApi from 'm/api/eztalk'
import config from 'm/config'
@Component({
mixins: [routeMixin],
watch: {
'readModal.visible': function (visible) {
if (!visible) {
this.readModal.current = -1
}
}
}
})
export default class Login extends Vue {
phone = '我是中文'
code = ''
get count () {
return this.countDown
}
create () {
console.log(1)
}
getVerifycode () {}
login () {}
}
</script>
<style lang="less" scoped>
.home {
background: red;
}
</style>
<style>
.test {font-size: 14px;}
</style>
`
let vuecontent = compiler.parseComponent(source)
// console.log('脚本script', vuecontent.script.content)
// console.log('脚本script.template', vuecontent.template)
// console.log('styles', vuecontent.styles)
let ast = parser.parse(vuecontent.script.content, {
sourceType: 'module',
plugins: [
'classProperties',
'methodDefinition',
'decorators-legacy'
]
})
console.log('上文', ast)
let dataArr = []
let methodsArr = []
// [t.objectProperty(t.identifier('phone'), t.stringLiteral(''))]
traverse(ast, {
ClassProperty (p) { // 属性获取
console.log(p.node)
dataArr.push(t.objectProperty(p.node.key, p.node.value))
},
ClassMethod (p) {
console.log('函数', p.node)
methodsArr.push(t.objectMethod(p.node.kind, p.node.key, p.node.params, p.node.body))
}
})
// let html = `${vuecontent.template.content}${vuecontent.script.content}${vuecontent.styles.content}`
let sourcecode = generator(ast).code
const buildRequire = template(`
export default {
data () {
return DATA
},
methods: METHODS
}
`)
const ast2 = buildRequire({
DATA: t.objectExpression(dataArr),
METHODS: t.objectExpression(methodsArr)
})
console.log(generate(ast2).code)