From 47f2bba0a89e08b04c7c50c7c4a6115a883a40e6 Mon Sep 17 00:00:00 2001 From: Wing Gao Date: Fri, 23 Mar 2018 23:19:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0script=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=9A=84src=E6=94=AF=E6=8C=81=20https://github.com/Me?= =?UTF-8?q?ituan-Dianping/mpvue/issues/165=202.=20=E5=A2=9E=E5=8A=A0script?= =?UTF-8?q?=E5=AF=B9ts=E6=94=AF=E6=8C=81=20`lang=3Dts`=E8=BF=99=E7=A7=8D?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mp-compiler/index.js | 18 +++++++- lib/mp-compiler/parse-ts.js | 84 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 lib/mp-compiler/parse-ts.js diff --git a/lib/mp-compiler/index.js b/lib/mp-compiler/index.js index 1ca8536..9931079 100644 --- a/lib/mp-compiler/index.js +++ b/lib/mp-compiler/index.js @@ -2,7 +2,11 @@ const compiler = require('mpvue-template-compiler') const babel = require('babel-core') +const path = require('path') +const fs = require('fs') + const { parseConfig, parseComponentsDeps } = require('./parse') +const { parseComponentsDeps: parseComponentsDepsTs } = require('./parse-ts') const { genScript, genStyle, genPageWxml } = require('./templates') const { @@ -93,7 +97,19 @@ function compileWxml (compiled, html) { // 处理出当前单文件组件的子组件依赖 function compileMPScript (script, mpOptioins, moduleId) { const babelrc = getBabelrc(mpOptioins.globalBabelrc) - const { metadata } = babel.transform(script.content, { extends: babelrc, plugins: [parseComponentsDeps] }) + let result, metadata + let scriptContent = script.content + const babelOptions = { extends: babelrc, plugins: [parseComponentsDeps] } + if (script.src) { // 处理src + const scriptpath = path.join(path.dirname(this.resourcePath), script.src) + scriptContent = fs.readFileSync(scriptpath).toString() + } + if (script.lang === 'ts') { // 处理ts + metadata = parseComponentsDepsTs(scriptContent) + } else { + result = babel.transform(scriptContent, babelOptions) + metadata = result.metadata + } // metadata: importsMap, components const { importsMap, components: originComponents } = metadata diff --git a/lib/mp-compiler/parse-ts.js b/lib/mp-compiler/parse-ts.js new file mode 100644 index 0000000..c93db2c --- /dev/null +++ b/lib/mp-compiler/parse-ts.js @@ -0,0 +1,84 @@ +let ts +try { + ts = require('typescript') +} catch (e) { + +} + +function parseComponentsDeps (scriptContent) { + const sourceFile = ts.createSourceFile('test', scriptContent, ts.ScriptTarget.ESNext, /* setParentNodes */ true) + return delint(sourceFile) +} + +function delint (sourceFile) { + const compNames = {} + const importsMap = {} + + delintNode(sourceFile) + + function parseDecorator (node) { + // 只处理 @Component({components:{aaa}}) + if (node.expression.expression.escapedText === 'Component') { + const compArgs = node.expression.arguments + if (compArgs && compArgs.length === 1) { + const vueClassArg = compArgs[0] + if (vueClassArg.properties) { + vueClassArg.properties.forEach((classProp) => { + // 处理components属性 + if (classProp.name.escapedText === 'components') { + classProp.initializer.properties.forEach((comp) => { + let compName + switch (comp.kind) { + case ts.SyntaxKind.ShorthandPropertyAssignment: // {Comp} + compName = comp.name.escapedText + // report(comp, '1') + break + case ts.SyntaxKind.PropertyAssignment: // {a:Comp} + compName = comp.initializer.escapedText + // report(comp, '2') + break + } + compNames[compName] = true + }) + } + }) + } + } + } + } + + function delintNode (node) { + switch (node.kind) { + case ts.SyntaxKind.ImportDeclaration: + // 只处理 import Comp from 'xxx.vue' + if (node.importClause.name) { + importsMap[node.importClause.name.escapedText] = node.moduleSpecifier.text + } + // report(node, 'import') + break + case ts.SyntaxKind.Decorator: + parseDecorator(node) + break + } + + ts.forEachChild(node, delintNode) + } + + function report(node, message) { // eslint-disable-line + const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart()) + console.log(`${sourceFile.fileName} (${line + 1},${character + 1}): ${message}`) + } + + const components = {} + for (const k in compNames) { + if (importsMap.hasOwnProperty(k)) { + components[k] = importsMap[k] + } + } + return { + importsMap, + components + } +} + +module.exports = { parseComponentsDeps } From 1d3e261d72e581697963009a696fff1a16d52b38 Mon Sep 17 00:00:00 2001 From: Wing Gao Date: Fri, 23 Mar 2018 23:37:12 +0800 Subject: [PATCH 2/4] fix --- lib/mp-compiler/parse-ts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mp-compiler/parse-ts.js b/lib/mp-compiler/parse-ts.js index c93db2c..55ab49c 100644 --- a/lib/mp-compiler/parse-ts.js +++ b/lib/mp-compiler/parse-ts.js @@ -18,7 +18,7 @@ function delint (sourceFile) { function parseDecorator (node) { // 只处理 @Component({components:{aaa}}) - if (node.expression.expression.escapedText === 'Component') { + if (node.expression.escapedText === 'Component') { const compArgs = node.expression.arguments if (compArgs && compArgs.length === 1) { const vueClassArg = compArgs[0] From 03687fafe0499f7a0a42e8c15bd288b17d012d45 Mon Sep 17 00:00:00 2001 From: Wing Gao Date: Fri, 23 Mar 2018 23:43:31 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=A9=BA=E8=A3=85?= =?UTF-8?q?=E9=A5=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mp-compiler/parse-ts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mp-compiler/parse-ts.js b/lib/mp-compiler/parse-ts.js index 55ab49c..5792a1f 100644 --- a/lib/mp-compiler/parse-ts.js +++ b/lib/mp-compiler/parse-ts.js @@ -18,7 +18,7 @@ function delint (sourceFile) { function parseDecorator (node) { // 只处理 @Component({components:{aaa}}) - if (node.expression.escapedText === 'Component') { + if (node.expression.expression && node.expression.expression.escapedText === 'Component') { const compArgs = node.expression.arguments if (compArgs && compArgs.length === 1) { const vueClassArg = compArgs[0] From 02f17b9cfaf1ed2ad6d9eecf5072a59001344901 Mon Sep 17 00:00:00 2001 From: anchengjian Date: Fri, 30 Mar 2018 20:53:28 +0800 Subject: [PATCH 4/4] new version 1.0.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68741d9..2851c72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mpvue-loader", - "version": "1.0.9", + "version": "1.0.10", "description": "mpvue single-file component loader for Webpack", "main": "index.js", "repository": {