diff --git a/packages/uni-cli-shared/lib/index.js b/packages/uni-cli-shared/lib/index.js index a2d06340e38535601fb22d6c261d17794c171dbb..60ed9fcec0ab8306cdba52517a4385c693dfa7d3 100644 --- a/packages/uni-cli-shared/lib/index.js +++ b/packages/uni-cli-shared/lib/index.js @@ -65,7 +65,7 @@ const { const uts = require('./uts') -const { parseTheme } = require('./theme') +const { parseTheme, initTheme } = require('./theme') module.exports = { uts, @@ -118,5 +118,6 @@ module.exports = { getPlatformStat, getPlatformPush, getPlatformUniCloud, - parseTheme + parseTheme, + initTheme } diff --git a/packages/uni-cli-shared/lib/theme.js b/packages/uni-cli-shared/lib/theme.js index 01c2e60ef7c1712ee363684fb735e04cb94e4de5..13bc0be31d0333ef56e4254536e287244809d394 100644 --- a/packages/uni-cli-shared/lib/theme.js +++ b/packages/uni-cli-shared/lib/theme.js @@ -41,7 +41,7 @@ module.exports = { return } try { - themeConfig = getJson(themeLocation, true) + themeConfig = Object.keys(themeConfig).length ? themeConfig : getJson(themeLocation, true) global.uniPlugin.defaultTheme = themeConfig.light } catch (e) { console.error(e) diff --git a/packages/vue-cli-plugin-uni/packages/postcss/index.js b/packages/vue-cli-plugin-uni/packages/postcss/index.js index 9a57986ec9d6743b20a2fa21b96f951a27bd10da..364b64c6eb115a507b3d42f49e5d29b82d5b76f4 100644 --- a/packages/vue-cli-plugin-uni/packages/postcss/index.js +++ b/packages/vue-cli-plugin-uni/packages/postcss/index.js @@ -296,7 +296,7 @@ if (process.env.UNI_USING_V3) { const version = Number(require('postcss/package.json').version.split('.')[0]) - if (version <= 8) { + if (version < 8) { module.exports = postcss.plugin('postcss-uniapp-plugin', fn) } else { module.exports = function (opts) { diff --git a/packages/vue-cli-plugin-uni/packages/postcss/index.v3.js b/packages/vue-cli-plugin-uni/packages/postcss/index.v3.js index 602d6bda9a656a78173242246f89781558233f5b..5498d68836e121327f8a4df540424842d4fadd72 100644 --- a/packages/vue-cli-plugin-uni/packages/postcss/index.v3.js +++ b/packages/vue-cli-plugin-uni/packages/postcss/index.v3.js @@ -1,6 +1,16 @@ const selectorParser = require('postcss-selector-parser') +const postcss = require('postcss') -const TAGS = Object.keys(require('@dcloudio/uni-cli-shared').tags) +const { + initTheme, + parseTheme, + getJson, + getManifestJson, + tags +} = require('@dcloudio/uni-cli-shared') + +const TAGS = Object.keys(tags) +const pageJson = getJson('pages.json', true) const transformSelector = (complexSelector, transformer) => { return selectorParser(transformer).processSync(complexSelector) @@ -41,6 +51,34 @@ function once (root) { ) } }) + + // darkmode + if ( + process.env.VUE_APP_DARK_MODE === 'true' && + root.source.input.file.indexOf('App.vue') !== -1 + ) { + const pageBGC = (pageJson.globalStyle || {}).backgroundColor || '' + if (pageBGC.indexOf('@') === 0) { + // app 端 webpack-uni-pages-loader/lib/index-new.js 执行晚于 postCss + initTheme(getManifestJson()) + ;['dark', 'light'].forEach(theme => { + const { backgroundColor } = parseTheme({ backgroundColor: pageBGC }, theme) + if (backgroundColor !== 'undefined') { + const mediaRoot = postcss.parse(` + /* #ifndef APP-NVUE*/ + @media (prefers-color-scheme: ${theme}) { + body, + uni-page-body { + background-color: ${backgroundColor}; + } + } + /* #endif */ + `) + root.nodes = [...mediaRoot.nodes, ...root.nodes] + } + }) + } + } } const version = Number(require('postcss/package.json').version.split('.')[0])