diff --git a/packages/webpack-uni-mp-loader/lib/babel/global-component-traverse.js b/packages/webpack-uni-mp-loader/lib/babel/global-component-traverse.js index aac2c5cf932d94a8448e87542c47f82cac0d04f1..c32ce42644f3410d25c4b8d69bc980ef6b99ede6 100644 --- a/packages/webpack-uni-mp-loader/lib/babel/global-component-traverse.js +++ b/packages/webpack-uni-mp-loader/lib/babel/global-component-traverse.js @@ -1,57 +1,69 @@ +const path = require('path') const t = require('@babel/types') const babelTraverse = require('@babel/traverse').default - -const { parseComponents } = require('./util') +const { + normalizePath +} = require('@dcloudio/uni-cli-shared') +const { + parseComponents +} = require('./util') const uniI18n = require('@dcloudio/uni-cli-i18n') module.exports = function (ast, state = {}) { const imports = [] let nodePath = false - babelTraverse(ast, { - CallExpression (path) { - const callee = path.node.callee - if (!callee.object || !callee.property) { - return - } - const objectName = callee.object.name - const propertyName = callee.property.name - if ( - propertyName === 'component' && - (objectName === 'Vue' || objectName === 'app') - ) { - const args = path.node.arguments - const nameNode = args[0] - const valueNode = args[1] - nodePath = path - if (!t.isStringLiteral(nameNode)) { - throw new Error( - uniI18n.__('mpLoader.firstParameterNeedStaticString', { - 0: objectName + '.component()' - }) - ) + try { + babelTraverse(ast, { + CallExpression (path) { + const callee = path.node.callee + if (!callee.object || !callee.property) { + return } - if (!t.isIdentifier(valueNode)) { - throw new Error( - uniI18n.__('mpLoader.requireTwoParameter', { - 0: objectName + '.component()' - }) - ) + const objectName = callee.object.name + const propertyName = callee.property.name + if ( + propertyName === 'component' && + (objectName === 'Vue' || objectName === 'app') + ) { + const args = path.node.arguments + const nameNode = args[0] + const valueNode = args[1] + nodePath = path + if (!t.isStringLiteral(nameNode)) { + throw new Error( + uniI18n.__('mpLoader.firstParameterNeedStaticString', { + 0: objectName + '.component()' + }) + ) + } + if (!t.isIdentifier(valueNode)) { + throw new Error( + uniI18n.__('mpLoader.requireTwoParameter', { + 0: objectName + '.component()' + }) + ) + } + imports.push({ + name: nameNode.value, + value: valueNode.name + }) } - imports.push({ - name: nameNode.value, - value: valueNode.name - }) } + }) + if (imports.length) { + state.components = parseComponents(imports, nodePath) + } else { + state.components = [] + } + } catch (e) { + if (state.filename) { + console.error('at ' + normalizePath(path.relative(process.env.UNI_INPUT_DIR, state.filename)) + ':1') } - }) - if (imports.length) { - state.components = parseComponents(imports, nodePath) - } else { - state.components = [] + throw e } return { ast, state } -} +} diff --git a/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js b/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js index 5ec6b13ecfe63b6c0942b3a25d32d8d5cadae595..f102ce2e27b65fce6544daf967e9fcceb2802db9 100644 --- a/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js +++ b/packages/webpack-uni-mp-loader/lib/babel/scoped-component-traverse.js @@ -1,6 +1,9 @@ +const path = require('path') const t = require('@babel/types') const babelTraverse = require('@babel/traverse').default - +const { + normalizePath +} = require('@dcloudio/uni-cli-shared') const { parseComponents } = require('./util') @@ -107,77 +110,85 @@ module.exports = function (ast, state = { components: [], options: {} }) { - babelTraverse(ast, { - CallExpression (path) { - const callee = path.node.callee - const args = path.node.arguments - const objExpr = args[0] - if ( - t.isIdentifier(callee) && - callee.name === 'defineComponent' && - args.length === 1 && - t.isObjectExpression(objExpr) - ) { - handleObjectExpression(objExpr, path, state) - } - }, - AssignmentExpression (path) { - const leftExpression = path.node.left - const rightExpression = path.node.right + try { + babelTraverse(ast, { + CallExpression (path) { + const callee = path.node.callee + const args = path.node.arguments + const objExpr = args[0] + if ( + t.isIdentifier(callee) && + callee.name === 'defineComponent' && + args.length === 1 && + t.isObjectExpression(objExpr) + ) { + handleObjectExpression(objExpr, path, state) + } + }, + AssignmentExpression (path) { + const leftExpression = path.node.left + const rightExpression = path.node.right - if ( // global['__wxVueOptions'] = {'van-button':VanButton} - t.isMemberExpression(leftExpression) && - t.isObjectExpression(rightExpression) && - leftExpression.object.name === 'global' && - leftExpression.property.value === '__wxVueOptions' - ) { - handleObjectExpression(rightExpression, path, state) - } + if ( // global['__wxVueOptions'] = {'van-button':VanButton} + t.isMemberExpression(leftExpression) && + t.isObjectExpression(rightExpression) && + leftExpression.object.name === 'global' && + leftExpression.property.value === '__wxVueOptions' + ) { + handleObjectExpression(rightExpression, path, state) + } - if ( // exports.default.components = Object.assign({'van-button': VanButton}, exports.default.components || {}) - t.isMemberExpression(leftExpression) && - t.isCallExpression(rightExpression) && - leftExpression.property.name === 'components' && - t.isMemberExpression(leftExpression.object) && - leftExpression.object.object.name === 'exports' && - leftExpression.object.property.name === 'default' && - rightExpression.arguments.length === 2 && - t.isObjectExpression(rightExpression.arguments[0]) - ) { - handleComponentsObjectExpression(rightExpression.arguments[0], path, state, true) - } - }, - ExportDefaultDeclaration (path) { - const declaration = path.node.declaration - if (t.isObjectExpression(declaration)) { // export default {components:{}} - handleObjectExpression(declaration, path, state) - } else if (t.isIdentifier(declaration)) { - handleIdentifier(declaration, path, state) - } else if (t.isCallExpression(declaration) && - t.isMemberExpression(declaration.callee) && - declaration.arguments.length === 1) { // export default Vue.extend({components:{}}) - if (declaration.callee.object.name === 'Vue' && declaration.callee.property.name === - 'extend') { - const argument = declaration.arguments[0] - if (t.isObjectExpression(argument)) { - handleObjectExpression(argument, path, state) - } else if (t.isIdentifier(argument)) { - handleIdentifier(argument, path, state) - } + if ( // exports.default.components = Object.assign({'van-button': VanButton}, exports.default.components || {}) + t.isMemberExpression(leftExpression) && + t.isCallExpression(rightExpression) && + leftExpression.property.name === 'components' && + t.isMemberExpression(leftExpression.object) && + leftExpression.object.object.name === 'exports' && + leftExpression.object.property.name === 'default' && + rightExpression.arguments.length === 2 && + t.isObjectExpression(rightExpression.arguments[0]) + ) { + handleComponentsObjectExpression(rightExpression.arguments[0], path, state, true) } - } else if (t.isClassDeclaration(declaration) && - declaration.decorators && - declaration.decorators.length) { // export default @Component({components:{}}) class MyComponent extend Vue - const componentDecorator = declaration.decorators[0] - if (t.isCallExpression(componentDecorator.expression)) { - const args = componentDecorator.expression.arguments - if (args && args.length && t.isObjectExpression(args[0])) { - handleObjectExpression(args[0], path, state) + }, + ExportDefaultDeclaration (path) { + const declaration = path.node.declaration + if (t.isObjectExpression(declaration)) { // export default {components:{}} + handleObjectExpression(declaration, path, state) + } else if (t.isIdentifier(declaration)) { + handleIdentifier(declaration, path, state) + } else if (t.isCallExpression(declaration) && + t.isMemberExpression(declaration.callee) && + declaration.arguments.length === 1) { // export default Vue.extend({components:{}}) + if (declaration.callee.object.name === 'Vue' && declaration.callee.property.name === + 'extend') { + const argument = declaration.arguments[0] + if (t.isObjectExpression(argument)) { + handleObjectExpression(argument, path, state) + } else if (t.isIdentifier(argument)) { + handleIdentifier(argument, path, state) + } + } + } else if (t.isClassDeclaration(declaration) && + declaration.decorators && + declaration.decorators.length + ) { // export default @Component({components:{}}) class MyComponent extend Vue + const componentDecorator = declaration.decorators[0] + if (t.isCallExpression(componentDecorator.expression)) { + const args = componentDecorator.expression.arguments + if (args && args.length && t.isObjectExpression(args[0])) { + handleObjectExpression(args[0], path, state) + } } } } + }) + } catch (e) { + if (state.filename) { + console.error('at ' + normalizePath(path.relative(process.env.UNI_INPUT_DIR, state.filename)) + ':1') } - }) + throw e + } return { ast, state diff --git a/packages/webpack-uni-mp-loader/lib/main-new.js b/packages/webpack-uni-mp-loader/lib/main-new.js index 08b5675312701d9f2e423fee91e8f20593fc395e..db7088e2d1b5cf083dc151fc3ce0c8e5372a3e1a 100644 --- a/packages/webpack-uni-mp-loader/lib/main-new.js +++ b/packages/webpack-uni-mp-loader/lib/main-new.js @@ -92,12 +92,15 @@ createPage(Page) components } } = traverse(parser.parse(content, getBabelParserOptions()), { + filename: this.resourcePath, components: [] }) const babelLoader = findBabelLoader(this.loaders) if (!babelLoader) { - throw new Error(uniI18n.__('mpLoader.findFail', { 0: 'babel-loader' })) + throw new Error(uniI18n.__('mpLoader.findFail', { + 0: 'babel-loader' + })) } else { addCreateApp(babelLoader) } @@ -144,4 +147,4 @@ createPage(Page) callback(err, content, map) }) } -} +} diff --git a/packages/webpack-uni-mp-loader/lib/script-new.js b/packages/webpack-uni-mp-loader/lib/script-new.js index adfe749551f7c6816cffacafa80558e767015db3..f8fbbd104d10fd475e8f7f9f604d4138e9ac2bc2 100644 --- a/packages/webpack-uni-mp-loader/lib/script-new.js +++ b/packages/webpack-uni-mp-loader/lib/script-new.js @@ -83,7 +83,8 @@ module.exports = function (content, map) { } } = traverse(parser.parse(content, getBabelParserOptions()), { type, - components: [] + components: [], + filename: this.resourcePath }) const callback = this.async() @@ -126,7 +127,9 @@ module.exports = function (content, map) { const babelLoader = findBabelLoader(this.loaders) if (!babelLoader) { - callback(new Error(uniI18n.__('mpLoader.findFail', { 0: 'babel-loader' })), content) + callback(new Error(uniI18n.__('mpLoader.findFail', { + 0: 'babel-loader' + })), content) } else { addDynamicImport(babelLoader, resourcePath, dynamicImports) @@ -136,4 +139,4 @@ module.exports = function (content, map) { }, err => { callback(err, content, map) }) -} +}