const fs = require('fs') const path = require('path') const loaderUtils = require('loader-utils') const { parseComponent } = require('weex-template-compiler') const { attrsToQuery } = require('vue-loader/lib/codegen/utils') const { normalizePath, getPlatformStat } = require('@dcloudio/uni-cli-shared') const appVuePath = path.resolve(process.env.UNI_INPUT_DIR, 'App.vue') function genStyleRequest (style, i, stringifyRequest) { const src = style.src || normalizePath(appVuePath) const attrsQuery = attrsToQuery(style.attrs, 'css') const query = `?vue&type=style&index=${i}${attrsQuery}` return stringifyRequest(src + query) } function getAppStyleCode (stringifyRequest) { if (!process.env.UNI_USING_NVUE_COMPILER) { return '' } let code = 'Vue.prototype.__$appStyle__ = {}\n' let styles = [] try { if (fs.existsSync(appVuePath)) { styles = parseComponent(fs.readFileSync(appVuePath, 'utf8')).styles } } catch (e) {} styles.forEach((style, index) => { code = code + `Vue.prototype.__merge_style && Vue.prototype.__merge_style(require(${genStyleRequest(style, index, stringifyRequest)}).default,Vue.prototype.__$appStyle__)\n` }) return code } module.exports = function (content, map) { this.cacheable && this.cacheable() const loaderContext = this const statCode = getPlatformStat() if (this.resourceQuery) { const params = loaderUtils.parseQuery(this.resourceQuery) if (params) { if (params.page) { params.page = decodeURIComponent(params.page) // import Vue from 'vue'是为了触发 vendor 合并 return ` ${statCode} import 'uni-app-style' import 'uni-polyfill' import App from './${normalizePath(params.page)}.nvue?mpType=page' App.mpType = 'page' App.route = '${params.page}' App.el = '#root' new Vue(App) ` } else if (params.type === 'appStyle') { const stringifyRequest = r => loaderUtils.stringifyRequest(loaderContext, r) return `${getAppStyleCode(stringifyRequest)}` } } } const automatorCode = process.env.UNI_AUTOMATOR_WS_ENDPOINT ? 'import \'@dcloudio/uni-app-plus/dist/automator\';' : '' return automatorCode + statCode + content }