From dccbb514681595e38a9c3e455f69c6d4d5c58d7f Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Wed, 23 Jun 2021 21:17:25 +0800 Subject: [PATCH] wip(app): uni-app-vite --- packages/shims-node.d.ts | 1 + packages/uni-app-vite/dist/index.js | 37 +------- packages/uni-app-vite/dist/plugin.js | 46 ++++++++++ .../uni-app-vite/dist/plugins/manifestJson.js | 2 +- .../uni-app-vite/dist/plugins/pagesJson.js | 2 +- packages/uni-app-vite/src/index.ts | 39 +-------- packages/uni-app-vite/src/plugin.ts | 53 +++++++++++ .../uni-app-vite/src/plugins/manifestJson.ts | 9 +- .../uni-app-vite/src/plugins/pagesJson.ts | 6 +- .../src/json/app/manifest/arguments.ts | 20 +++++ .../defaultManifestJson.ts} | 26 +----- .../src/json/app/manifest/index.ts | 30 +++++++ .../src/json/app/manifest/merge.ts | 21 +++++ .../src/json/app/manifest/nvue.ts | 35 ++++++++ .../src/json/app/manifest/plus.ts | 72 +++++++++++++++ .../src/json/app/manifest/safearea.ts | 28 ++++++ .../src/json/app/manifest/splashscreen.ts | 42 +++++++++ .../src/json/app/manifest/statusbar.ts | 15 ++++ packages/uni-cli-shared/src/json/app/pages.ts | 87 ------------------- .../uni-cli-shared/src/json/app/pages/code.ts | 42 +++++++++ .../src/json/app/pages/definePage.ts | 15 ++++ .../src/json/app/pages/index.ts | 26 ++++++ .../src/json/app/pages/uniConfig.ts | 59 +++++++++++++ .../src/json/app/pages/uniRoutes.ts | 5 ++ packages/uni-cli-shared/src/json/manifest.ts | 16 ++++ packages/uni-cli-shared/src/json/pages.ts | 13 ++- .../uni-h5-vite/dist/plugins/manifestJson.js | 8 +- .../uni-h5-vite/dist/plugins/pagesJson.js | 4 +- .../uni-h5-vite/src/plugins/manifestJson.ts | 17 ++-- packages/uni-h5-vite/src/plugins/pagesJson.ts | 6 +- packages/uni-h5/dist/uni-h5.es.js | 1 + packages/vite-plugin-uni/src/index.ts | 4 + yarn.lock | 6 +- 33 files changed, 572 insertions(+), 221 deletions(-) create mode 100644 packages/uni-app-vite/dist/plugin.js create mode 100644 packages/uni-app-vite/src/plugin.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/arguments.ts rename packages/uni-cli-shared/src/json/app/{manifest.ts => manifest/defaultManifestJson.ts} (58%) create mode 100644 packages/uni-cli-shared/src/json/app/manifest/index.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/merge.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/nvue.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/plus.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/safearea.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/splashscreen.ts create mode 100644 packages/uni-cli-shared/src/json/app/manifest/statusbar.ts delete mode 100644 packages/uni-cli-shared/src/json/app/pages.ts create mode 100644 packages/uni-cli-shared/src/json/app/pages/code.ts create mode 100644 packages/uni-cli-shared/src/json/app/pages/definePage.ts create mode 100644 packages/uni-cli-shared/src/json/app/pages/index.ts create mode 100644 packages/uni-cli-shared/src/json/app/pages/uniConfig.ts create mode 100644 packages/uni-cli-shared/src/json/app/pages/uniRoutes.ts diff --git a/packages/shims-node.d.ts b/packages/shims-node.d.ts index 5d4c863f9..f2c6c8db2 100644 --- a/packages/shims-node.d.ts +++ b/packages/shims-node.d.ts @@ -4,5 +4,6 @@ declare namespace NodeJS { UNI_INPUT_DIR: string UNI_OUTPUT_DIR: string UNI_CLI_CONTEXT: string + UNI_COMPILER_VERSION: string } } diff --git a/packages/uni-app-vite/dist/index.js b/packages/uni-app-vite/dist/index.js index 1ac22befd..7c6478f63 100644 --- a/packages/uni-app-vite/dist/index.js +++ b/packages/uni-app-vite/dist/index.js @@ -1,45 +1,12 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const uni_shared_1 = require("@dcloudio/uni-shared"); -const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared"); +const plugin_1 = require("./plugin"); const mainJs_1 = require("./plugins/mainJs"); const manifestJson_1 = require("./plugins/manifestJson"); const pagesJson_1 = require("./plugins/pagesJson"); -const UniAppPlugin = { - name: 'vite:uni-app', - uni: { - compilerOptions: { - isNativeTag: uni_shared_1.isServiceNativeTag, - isCustomElement: uni_shared_1.isServiceCustomElement, - }, - transformEvent: { - tap: 'click', - }, - }, - config() { - return { - build: { - lib: { - name: 'AppService', - entry: uni_cli_shared_1.resolveMainPathOnce(process.env.UNI_INPUT_DIR), - formats: ['iife'], - }, - rollupOptions: { - external: ['vue'], - output: { - entryFileNames: 'app-service.js', - globals: { - vue: 'Vue', - }, - }, - }, - }, - }; - }, -}; exports.default = [ mainJs_1.uniMainJsPlugin(), manifestJson_1.uniManifestJsonPlugin(), pagesJson_1.uniPagesJsonPlugin(), - UniAppPlugin, + plugin_1.UniAppPlugin, ]; diff --git a/packages/uni-app-vite/dist/plugin.js b/packages/uni-app-vite/dist/plugin.js new file mode 100644 index 000000000..25e8cd218 --- /dev/null +++ b/packages/uni-app-vite/dist/plugin.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UniAppPlugin = void 0; +const uni_shared_1 = require("@dcloudio/uni-shared"); +const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared"); +exports.UniAppPlugin = { + name: 'vite:uni-app', + uni: { + compilerOptions: { + isNativeTag: uni_shared_1.isServiceNativeTag, + isCustomElement: uni_shared_1.isServiceCustomElement, + }, + transformEvent: { + tap: 'click', + }, + }, + config() { + return { + build: { + lib: { + name: 'AppService', + entry: uni_cli_shared_1.resolveMainPathOnce(process.env.UNI_INPUT_DIR), + formats: ['iife'], + }, + rollupOptions: { + external: ['vue'], + output: { + entryFileNames: 'app-service.js', + globals: { + vue: 'Vue', + }, + }, + }, + }, + }; + }, + configResolved() { + const manifestJson = uni_cli_shared_1.parseManifestJsonOnce(process.env.UNI_INPUT_DIR); + if (uni_cli_shared_1.getNVueCompiler(manifestJson) === 'uni-app') { + process.env.UNI_USING_NVUE_COMPILER = 'uni-app'; + } + if (uni_cli_shared_1.getNVueStyleCompiler(manifestJson) === 'uni-app') { + process.env.UNI_USING_NVUE_STYLE_COMPILER = 'uni-app'; + } + }, +}; diff --git a/packages/uni-app-vite/dist/plugins/manifestJson.js b/packages/uni-app-vite/dist/plugins/manifestJson.js index 72a01a910..f3f190be5 100644 --- a/packages/uni-app-vite/dist/plugins/manifestJson.js +++ b/packages/uni-app-vite/dist/plugins/manifestJson.js @@ -12,7 +12,7 @@ function uniManifestJsonPlugin() { if (!opts.filter(id)) { return; } - manifestJson = uni_cli_shared_1.normalizeAppManifestJson(JSON.parse(code)); + manifestJson = uni_cli_shared_1.normalizeAppManifestJson(JSON.parse(code), uni_cli_shared_1.parsePagesJsonOnce(process.env.UNI_INPUT_DIR, process.env.UNI_PLATFORM)); return ''; }, generateBundle() { diff --git a/packages/uni-app-vite/dist/plugins/pagesJson.js b/packages/uni-app-vite/dist/plugins/pagesJson.js index 3d4bc012c..5d8aaeea1 100644 --- a/packages/uni-app-vite/dist/plugins/pagesJson.js +++ b/packages/uni-app-vite/dist/plugins/pagesJson.js @@ -19,7 +19,7 @@ function uniPagesJsonPlugin() { this.emitFile({ fileName: `app-config-service.js`, type: 'asset', - source: uni_cli_shared_1.normalizeAppConfigService(pagesJson), + source: uni_cli_shared_1.normalizeAppConfigService(pagesJson, uni_cli_shared_1.parseManifestJsonOnce(process.env.UNI_INPUT_DIR)), }); }, }; diff --git a/packages/uni-app-vite/src/index.ts b/packages/uni-app-vite/src/index.ts index 3220c6df5..26ad83e15 100644 --- a/packages/uni-app-vite/src/index.ts +++ b/packages/uni-app-vite/src/index.ts @@ -1,45 +1,8 @@ -import { - isServiceNativeTag, - isServiceCustomElement, -} from '@dcloudio/uni-shared' -import { resolveMainPathOnce, UniVitePlugin } from '@dcloudio/uni-cli-shared' +import { UniAppPlugin } from './plugin' import { uniMainJsPlugin } from './plugins/mainJs' import { uniManifestJsonPlugin } from './plugins/manifestJson' import { uniPagesJsonPlugin } from './plugins/pagesJson' -const UniAppPlugin: UniVitePlugin = { - name: 'vite:uni-app', - uni: { - compilerOptions: { - isNativeTag: isServiceNativeTag, - isCustomElement: isServiceCustomElement, - }, - transformEvent: { - tap: 'click', - }, - }, - config() { - return { - build: { - lib: { - name: 'AppService', - entry: resolveMainPathOnce(process.env.UNI_INPUT_DIR), - formats: ['iife'], - }, - rollupOptions: { - external: ['vue'], - output: { - entryFileNames: 'app-service.js', - globals: { - vue: 'Vue', - }, - }, - }, - }, - } - }, -} - export default [ uniMainJsPlugin(), uniManifestJsonPlugin(), diff --git a/packages/uni-app-vite/src/plugin.ts b/packages/uni-app-vite/src/plugin.ts new file mode 100644 index 000000000..fcf06b006 --- /dev/null +++ b/packages/uni-app-vite/src/plugin.ts @@ -0,0 +1,53 @@ +import { + isServiceNativeTag, + isServiceCustomElement, +} from '@dcloudio/uni-shared' +import { + parseManifestJsonOnce, + resolveMainPathOnce, + UniVitePlugin, + getNVueCompiler, + getNVueStyleCompiler, +} from '@dcloudio/uni-cli-shared' + +export const UniAppPlugin: UniVitePlugin = { + name: 'vite:uni-app', + uni: { + compilerOptions: { + isNativeTag: isServiceNativeTag, + isCustomElement: isServiceCustomElement, + }, + transformEvent: { + tap: 'click', + }, + }, + config() { + return { + build: { + lib: { + name: 'AppService', + entry: resolveMainPathOnce(process.env.UNI_INPUT_DIR), + formats: ['iife'], + }, + rollupOptions: { + external: ['vue'], + output: { + entryFileNames: 'app-service.js', + globals: { + vue: 'Vue', + }, + }, + }, + }, + } + }, + configResolved() { + const manifestJson = parseManifestJsonOnce(process.env.UNI_INPUT_DIR) + if (getNVueCompiler(manifestJson) === 'uni-app') { + process.env.UNI_USING_NVUE_COMPILER = 'uni-app' + } + if (getNVueStyleCompiler(manifestJson) === 'uni-app') { + process.env.UNI_USING_NVUE_STYLE_COMPILER = 'uni-app' + } + }, +} diff --git a/packages/uni-app-vite/src/plugins/manifestJson.ts b/packages/uni-app-vite/src/plugins/manifestJson.ts index 514d1de99..6e13f574f 100644 --- a/packages/uni-app-vite/src/plugins/manifestJson.ts +++ b/packages/uni-app-vite/src/plugins/manifestJson.ts @@ -3,6 +3,7 @@ import { Plugin } from 'vite' import { defineUniManifestJsonPlugin, normalizeAppManifestJson, + parsePagesJsonOnce, } from '@dcloudio/uni-cli-shared' export function uniManifestJsonPlugin(): Plugin { @@ -15,7 +16,13 @@ export function uniManifestJsonPlugin(): Plugin { if (!opts.filter(id)) { return } - manifestJson = normalizeAppManifestJson(JSON.parse(code)) + manifestJson = normalizeAppManifestJson( + JSON.parse(code), + parsePagesJsonOnce( + process.env.UNI_INPUT_DIR, + process.env.UNI_PLATFORM + ) + ) return '' }, generateBundle() { diff --git a/packages/uni-app-vite/src/plugins/pagesJson.ts b/packages/uni-app-vite/src/plugins/pagesJson.ts index 1473adf7c..c7f626b04 100644 --- a/packages/uni-app-vite/src/plugins/pagesJson.ts +++ b/packages/uni-app-vite/src/plugins/pagesJson.ts @@ -5,6 +5,7 @@ import { normalizeAppPagesJson, normalizeAppConfigService, normalizePagesJson, + parseManifestJsonOnce, } from '@dcloudio/uni-cli-shared' export function uniPagesJsonPlugin(): Plugin { @@ -26,7 +27,10 @@ export function uniPagesJsonPlugin(): Plugin { this.emitFile({ fileName: `app-config-service.js`, type: 'asset', - source: normalizeAppConfigService(pagesJson), + source: normalizeAppConfigService( + pagesJson, + parseManifestJsonOnce(process.env.UNI_INPUT_DIR) + ), }) }, } diff --git a/packages/uni-cli-shared/src/json/app/manifest/arguments.ts b/packages/uni-cli-shared/src/json/app/manifest/arguments.ts new file mode 100644 index 000000000..63d8e4639 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/arguments.ts @@ -0,0 +1,20 @@ +export function initArguments( + manifestJson: Record, + pagesJson: Record +) { + if (process.env.NODE_ENV !== 'development') { + return + } + const condition = pagesJson.condition + if (condition && Array.isArray(condition.list) && condition.list.length) { + const list = condition.list + let current = parseInt(condition.current) || 0 + if (current < 0) { + current = 0 + } + if (current >= list.length) { + current = 0 + } + manifestJson.plus.arguments = JSON.stringify(list[current]) + } +} diff --git a/packages/uni-cli-shared/src/json/app/manifest.ts b/packages/uni-cli-shared/src/json/app/manifest/defaultManifestJson.ts similarity index 58% rename from packages/uni-cli-shared/src/json/app/manifest.ts rename to packages/uni-cli-shared/src/json/app/manifest/defaultManifestJson.ts index aec506c12..28eab2b30 100644 --- a/packages/uni-cli-shared/src/json/app/manifest.ts +++ b/packages/uni-cli-shared/src/json/app/manifest/defaultManifestJson.ts @@ -1,23 +1,5 @@ -import { recursive } from 'merge' -export function normalizeAppManifestJson( - userManifestJson: Record -) { - const manifestJson = getDefaultManifestJson() - recursive( - true, - manifestJson, - { - id: userManifestJson.appid || '', - name: userManifestJson.name || '', - description: userManifestJson.description || '', - version: { - name: userManifestJson.versionName, - code: userManifestJson.versionCode, - }, - }, - { plus: userManifestJson['app-plus'] } - ) - return manifestJson +export function initDefaultManifestJson() { + return JSON.parse(defaultManifestJson) } const defaultManifestJson = `{ @@ -55,7 +37,3 @@ const defaultManifestJson = `{ "launchwebview": {} } }` - -function getDefaultManifestJson() { - return JSON.parse(defaultManifestJson) -} diff --git a/packages/uni-cli-shared/src/json/app/manifest/index.ts b/packages/uni-cli-shared/src/json/app/manifest/index.ts new file mode 100644 index 000000000..0e8dc7343 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/index.ts @@ -0,0 +1,30 @@ +import { initRecursiveMerge } from './merge' +import { initDefaultManifestJson } from './defaultManifestJson' +import { initAppStatusbar } from './statusbar' +import { initPlus } from './plus' +import { initNVue } from './nvue' +import { initArguments } from './arguments' +import { initSafearea } from './safearea' +import { initSplashscreen } from './splashscreen' + +export function normalizeAppManifestJson( + userManifestJson: Record, + pagesJson: Record +) { + const manifestJson = initDefaultManifestJson() + + initAppStatusbar(manifestJson, pagesJson) + initRecursiveMerge(manifestJson, userManifestJson) + initArguments(manifestJson, pagesJson) + initPlus(manifestJson, userManifestJson) + initNVue(manifestJson, pagesJson) + initSafearea(manifestJson, pagesJson) + initSplashscreen(manifestJson, userManifestJson) + return manifestJson +} + +export { + getNVueCompiler, + getNVueStyleCompiler, + getNVueFlexDirection, +} from './nvue' diff --git a/packages/uni-cli-shared/src/json/app/manifest/merge.ts b/packages/uni-cli-shared/src/json/app/manifest/merge.ts new file mode 100644 index 000000000..40f561de7 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/merge.ts @@ -0,0 +1,21 @@ +import { recursive } from 'merge' + +export function initRecursiveMerge( + manifestJson: Record, + userManifestJson: Record +) { + recursive( + true, + manifestJson, + { + id: userManifestJson.appid || '', + name: userManifestJson.name || '', + description: userManifestJson.description || '', + version: { + name: userManifestJson.versionName, + code: userManifestJson.versionCode, + }, + }, + { plus: userManifestJson['app-plus'] } + ) +} diff --git a/packages/uni-cli-shared/src/json/app/manifest/nvue.ts b/packages/uni-cli-shared/src/json/app/manifest/nvue.ts new file mode 100644 index 000000000..311a4aca7 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/nvue.ts @@ -0,0 +1,35 @@ +export function initNVue( + manifestJson: Record, + pagesJson: Record +) {} + +export function getNVueCompiler(manifestJson: Record) { + const platformOptions = manifestJson['app-plus'] + if (platformOptions && platformOptions.nvueCompiler === 'weex') { + return 'weex' + } + return 'uni-app' +} + +export function getNVueStyleCompiler(manifestJson: Record) { + const platformOptions = manifestJson['app-plus'] + if (platformOptions && platformOptions.nvueStyleCompiler === 'uni-app') { + return 'uni-app' + } + return 'weex' +} + +const flexDirs = ['row', 'row-reverse', 'column', 'column-reverse'] as const + +type FlexDir = typeof flexDirs[number] + +export function getNVueFlexDirection(manifestJson: Record) { + let flexDir: FlexDir = 'column' + if (manifestJson['app-plus']?.nvue?.['flex-direction']) { + flexDir = manifestJson['app-plus'].nvue['flex-direction'] as FlexDir + if (flexDirs.indexOf(flexDir) === -1) { + flexDir = 'column' + } + } + return flexDir +} diff --git a/packages/uni-cli-shared/src/json/app/manifest/plus.ts b/packages/uni-cli-shared/src/json/app/manifest/plus.ts new file mode 100644 index 000000000..7ef7c232e --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/plus.ts @@ -0,0 +1,72 @@ +const wxPageOrientationMapping = { + auto: [ + 'portrait-primary', + 'portrait-secondary', + 'landscape-primary', + 'landscape-secondary', + ], + portrait: ['portrait-primary', 'portrait-secondary'], + landscape: ['landscape-primary', 'landscape-secondary'], +} + +export function initPlus( + manifestJson: Record, + pagesJson: Record +) { + // 转换为老版本配置 + if (manifestJson.plus.modules) { + manifestJson.permissions = manifestJson.plus.modules + delete manifestJson.plus.modules + } + const distribute = manifestJson.plus.distribute + if (distribute) { + if (distribute.android) { + manifestJson.plus.distribute.google = distribute.android + delete manifestJson.plus.distribute.android + } + if (distribute.ios) { + manifestJson.plus.distribute.apple = distribute.ios + delete manifestJson.plus.distribute.ios + } + if (distribute.sdkConfigs) { + manifestJson.plus.distribute.plugins = distribute.sdkConfigs + delete manifestJson.plus.distribute.sdkConfigs + } + } + + // 屏幕启动方向 + if (manifestJson.plus.screenOrientation) { + // app平台优先使用 manifest 配置 + manifestJson.screenOrientation = manifestJson.plus.screenOrientation + delete manifestJson.plus.screenOrientation + } else if (pagesJson.globalStyle && pagesJson.globalStyle.pageOrientation) { + // 兼容微信小程序 + const pageOrientationValue = + wxPageOrientationMapping[ + pagesJson.globalStyle + .pageOrientation as keyof typeof wxPageOrientationMapping + ] + if (pageOrientationValue) { + manifestJson.screenOrientation = pageOrientationValue + } + } + + // 全屏配置 + manifestJson.fullscreen = manifestJson.plus.fullscreen + + // 地图坐标系 + if (manifestJson.permissions && manifestJson.permissions.Maps) { + manifestJson.permissions.Maps.coordType = 'gcj02' + } + + if (!manifestJson.permissions) { + manifestJson.permissions = {} + } + + manifestJson.permissions.UniNView = { + description: 'UniNView原生渲染', + } + + // 允许内联播放视频 + manifestJson.plus.allowsInlineMediaPlayback = true +} diff --git a/packages/uni-cli-shared/src/json/app/manifest/safearea.ts b/packages/uni-cli-shared/src/json/app/manifest/safearea.ts new file mode 100644 index 000000000..64bfeed7f --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/safearea.ts @@ -0,0 +1,28 @@ +export function initSafearea( + manifestJson: Record, + pagesJson: Record +) { + if ( + pagesJson.tabBar && + pagesJson.tabBar.list && + pagesJson.tabBar.list.length + ) { + // 安全区配置 仅包含 tabBar 的时候才配置 + if (!manifestJson.plus.safearea) { + manifestJson.plus.safearea = { + background: pagesJson.tabBar.backgroundColor || '#FFFFFF', + bottom: { + offset: 'auto', + }, + } + } + } else { + if (!manifestJson.plus.launchwebview) { + manifestJson.plus.launchwebview = { + render: 'always', + } + } else if (!manifestJson.plus.launchwebview.render) { + manifestJson.plus.launchwebview.render = 'always' + } + } +} diff --git a/packages/uni-cli-shared/src/json/app/manifest/splashscreen.ts b/packages/uni-cli-shared/src/json/app/manifest/splashscreen.ts new file mode 100644 index 000000000..622a3ea3a --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/splashscreen.ts @@ -0,0 +1,42 @@ +import { hasOwn } from '@vue/shared' + +export function initSplashscreen( + manifestJson: Record, + userManifestJson: Record +) { + if (!manifestJson.plus.splashscreen) { + return + } + // 强制白屏检测 + const splashscreenOptions = + userManifestJson['app-plus'] && userManifestJson['app-plus'].splashscreen + const hasAlwaysShowBeforeRender = + splashscreenOptions && hasOwn(splashscreenOptions, 'alwaysShowBeforeRender') + if ( + !hasAlwaysShowBeforeRender && + manifestJson.plus.splashscreen.autoclose === false + ) { + // 兼容旧版本仅配置了 autoclose 为 false + manifestJson.plus.splashscreen.alwaysShowBeforeRender = false + } + if (manifestJson.plus.splashscreen.alwaysShowBeforeRender) { + // 白屏检测 + if (!manifestJson.plus.splashscreen.target) { + manifestJson.plus.splashscreen.target = 'id:1' + } + manifestJson.plus.splashscreen.autoclose = true + manifestJson.plus.splashscreen.delay = 0 + // 简单起见,直接设置环境变量,这样生成uniConfig时,直接读取判断 + process.env.UNI_SPLASHSCREEN_ALWAYSSHOWBEFORERENDER = 'true' + } else { + // 不启用白屏检测 + delete manifestJson.plus.splashscreen.target + if (manifestJson.plus.splashscreen.autoclose) { + // 启用 uni-app 框架关闭 splash + manifestJson.plus.splashscreen.autoclose = false // 原 5+ autoclose 改为 false + // 简单起见,直接设置环境变量,这样生成uniConfig时,直接读取判断 + process.env.UNI_SPLASHSCREEN_AUTOCLOSE = 'true' + } + } + delete manifestJson.plus.splashscreen.alwaysShowBeforeRender +} diff --git a/packages/uni-cli-shared/src/json/app/manifest/statusbar.ts b/packages/uni-cli-shared/src/json/app/manifest/statusbar.ts new file mode 100644 index 000000000..953c4ae14 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/manifest/statusbar.ts @@ -0,0 +1,15 @@ +export function initAppStatusbar( + manifestJson: Record, + pagesJson: Record +) { + const { + navigationBarTextStyle = 'white', + navigationBarBackgroundColor = '#000000', + } = pagesJson.globalStyle || {} + + manifestJson.plus.statusbar = { + immersed: 'supportedDevice', + style: navigationBarTextStyle === 'black' ? 'dark' : 'light', + background: navigationBarBackgroundColor, + } +} diff --git a/packages/uni-cli-shared/src/json/app/pages.ts b/packages/uni-cli-shared/src/json/app/pages.ts deleted file mode 100644 index 65a811754..000000000 --- a/packages/uni-cli-shared/src/json/app/pages.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { normalizeIdentifier } from '../../utils' -import { normalizePagesRoute } from '../pages' - -export function normalizeAppPagesJson(pagesJson: Record) { - return polyfillCode + restoreGlobalCode + definePageCode(pagesJson) -} - -function definePageCode(pagesJson: Record) { - const importPagesCode: string[] = [] - const definePagesCode: string[] = [] - pagesJson.pages.forEach((page: UniApp.UniRoute) => { - const pagePath = page.path - const pageIdentifier = normalizeIdentifier(pagePath) - importPagesCode.push( - `import ${pageIdentifier} from './${pagePath}.vue?mpType=page'` - ) - definePagesCode.push(`__definePage('${pagePath}',${pageIdentifier})`) - }) - return importPagesCode.join('\n') + '\n' + definePagesCode.join('\n') -} - -const polyfillCode = ` -if (typeof Promise !== 'undefined' && !Promise.prototype.finally) { - Promise.prototype.finally = function(callback) { - const promise = this.constructor - return this.then( - value => promise.resolve(callback()).then(() => value), - reason => promise.resolve(callback()).then(() => { - throw reason - }) - ) - } -} -` -const restoreGlobalCode = ` -if(uni.restoreGlobal){ - uni.restoreGlobal(weex,plus,setTimeout,clearTimeout,setInterval,clearInterval) -} -` - -export function normalizeAppConfigService(pagesJson: UniApp.PagesJson) { - return ` -;(function(){ -const u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[]; -const __uniConfig = ${normalizeAppUniConfig(pagesJson)}; -const __uniRoutes = ${normalizeAppUniRoutes(pagesJson)}; -__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); -__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); -service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,${normalizeGlobalStatement( - GLOBALS - )}}}}}); -})(); -` -} - -function normalizeAppUniConfig(pagesJson: UniApp.PagesJson) { - return JSON.stringify(pagesJson.globalStyle) -} -function normalizeAppUniRoutes(pagesJson: UniApp.PagesJson) { - return JSON.stringify(normalizePagesRoute(pagesJson)) -} - -function normalizeGlobalStatement(globals: string[]) { - return globals.map((g) => `${g}:u`).join(',') -} - -const GLOBALS = [ - 'global', - 'window', - 'document', - 'frames', - 'self', - 'location', - 'navigator', - 'localStorage', - 'history', - 'Caches', - 'screen', - 'alert', - 'confirm', - 'prompt', - 'fetch', - 'XMLHttpRequest', - 'WebSocket', - 'webkit', - 'print', -] diff --git a/packages/uni-cli-shared/src/json/app/pages/code.ts b/packages/uni-cli-shared/src/json/app/pages/code.ts new file mode 100644 index 000000000..f1a469dec --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/pages/code.ts @@ -0,0 +1,42 @@ +export const polyfillCode = ` +if (typeof Promise !== 'undefined' && !Promise.prototype.finally) { + Promise.prototype.finally = function(callback) { + const promise = this.constructor + return this.then( + value => promise.resolve(callback()).then(() => value), + reason => promise.resolve(callback()).then(() => { + throw reason + }) + ) + } +} +` +export const restoreGlobalCode = ` +if(uni.restoreGlobal){ + uni.restoreGlobal(weex,plus,setTimeout,clearTimeout,setInterval,clearInterval) +} +` + +const GLOBALS = [ + 'global', + 'window', + 'document', + 'frames', + 'self', + 'location', + 'navigator', + 'localStorage', + 'history', + 'Caches', + 'screen', + 'alert', + 'confirm', + 'prompt', + 'fetch', + 'XMLHttpRequest', + 'WebSocket', + 'webkit', + 'print', +] + +export const globalCode = GLOBALS.map((g) => `${g}:u`).join(',') diff --git a/packages/uni-cli-shared/src/json/app/pages/definePage.ts b/packages/uni-cli-shared/src/json/app/pages/definePage.ts new file mode 100644 index 000000000..6b6db0051 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/pages/definePage.ts @@ -0,0 +1,15 @@ +import { normalizeIdentifier } from '../../../utils' + +export function definePageCode(pagesJson: Record) { + const importPagesCode: string[] = [] + const definePagesCode: string[] = [] + pagesJson.pages.forEach((page: UniApp.UniRoute) => { + const pagePath = page.path + const pageIdentifier = normalizeIdentifier(pagePath) + importPagesCode.push( + `import ${pageIdentifier} from './${pagePath}.vue?mpType=page'` + ) + definePagesCode.push(`__definePage('${pagePath}',${pageIdentifier})`) + }) + return importPagesCode.join('\n') + '\n' + definePagesCode.join('\n') +} diff --git a/packages/uni-cli-shared/src/json/app/pages/index.ts b/packages/uni-cli-shared/src/json/app/pages/index.ts new file mode 100644 index 000000000..da982eefd --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/pages/index.ts @@ -0,0 +1,26 @@ +import { globalCode, polyfillCode, restoreGlobalCode } from './code' +import { definePageCode } from './definePage' +import { normalizeAppUniConfig } from './uniConfig' +import { normalizeAppUniRoutes } from './uniRoutes' + +export function normalizeAppPagesJson(pagesJson: Record) { + return polyfillCode + restoreGlobalCode + definePageCode(pagesJson) +} + +export function normalizeAppConfigService( + pagesJson: UniApp.PagesJson, + manifestJson: Record +) { + return ` + ;(function(){ + const u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[]; + const __uniConfig = ${normalizeAppUniConfig(pagesJson, manifestJson)}; + const __uniRoutes = ${normalizeAppUniRoutes( + pagesJson + )}.map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute)); + __uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); + __uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}}); + service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,${globalCode}}}}}); + })(); + ` +} diff --git a/packages/uni-cli-shared/src/json/app/pages/uniConfig.ts b/packages/uni-cli-shared/src/json/app/pages/uniConfig.ts new file mode 100644 index 000000000..0dcfdcb15 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/pages/uniConfig.ts @@ -0,0 +1,59 @@ +import { normalizeNetworkTimeout } from '../../manifest' +import { + getNVueCompiler, + getNVueFlexDirection, + getNVueStyleCompiler, +} from '../manifest' + +interface AppUniConfig { + pages: string[] + window: UniApp.PagesJsonPageStyle + nvue: { + compiler: 'uni-app' | 'weex' + styleCompiler: 'weex' | 'uni-app' + 'flex-direction': 'row' | 'row-reverse' | 'column' | 'column-reverse' + } + renderer: 'auto' | 'native' + splashscreen: { + alwaysShowBeforeRender: boolean + autoclose: boolean + } + appname: string + compilerVersion: string + entryPagePath: string + networkTimeout: { + request: number + connectSocket: number + uploadFile: number + downloadFile: number + } +} + +export function normalizeAppUniConfig( + pagesJson: UniApp.PagesJson, + manifestJson: Record +) { + const config: AppUniConfig = { + pages: [], + window: pagesJson.globalStyle, + nvue: { + compiler: getNVueCompiler(manifestJson), + styleCompiler: getNVueStyleCompiler(manifestJson), + 'flex-direction': getNVueFlexDirection(manifestJson), + }, + renderer: + manifestJson['app-plus']?.renderer === 'native' ? 'native' : 'auto', + appname: manifestJson.name || '', + splashscreen: { + alwaysShowBeforeRender: process.env + .UNI_SPLASHSCREEN_ALWAYSSHOWBEFORERENDER + ? true + : false, + autoclose: process.env.UNI_SPLASHSCREEN_AUTOCLOSE ? true : false, + }, + compilerVersion: process.env.UNI_COMPILER_VERSION, + entryPagePath: '', //TODO + networkTimeout: normalizeNetworkTimeout(manifestJson.networkTimeout), + } + return JSON.stringify(config) +} diff --git a/packages/uni-cli-shared/src/json/app/pages/uniRoutes.ts b/packages/uni-cli-shared/src/json/app/pages/uniRoutes.ts new file mode 100644 index 000000000..cdef0db90 --- /dev/null +++ b/packages/uni-cli-shared/src/json/app/pages/uniRoutes.ts @@ -0,0 +1,5 @@ +import { normalizePagesRoute } from '../../pages' + +export function normalizeAppUniRoutes(pagesJson: UniApp.PagesJson) { + return JSON.stringify(normalizePagesRoute(pagesJson)) +} diff --git a/packages/uni-cli-shared/src/json/manifest.ts b/packages/uni-cli-shared/src/json/manifest.ts index aad7d5c96..74007cdf2 100644 --- a/packages/uni-cli-shared/src/json/manifest.ts +++ b/packages/uni-cli-shared/src/json/manifest.ts @@ -26,3 +26,19 @@ function parseCompatConfig(inputDir: string): CompilerCompatConfig { } export const parseCompatConfigOnce = once(parseCompatConfig) + +const defaultNetworkTimeout = { + request: 60000, + connectSocket: 60000, + uploadFile: 60000, + downloadFile: 60000, +} + +export function normalizeNetworkTimeout( + networkTimeout?: Partial +) { + return { + ...defaultNetworkTimeout, + ...networkTimeout, + } +} diff --git a/packages/uni-cli-shared/src/json/pages.ts b/packages/uni-cli-shared/src/json/pages.ts index fceaacad3..6191260b8 100644 --- a/packages/uni-cli-shared/src/json/pages.ts +++ b/packages/uni-cli-shared/src/json/pages.ts @@ -300,16 +300,15 @@ export function normalizePagesRoute( let windowTop = 0 const meta = extend( { - route: pageOptions.path, - isNVue: isNVue ? true : undefined, + isNVue: isNVue || undefined, isQuit: isEntry || isTabBar ? true : undefined, - isEntry, - isTabBar, - tabBarIndex, - windowTop, + isEntry: isEntry || undefined, + isTabBar: isTabBar || undefined, + tabBarIndex: isTabBar ? tabBarIndex : undefined, + windowTop: windowTop || undefined, }, pageOptions.style - ) + ) as UniApp.PageRouteMeta return { path: pageOptions.path, meta, diff --git a/packages/uni-h5-vite/dist/plugins/manifestJson.js b/packages/uni-h5-vite/dist/plugins/manifestJson.js index cb601300c..3211e3abc 100644 --- a/packages/uni-h5-vite/dist/plugins/manifestJson.js +++ b/packages/uni-h5-vite/dist/plugins/manifestJson.js @@ -13,12 +13,6 @@ const defaultAsync = { timeout: 60000, suspensible: true, }; -const defaultNetworkTimeout = { - request: 60000, - connectSocket: 60000, - uploadFile: 60000, - downloadFile: 60000, -}; const defaultQQMapKey = 'XVXBZ-NDMC4-JOGUS-XGIEE-QVHDZ-AMFV2'; function uniManifestJsonPlugin() { return uni_cli_shared_1.defineUniManifestJsonPlugin((opts) => { @@ -37,7 +31,7 @@ function uniManifestJsonPlugin() { router.base = '/'; } const async = Object.assign(Object.assign({}, defaultAsync), ((h5 && h5.async) || {})); - const networkTimeout = Object.assign(Object.assign({}, defaultNetworkTimeout), (manifest.networkTimeout || {})); + const networkTimeout = uni_cli_shared_1.normalizeNetworkTimeout(manifest.networkTimeout); const sdkConfigs = (h5 && h5.sdkConfigs) || {}; const qqMapKey = (sdkConfigs.maps && sdkConfigs.maps.qqmap && diff --git a/packages/uni-h5-vite/dist/plugins/pagesJson.js b/packages/uni-h5-vite/dist/plugins/pagesJson.js index 49583f54f..0559e9136 100644 --- a/packages/uni-h5-vite/dist/plugins/pagesJson.js +++ b/packages/uni-h5-vite/dist/plugins/pagesJson.js @@ -150,7 +150,7 @@ function generatePagesDefineCode(pagesJson, _config) { } ` + pages.map((pageOptions) => generatePageDefineCode(pageOptions)).join('\n')); } -function generatePageRoute({ path, meta }, config) { +function generatePageRoute({ path, meta }, _config) { const { isEntry } = meta; const alias = isEntry ? `\n alias:'/${path}',` : ''; return `{ @@ -170,7 +170,7 @@ function renderPage(component){ } ${globalName}.__uniRoutes=[${[ ...generatePagesRoute(uni_cli_shared_1.normalizePagesRoute(pagesJson), config), - ].join(',')}]`; + ].join(',')}].map(uniRoute=>(uniRoute.meta.route = (uniRoute.alias || uniRoute.path).substr(1),uniRoute))`; } function generateConfig(globalName, pagesJson, config) { delete pagesJson.pages; diff --git a/packages/uni-h5-vite/src/plugins/manifestJson.ts b/packages/uni-h5-vite/src/plugins/manifestJson.ts index f1e1d1658..34bcb013e 100644 --- a/packages/uni-h5-vite/src/plugins/manifestJson.ts +++ b/packages/uni-h5-vite/src/plugins/manifestJson.ts @@ -1,6 +1,9 @@ import { Plugin } from 'vite' -import { defineUniManifestJsonPlugin } from '@dcloudio/uni-cli-shared' +import { + defineUniManifestJsonPlugin, + normalizeNetworkTimeout, +} from '@dcloudio/uni-cli-shared' const defaultRouter = { mode: 'hash', @@ -15,13 +18,6 @@ const defaultAsync = { suspensible: true, } -const defaultNetworkTimeout = { - request: 60000, - connectSocket: 60000, - uploadFile: 60000, - downloadFile: 60000, -} - const defaultQQMapKey = 'XVXBZ-NDMC4-JOGUS-XGIEE-QVHDZ-AMFV2' export function uniManifestJsonPlugin(): Plugin { @@ -42,10 +38,7 @@ export function uniManifestJsonPlugin(): Plugin { } const async = { ...defaultAsync, ...((h5 && h5.async) || {}) } - const networkTimeout = { - ...defaultNetworkTimeout, - ...(manifest.networkTimeout || {}), - } + const networkTimeout = normalizeNetworkTimeout(manifest.networkTimeout) const sdkConfigs = (h5 && h5.sdkConfigs) || {} diff --git a/packages/uni-h5-vite/src/plugins/pagesJson.ts b/packages/uni-h5-vite/src/plugins/pagesJson.ts index cde4e3afb..aef97a877 100644 --- a/packages/uni-h5-vite/src/plugins/pagesJson.ts +++ b/packages/uni-h5-vite/src/plugins/pagesJson.ts @@ -185,7 +185,7 @@ function generatePagesDefineCode( function generatePageRoute( { path, meta }: UniApp.UniRoute, - config: ResolvedConfig + _config: ResolvedConfig ) { const { isEntry } = meta const alias = isEntry ? `\n alias:'/${path}',` : '' @@ -217,7 +217,9 @@ function renderPage(component){ } ${globalName}.__uniRoutes=[${[ ...generatePagesRoute(normalizePagesRoute(pagesJson), config), - ].join(',')}]` + ].join( + ',' + )}].map(uniRoute=>(uniRoute.meta.route = (uniRoute.alias || uniRoute.path).substr(1),uniRoute))` } function generateConfig( diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index 669c6fa59..ae4484bfb 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -4801,6 +4801,7 @@ const ShowActionSheetProtocol = { type: Array, required: true }, + title: String, itemColor: String, popover: Object }; diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index fbdbe398d..edeab6307 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -14,6 +14,10 @@ import { createTransformIndexHtml } from './transformIndexHtml' const debugUni = debug('vite:uni:plugin') +const pkg = require('@dcloudio/vite-plugin-uni/package.json') + +process.env.UNI_COMPILER_VERSION = pkg['uni-app']?.['compilerVersion'] || '' + export interface VitePluginUniOptions { inputDir?: string outputDir?: string diff --git a/yarn.lock b/yarn.lock index f93366563..0dd829cf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1786,9 +1786,9 @@ integrity sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg== "@types/node@^14.14.20": - version "14.17.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz#6d327abaa4be34a74e421ed6409a0ae2f47f4c3d" - integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== + version "14.17.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.4.tgz#218712242446fc868d0e007af29a4408c7765bc0" + integrity sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A== "@types/normalize-package-data@^2.4.0": version "2.4.0" -- GitLab