const path = require('path') const babel = require('@babel/core') const loaderUtils = require('loader-utils') const { hashify, hasModule, removeExt, normalizePath } = require('@dcloudio/uni-cli-shared') const { resolve, getPlatformExts, cacheGlobalComponents, normalizeNodeModules } = require('./shared') const babelPluginGlobalComponent = require('./babel-plugin-global-component') const templateExt = getPlatformExts().template function getNormalMainJsCode (params) { return `import App from './${normalizePath(params.page)}.vue' import Vue from 'vue' App.mpType='page' const app = new Vue(App) app.$mount()` } function getMPVuePageFactoryMainJsCode (params) { return `import pageFactory from 'mpvue-page-factory' import App from './${normalizePath(params.page)}.vue' Page(pageFactory(App))` } module.exports = function (content, map) { if (process.env.UNI_USING_COMPONENTS) { return require('./main-new').call(this, content, map) } this.cacheable && this.cacheable() if (this.resourceQuery) { const params = loaderUtils.parseQuery(this.resourceQuery) if (params && params.page) { params.page = decodeURIComponent(params.page) return (process.env.UNI_PLATFORM === 'mp-weixin' || process.env.UNI_PLATFORM === 'app-plus') ? getMPVuePageFactoryMainJsCode(params) : getNormalMainJsCode(params) } } else { // 解析全局组件 const plugins = [] if (hasModule('@babel/plugin-syntax-typescript')) { plugins.push('@babel/plugin-syntax-typescript') plugins.push([ '@babel/plugin-proposal-decorators', { legacy: true } ]) } plugins.push(babelPluginGlobalComponent) const ast = babel.transform(content, { root: process.env.UNI_CLI_CONTEXT, plugins }) const globalComponents = {} const callback = this.async() if (!ast.metadata.globalComponents) { ast.metadata.globalComponents = {} } Promise.all(Object.keys(ast.metadata.globalComponents).map(name => { return resolve.call(this, ast.metadata.globalComponents[name]).then(resolved => { resolved = path.relative(process.env.UNI_INPUT_DIR, resolved) const hashed = hashify(resolved) globalComponents[name] = { name: hashed, src: '/' + normalizeNodeModules(removeExt(resolved)) + '.vue' + templateExt } }) })).then(() => { cacheGlobalComponents(globalComponents) callback(null, content) }, err => { callback(err, content) }) } }