Skip to content

Commit ef53204

Browse files
authored
Merge pull request mpvue#8 from WingGao/develop
1. 增加script标签的src支持 2.增加script对ts支持 `lang=ts`这种方式
2 parents ba353d0 + 1623977 commit ef53204

File tree

2 files changed

+101
-1
lines changed

2 files changed

+101
-1
lines changed

lib/mp-compiler/index.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
const compiler = require('mpvue-template-compiler')
33

44
const babel = require('babel-core')
5+
const path = require('path')
6+
const fs = require('fs')
7+
58
const { parseConfig, parseComponentsDeps } = require('./parse')
9+
const { parseComponentsDeps: parseComponentsDepsTs } = require('./parse-ts')
610
const { genScript, genStyle, genPageWxml } = require('./templates')
711

812
const {
@@ -93,7 +97,19 @@ function compileWxml (compiled, html) {
9397
// 处理出当前单文件组件的子组件依赖
9498
function compileMPScript (script, mpOptioins, moduleId) {
9599
const babelrc = getBabelrc(mpOptioins.globalBabelrc)
96-
const { metadata } = babel.transform(script.content, { extends: babelrc, plugins: [parseComponentsDeps] })
100+
let result, metadata
101+
let scriptContent = script.content
102+
const babelOptions = { extends: babelrc, plugins: [parseComponentsDeps] }
103+
if (script.src) { // 处理src
104+
const scriptpath = path.join(path.dirname(this.resourcePath), script.src)
105+
scriptContent = fs.readFileSync(scriptpath).toString()
106+
}
107+
if (script.lang === 'ts') { // 处理ts
108+
metadata = parseComponentsDepsTs(scriptContent)
109+
} else {
110+
result = babel.transform(scriptContent, babelOptions)
111+
metadata = result.metadata
112+
}
97113

98114
// metadata: importsMap, components
99115
const { importsMap, components: originComponents } = metadata

lib/mp-compiler/parse-ts.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
let ts
2+
try {
3+
ts = require('typescript')
4+
} catch (e) {
5+
6+
}
7+
8+
function parseComponentsDeps (scriptContent) {
9+
const sourceFile = ts.createSourceFile('test', scriptContent, ts.ScriptTarget.ESNext, /* setParentNodes */ true)
10+
return delint(sourceFile)
11+
}
12+
13+
function delint (sourceFile) {
14+
const compNames = {}
15+
const importsMap = {}
16+
17+
delintNode(sourceFile)
18+
19+
function parseDecorator (node) {
20+
// 只处理 @Component({components:{aaa}})
21+
if (node.expression.expression && node.expression.expression.escapedText === 'Component') {
22+
const compArgs = node.expression.arguments
23+
if (compArgs && compArgs.length === 1) {
24+
const vueClassArg = compArgs[0]
25+
if (vueClassArg.properties) {
26+
vueClassArg.properties.forEach((classProp) => {
27+
// 处理components属性
28+
if (classProp.name.escapedText === 'components') {
29+
classProp.initializer.properties.forEach((comp) => {
30+
let compName
31+
switch (comp.kind) {
32+
case ts.SyntaxKind.ShorthandPropertyAssignment: // {Comp}
33+
compName = comp.name.escapedText
34+
// report(comp, '1')
35+
break
36+
case ts.SyntaxKind.PropertyAssignment: // {a:Comp}
37+
compName = comp.initializer.escapedText
38+
// report(comp, '2')
39+
break
40+
}
41+
compNames[compName] = true
42+
})
43+
}
44+
})
45+
}
46+
}
47+
}
48+
}
49+
50+
function delintNode (node) {
51+
switch (node.kind) {
52+
case ts.SyntaxKind.ImportDeclaration:
53+
// 只处理 import Comp from 'xxx.vue'
54+
if (node.importClause.name) {
55+
importsMap[node.importClause.name.escapedText] = node.moduleSpecifier.text
56+
}
57+
// report(node, 'import')
58+
break
59+
case ts.SyntaxKind.Decorator:
60+
parseDecorator(node)
61+
break
62+
}
63+
64+
ts.forEachChild(node, delintNode)
65+
}
66+
67+
function report(node, message) { // eslint-disable-line
68+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart())
69+
console.log(`${sourceFile.fileName} (${line + 1},${character + 1}): ${message}`)
70+
}
71+
72+
const components = {}
73+
for (const k in compNames) {
74+
if (importsMap.hasOwnProperty(k)) {
75+
components[k] = importsMap[k]
76+
}
77+
}
78+
return {
79+
importsMap,
80+
components
81+
}
82+
}
83+
84+
module.exports = { parseComponentsDeps }

0 commit comments

Comments
 (0)