diff --git a/packages/uni-app-plus/dist/index.v3.js b/packages/uni-app-plus/dist/index.v3.js index e230150770db67371229b41a749fc98658285909..c302d93fe2437640722947be6bc7cca71f3be37e 100644 --- a/packages/uni-app-plus/dist/index.v3.js +++ b/packages/uni-app-plus/dist/index.v3.js @@ -8058,28 +8058,39 @@ var serviceContext = (function () { let todoNavigator = false; + function setTodoNavigator (path, callback, msg) { + todoNavigator = { + path: path, + nvue: __uniRoutes.find(route => route.path === path).meta.isNVue, + navigate: callback + }; + if (process.env.NODE_ENV !== 'production') { + console.log(`todoNavigator:${todoNavigator.path} ${msg}`); + } + } + function navigate (path, callback, isAppLaunch) { - { - if (isAppLaunch && __uniConfig.splashscreen && __uniConfig.splashscreen.autoclose && (!__uniConfig.splashscreen.alwaysShowBeforeRender)) { - plus.navigator.closeSplashscreen(); + { + if (isAppLaunch && __uniConfig.splashscreen && __uniConfig.splashscreen.autoclose && (!__uniConfig.splashscreen.alwaysShowBeforeRender)) { + plus.navigator.closeSplashscreen(); } if (!isAppLaunch && todoNavigator) { return console.error(`已存在待跳转页面${todoNavigator.path},请不要连续多次跳转页面${path}`) } + if (__uniConfig.renderer === 'native') { // 纯原生无需wait逻辑 + // 如果是首页还未初始化,需要等一等,其他无需等待 + if (getCurrentPages().length === 0) { + return setTodoNavigator(path, callback, 'waitForReady') + } + return callback() + } // 未创建 preloadWebview 或 preloadWebview 已被使用 const waitPreloadWebview = !preloadWebview || (preloadWebview && preloadWebview.__uniapp_route); // 已创建未 loaded const waitPreloadWebviewReady = preloadWebview && !preloadWebview.loaded; if (waitPreloadWebview || waitPreloadWebviewReady) { - todoNavigator = { - path: path, - nvue: __uniRoutes.find(route => route.path === path).meta.isNVue, - navigate: callback - }; - if (process.env.NODE_ENV !== 'production') { - console.log(`todoNavigator:${todoNavigator.path} ${waitPreloadWebview ? 'waitForCreate' : 'waitForReady'}`); - } + setTodoNavigator(path, callback, waitPreloadWebview ? 'waitForCreate' : 'waitForReady'); } else { callback(); } @@ -8105,6 +8116,15 @@ var serviceContext = (function () { function navigateFinish () { { + if (__uniConfig.renderer === 'native') { + if (!todoNavigator) { + return + } + if (todoNavigator.nvue) { + return todoNavigate() + } + return + } // 创建预加载 const preloadWebview = createPreloadWebview(); if (process.env.NODE_ENV !== 'production') { @@ -8227,7 +8247,7 @@ var serviceContext = (function () { } if (process.env.NODE_ENV !== 'production') { - console.log(`[uni-app] registerPage`, path, webview.id); + console.log(`[uni-app] registerPage(${path},${webview.id})`); } initWebview(webview, routeOptions, path, query); @@ -12467,14 +12487,20 @@ var serviceContext = (function () { subscribeHandler(data.type, data.data, data.pageId); }); - subscribe(WEBVIEW_READY, onWebviewReady); + if (__uniConfig.renderer !== 'native') { + subscribe(WEBVIEW_READY, onWebviewReady); + + subscribe(VD_SYNC, onVdSync); + subscribe(VD_SYNC_CALLBACK, onVdSyncCallback); - const entryPagePath = '/' + __uniConfig.entryPagePath; - const routeOptions = __uniRoutes.find(route => route.path === entryPagePath); - if (!routeOptions.meta.isNVue) { // 首页是 vue - // 防止首页 webview 初始化过早, service 还未开始监听 - publishHandler(WEBVIEW_READY, Object.create(null), [1]); + const entryPagePath = '/' + __uniConfig.entryPagePath; + const routeOptions = __uniRoutes.find(route => route.path === entryPagePath); + if (!routeOptions.meta.isNVue) { // 首页是 vue + // 防止首页 webview 初始化过早, service 还未开始监听 + publishHandler(WEBVIEW_READY, Object.create(null), [1]); + } } + // 应该使用subscribe,兼容老版本先用 on api 吧 on('api.' + WEB_INVOKE_APPSERVICE$1, function (data, webviewIds) { emit('onWebInvokeAppService', data, webviewIds); @@ -12482,10 +12508,7 @@ var serviceContext = (function () { subscribe('onWxsInvokeCallMethod', onWxsInvokeCallMethod); - subscribe(VD_SYNC, onVdSync); - subscribe(VD_SYNC_CALLBACK, onVdSyncCallback); - - subscribe(INVOKE_API, onInvokeApi); + subscribe(INVOKE_API, onInvokeApi); subscribe(WEBVIEW_INSERTED, onWebviewInserted); subscribe(WEBVIEW_REMOVED, onWebviewRemoved); diff --git a/packages/uni-cli-shared/lib/pages.js b/packages/uni-cli-shared/lib/pages.js index 62add7a45f7c864cd2dd0250e56ad38cdfa2d3c0..2173e8a93daace4aeabe26eb9657b333c93e0445 100644 --- a/packages/uni-cli-shared/lib/pages.js +++ b/packages/uni-cli-shared/lib/pages.js @@ -150,7 +150,7 @@ function isValidPage (page, root = '') { process.UNI_NVUE_ENTRY[pagePath] = getNVueMainJsPath(pagePath) - if (process.env.UNI_USING_V3) { // 不移除 + if (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE) { // 不移除 page.nvue = true return true } else { @@ -214,7 +214,7 @@ function parseEntry (pagesJson) { process.UNI_NVUE_ENTRY = {} - if (process.env.UNI_USING_NATIVE) { + if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { process.UNI_NVUE_ENTRY['app-config'] = path.resolve(process.env.UNI_INPUT_DIR, 'pages.json') process.UNI_NVUE_ENTRY['app-service'] = path.resolve(process.env.UNI_INPUT_DIR, getMainEntry()) } diff --git a/packages/uni-cli-shared/lib/platform.js b/packages/uni-cli-shared/lib/platform.js index 26e1e78f12a26e7b7a66552b819990c1f4a8f209..57d2a6eebdce74a892048a03ba5ca87f8007dd7d 100644 --- a/packages/uni-cli-shared/lib/platform.js +++ b/packages/uni-cli-shared/lib/platform.js @@ -160,7 +160,11 @@ const PLATFORMS = { const files = ['hybrid/html'] let wxcomponents = [] - if (!process.env.UNI_USING_NATIVE && !process.env.UNI_USING_V3) { + if ( + !process.env.UNI_USING_NATIVE && + !process.env.UNI_USING_V3 && + !process.env.UNI_USING_V3_NATIVE + ) { wxcomponents = getCopyOptions(['wxcomponents'], { to: path.resolve(process.env.UNI_OUTPUT_TMP_DIR, 'wxcomponents') }) @@ -535,9 +539,6 @@ module.exports = { if (process.env.UNI_PLATFORM === 'h5' && vueOptions && vueOptions.runtimeCompiler) { return '@dcloudio/vue-cli-plugin-uni/packages/h5-vue/dist/vue.esm.js' } - if (process.env.UNI_PLATFORM === 'app-plus' && process.env.UNI_USING_V3) { - return '@dcloudio/uni-app-plus/dist/service.runtime.esm.js' - } if (process.env.UNI_USING_COMPONENTS) { return uniRuntime } diff --git a/packages/uni-cli-shared/template/common/__uniappsuccess.png b/packages/uni-cli-shared/template/common/__uniappsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f5bd7c5293dcc37284f30b215ff2a3779c316f Binary files /dev/null and b/packages/uni-cli-shared/template/common/__uniappsuccess.png differ diff --git a/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js b/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js index a82c9fbdacbe1a244d24214fea2c240a4981052a..2407578cda8fc6e9e6b24c76ba6209c329aac2e7 100644 --- a/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js +++ b/packages/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js @@ -45,14 +45,18 @@ const provide = { 'uniCloud': [uniCloudPath, 'default'] } -if (process.env.UNI_USING_V3 || process.env.UNI_USING_NATIVE) { +if ( + process.env.UNI_USING_V3 || + process.env.UNI_USING_NATIVE || + process.env.UNI_USING_V3_NATIVE +) { provide['uni.getCurrentSubNVue'] = [path.resolve(__dirname, '../packages/uni-app-plus-nvue/dist/get-current-sub-nvue.js'), 'default'] provide['uni.requireNativePlugin'] = [path.resolve(__dirname, '../packages/uni-app-plus-nvue/dist/require-native-plugin.js'), 'default'] } -if (!process.env.UNI_USING_V3) { +if (!process.env.UNI_USING_V3 && !process.env.UNI_USING_V3_NATIVE) { if (!process.env.UNI_USING_NATIVE) { provide['uni'] = [path.resolve(__dirname, uniPath), 'default'] } @@ -171,7 +175,7 @@ rules.unshift({ }] }) -if (process.env.UNI_USING_NATIVE) { +if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { plugins.push(new WebpackUniMPPlugin()) const array = [{ from: path.resolve(process.env.UNI_INPUT_DIR, 'static'), @@ -181,21 +185,6 @@ if (process.env.UNI_USING_NATIVE) { array.push({ from: path.resolve(getTemplatePath(), 'common'), to: process.env.UNI_OUTPUT_DIR - }, { - from: path.resolve( - process.env.UNI_HBUILDERX_PLUGINS, - 'weapp-tools/template/common' - ), - to: process.env.UNI_OUTPUT_DIR, - ignore: [ - '*.js', - '*.json', - '__uniapppicker.html', - '__uniappview.html', - '__uniappmarker@3x.png', - '__uniappopenlocation.html', - '__uniapppicker.html' - ] }) } else { let nativeTemplatePath = path.resolve(process.env.UNI_HBUILDERX_PLUGINS, 'weapp-tools/template/v8-native') diff --git a/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-nvue-plugin/index.js b/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-nvue-plugin/index.js index f364a2cfefe5a721692692601a830f46c22a4d57..75c21a3fe4519716dd442b339a89090615d8752c 100644 --- a/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-nvue-plugin/index.js +++ b/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-nvue-plugin/index.js @@ -5,7 +5,7 @@ const { class WebpackAppPlusNVuePlugin { apply(compiler) { - let isFirst = !process.env.UNI_USING_NATIVE + let isFirst = !process.env.UNI_USING_NATIVE && !process.env.UNI_USING_V3_NATIVE const chunkVersions = {} const changedFiles = [] diff --git a/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-plugin/index.js b/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-plugin/index.js index 4297c46ca0ca3ec37cbc724c854808c08fb5fca7..bde37c9392a381b48b2f6c1a4a971a199162e2a8 100644 --- a/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-plugin/index.js +++ b/packages/vue-cli-plugin-hbuilderx/packages/webpack-app-plus-plugin/index.js @@ -105,7 +105,7 @@ class WebpackAppPlusPlugin { compiler.hooks.done.tapPromise('WebpackAppPlusPlugin', compilation => { return new Promise((resolve, reject) => { - if (process.env.UNI_USING_NATIVE) { + if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { return resolve() } diff --git a/packages/vue-cli-plugin-uni/commands/build.js b/packages/vue-cli-plugin-uni/commands/build.js index 5e1950119b439d9bc658f7971eea12144e447b05..616c9c71a579548bc61e1d2d9b7d99dbd2787fcd 100644 --- a/packages/vue-cli-plugin-uni/commands/build.js +++ b/packages/vue-cli-plugin-uni/commands/build.js @@ -124,11 +124,15 @@ async function build (args, api, options) { await fs.emptyDir(targetDir) } - if (process.env.UNI_USING_NATIVE) { + if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { webpackConfigs.length = 0 } - if (process.env.UNI_USING_NATIVE || (process.UNI_NVUE_ENTRY && Object.keys(process.UNI_NVUE_ENTRY).length)) { + if ( + process.env.UNI_USING_NATIVE || + process.env.UNI_USING_V3_NATIVE || + (process.UNI_NVUE_ENTRY && Object.keys(process.UNI_NVUE_ENTRY).length) + ) { webpackConfigs.push(require('@dcloudio/vue-cli-plugin-hbuilderx/build/webpack.nvue.conf.js')(process.UNI_NVUE_ENTRY)) } diff --git a/packages/vue-cli-plugin-uni/lib/env.js b/packages/vue-cli-plugin-uni/lib/env.js index f5e8ebefe92099d78c8ffb139bb1a75f5c5c70ad..0d7245450cef29cb240ab3e987845a4880886951 100644 --- a/packages/vue-cli-plugin-uni/lib/env.js +++ b/packages/vue-cli-plugin-uni/lib/env.js @@ -172,19 +172,20 @@ if (process.env.UNI_PLATFORM === 'app-plus') { if (platformOptions.nvueCompiler === 'weex') { isNVueCompiler = false } - if (platformOptions.renderer !== 'native' && // 非 native - ( - platformOptions.compilerVersion === '3' || - platformOptions.compilerVersion === 3 - ) + if ( + platformOptions.compilerVersion === '3' || + platformOptions.compilerVersion === 3 ) { delete process.env.UNI_USING_CACHE - process.env.UNI_USING_V3 = true - platformOptions.usingComponents = true + if (platformOptions.renderer === 'native') { + process.env.UNI_USING_V3_NATIVE = true + } else { + process.env.UNI_USING_V3 = true + platformOptions.usingComponents = true + } process.env.UNI_OUTPUT_TMP_DIR = '' isNVueCompiler = true // v3 目前仅支持 uni-app 模式 - } - if (platformOptions.renderer === 'native') { + } else if (platformOptions.renderer === 'native') { // 纯原生目前不提供 cache delete process.env.UNI_USING_CACHE process.env.UNI_USING_NATIVE = true @@ -267,8 +268,8 @@ const warningMsg = const needWarning = !platformOptions.usingComponents || usingComponentsAbsent let hasNVue = false // 输出编译器版本等信息 -if (process.env.UNI_USING_NATIVE) { - console.log('当前nvue编译模式:' + (isNVueCompiler ? 'uni-app' : 'weex') + +if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { + console.log('当前nvue编译模式' + (process.env.UNI_USING_V3_NATIVE ? '(v3)' : '') + ':' + (isNVueCompiler ? 'uni-app' : 'weex') + ' 。编译模式差异见:https://ask.dcloud.net.cn/article/36074') } else if (process.env.UNI_PLATFORM !== 'h5' && process.env.UNI_PLATFORM !== 'quickapp') { try { @@ -362,7 +363,8 @@ if ( process.env.UNI_USING_CACHE && process.env.UNI_PLATFORM !== 'h5' && !process.env.UNI_USING_V3 && - !process.env.UNI_USING_NATIVE + !process.env.UNI_USING_NATIVE && + !process.env.UNI_USING_V3_NATIVE ) { // 使用 cache, 拷贝 cache 的 json const cacheJsonDir = path.resolve( process.env.UNI_CLI_CONTEXT, diff --git a/packages/webpack-uni-mp-loader/lib/plugin/index-new.js b/packages/webpack-uni-mp-loader/lib/plugin/index-new.js index 4039c497eca29c4c1459cc7370fea6892e440a34..3254d97d8d038a61fd75685d3a932288d884054b 100644 --- a/packages/webpack-uni-mp-loader/lib/plugin/index-new.js +++ b/packages/webpack-uni-mp-loader/lib/plugin/index-new.js @@ -67,7 +67,7 @@ function addSubPackagesRequire (compilation) { class WebpackUniMPPlugin { apply (compiler) { - if (!process.env.UNI_USING_NATIVE) { + if (!process.env.UNI_USING_NATIVE && !process.env.UNI_USING_V3_NATIVE) { compiler.hooks.emit.tapPromise('webpack-uni-mp-emit', compilation => { return new Promise((resolve, reject) => { addSubPackagesRequire(compilation) diff --git a/packages/webpack-uni-pages-loader/lib/index-new.js b/packages/webpack-uni-pages-loader/lib/index-new.js index b123e12355edcb9440e04a772f8f2b4e07300c22..579d863233fd748cce041715ad25bb1825d85f50 100644 --- a/packages/webpack-uni-pages-loader/lib/index-new.js +++ b/packages/webpack-uni-pages-loader/lib/index-new.js @@ -106,11 +106,11 @@ module.exports = function (content) { }) return appConfigContent } - if (process.env.UNI_USING_NATIVE) { + if (process.env.UNI_USING_NATIVE || process.env.UNI_USING_V3_NATIVE) { let appConfigContent = '' jsonFiles.forEach(jsonFile => { if (jsonFile) { - if (jsonFile.name === 'app-config.js') { + if (jsonFile.name === 'app-config.js' || jsonFile.name === 'define-pages.js') { appConfigContent = jsonFile.content } else { this.emitFile(jsonFile.name, jsonFile.content) diff --git a/packages/webpack-uni-pages-loader/lib/platforms/app-plus/app-config-service.js b/packages/webpack-uni-pages-loader/lib/platforms/app-plus/app-config-service.js index d06b2fa2de0c0843fb706956226c1273bd9de100..feb833a678cf4f2388ed2bfe759d02f754871007 100644 --- a/packages/webpack-uni-pages-loader/lib/platforms/app-plus/app-config-service.js +++ b/packages/webpack-uni-pages-loader/lib/platforms/app-plus/app-config-service.js @@ -24,20 +24,21 @@ function parseRoutes (config) { __uniRoutes.push(route) }) - return __uniRoutes + return __uniRoutes } -module.exports = function definePages (appJson) { +module.exports = function definePages (appJson) { const __uniRoutes = parseRoutes(appJson) delete appJson.page delete appJson.usingComponents delete appJson.nvueCompiler - delete appJson.renderer + // 保留renderer + // delete appJson.renderer return { name: 'app-config-service.js', content: ` -var isReady=false;var onReadyCallbacks=[]; +var isReady=false;var onReadyCallbacks=[]; var __uniConfig = ${JSON.stringify(appJson, null)}; var __uniRoutes = ${JSON.stringify(__uniRoutes)}; __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()})}}); diff --git a/packages/webpack-uni-pages-loader/lib/platforms/app-plus/index.js b/packages/webpack-uni-pages-loader/lib/platforms/app-plus/index.js index 70eb6f9e53fd9c72179a0fe0ac34a8c79a46ad98..ebed11d6bcc4262f7d44e9a513b41468c88cb608 100644 --- a/packages/webpack-uni-pages-loader/lib/platforms/app-plus/index.js +++ b/packages/webpack-uni-pages-loader/lib/platforms/app-plus/index.js @@ -55,6 +55,41 @@ function normalizeNetworkTimeout (appJson) { } } +function updateFileFlag (appJson) { + // 已经不再根据文件识别,理论可废弃此处的逻辑 + if ( + process.env.UNI_USING_V3 || + process.env.UNI_USING_V3_NATIVE + ) { + return + } + const nvueCompilerFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniappnvuecompiler.js') + const nvueCompilerExists = fs.existsSync(nvueCompilerFilePath) + + if (appJson.nvueCompiler === 'uni-app') { + if (!nvueCompilerExists) { + fsExtra.outputFile(nvueCompilerFilePath, '') + } + } else { + if (nvueCompilerExists) { + fs.unlinkSync(nvueCompilerFilePath) + } + } + + const rendererFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniapprenderer.js') + const rendererExists = fs.existsSync(rendererFilePath) + + if (appJson.renderer === 'native') { + if (!rendererExists) { + fsExtra.outputFile(rendererFilePath, '') + } + } else { + if (rendererExists) { + fs.unlinkSync(rendererFilePath) + } + } +} + module.exports = function (pagesJson, userManifestJson) { const { app @@ -239,31 +274,7 @@ module.exports = function (pagesJson, userManifestJson) { appJson.renderer = 'auto' } - const nvueCompilerFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniappnvuecompiler.js') - const nvueCompilerExists = fs.existsSync(nvueCompilerFilePath) - - if (appJson.nvueCompiler === 'uni-app') { - if (!nvueCompilerExists) { - fsExtra.outputFile(nvueCompilerFilePath, '') - } - } else { - if (nvueCompilerExists) { - fs.unlinkSync(nvueCompilerFilePath) - } - } - - const rendererFilePath = path.resolve(process.env.UNI_OUTPUT_DIR, '__uniapprenderer.js') - const rendererExists = fs.existsSync(rendererFilePath) - - if (appJson.renderer === 'native') { - if (!rendererExists) { - fsExtra.outputFile(rendererFilePath, '') - } - } else { - if (rendererExists) { - fs.unlinkSync(rendererFilePath) - } - } + updateFileFlag(appJson) appJson.splashscreen = { alwaysShowBeforeRender: false, // 是否启用白屏检测 关闭 splash @@ -321,7 +332,7 @@ module.exports = function (pagesJson, userManifestJson) { // 检查原生混淆选项 const confusion = manifestJson.plus.confusion if (confusion && confusion.resources) { - const resources = {} + const resources = {} const nvuePages = (appJson.nvue && appJson.nvue.pages) || {} for (const key in confusion.resources) { if (path.extname(key) === '.js') { // 支持 js 混淆,过滤掉 @@ -356,7 +367,10 @@ module.exports = function (pagesJson, userManifestJson) { const uniApp = require('../../../package.json')['uni-app'] manifestJson.plus['uni-app'] = uniApp // 控制页类型 - const control = process.env.UNI_USING_V3 ? 'uni-v3' : (process.env.UNI_USING_V8 ? 'v8' : 'webview') + const control = (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE) + ? 'uni-v3' + : (process.env.UNI_USING_V8 ? 'v8' : 'webview') + manifestJson.plus['uni-app'].control = control manifestJson.plus['uni-app'].nvueCompiler = appJson.nvueCompiler manifestJson.plus['uni-app'].renderer = appJson.renderer @@ -480,7 +494,7 @@ module.exports = function (pagesJson, userManifestJson) { return [manifest, parseConfig(appJson)] } - if (process.env.UNI_USING_V3) { + if (process.env.UNI_USING_V3 || process.env.UNI_USING_V3_NATIVE) { return require('./index.v3')(appJson, manifestJson, { manifest, pagesJson, diff --git a/src/platforms/app-plus/service/framework/navigator.js b/src/platforms/app-plus/service/framework/navigator.js index dbe1fb256bdb6d8ab1c54c55e58b01fa82f21868..97b617f055fefcddc67757bda42a44bb7762de26 100644 --- a/src/platforms/app-plus/service/framework/navigator.js +++ b/src/platforms/app-plus/service/framework/navigator.js @@ -6,28 +6,39 @@ import { let todoNavigator = false +function setTodoNavigator (path, callback, msg) { + todoNavigator = { + path: path, + nvue: __uniRoutes.find(route => route.path === path).meta.isNVue, + navigate: callback + } + if (process.env.NODE_ENV !== 'production') { + console.log(`todoNavigator:${todoNavigator.path} ${msg}`) + } +} + export function navigate (path, callback, isAppLaunch) { - if (__PLATFORM__ === 'app-plus') { - if (isAppLaunch && __uniConfig.splashscreen && __uniConfig.splashscreen.autoclose && (!__uniConfig.splashscreen.alwaysShowBeforeRender)) { - plus.navigator.closeSplashscreen() + if (__PLATFORM__ === 'app-plus') { + if (isAppLaunch && __uniConfig.splashscreen && __uniConfig.splashscreen.autoclose && (!__uniConfig.splashscreen.alwaysShowBeforeRender)) { + plus.navigator.closeSplashscreen() } if (!isAppLaunch && todoNavigator) { return console.error(`已存在待跳转页面${todoNavigator.path},请不要连续多次跳转页面${path}`) } + if (__uniConfig.renderer === 'native') { // 纯原生无需wait逻辑 + // 如果是首页还未初始化,需要等一等,其他无需等待 + if (getCurrentPages().length === 0) { + return setTodoNavigator(path, callback, 'waitForReady') + } + return callback() + } // 未创建 preloadWebview 或 preloadWebview 已被使用 const waitPreloadWebview = !preloadWebview || (preloadWebview && preloadWebview.__uniapp_route) // 已创建未 loaded const waitPreloadWebviewReady = preloadWebview && !preloadWebview.loaded if (waitPreloadWebview || waitPreloadWebviewReady) { - todoNavigator = { - path: path, - nvue: __uniRoutes.find(route => route.path === path).meta.isNVue, - navigate: callback - } - if (process.env.NODE_ENV !== 'production') { - console.log(`todoNavigator:${todoNavigator.path} ${waitPreloadWebview ? 'waitForCreate' : 'waitForReady'}`) - } + setTodoNavigator(path, callback, waitPreloadWebview ? 'waitForCreate' : 'waitForReady') } else { callback() } @@ -53,6 +64,15 @@ function todoNavigate () { export function navigateFinish () { if (__PLATFORM__ === 'app-plus') { + if (__uniConfig.renderer === 'native') { + if (!todoNavigator) { + return + } + if (todoNavigator.nvue) { + return todoNavigate() + } + return + } // 创建预加载 const preloadWebview = createPreloadWebview() if (process.env.NODE_ENV !== 'production') { diff --git a/src/platforms/app-plus/service/framework/page.js b/src/platforms/app-plus/service/framework/page.js index 7f87c32945c62f670563ebfc8040f993e8bdf3fa..ab260cca337b77d003d27ff6cd4df78c4255fbe5 100644 --- a/src/platforms/app-plus/service/framework/page.js +++ b/src/platforms/app-plus/service/framework/page.js @@ -61,7 +61,7 @@ export function registerPage ({ } if (process.env.NODE_ENV !== 'production') { - console.log(`[uni-app] registerPage`, path, webview.id) + console.log(`[uni-app] registerPage(${path},${webview.id})`) } initWebview(webview, routeOptions, path, query) diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers/index.js b/src/platforms/app-plus/service/framework/subscribe-handlers/index.js index 346dac65afae7471a65c6113c29ef3324da6404a..6181369ab985db6c7df119c242e3ad0353f7b9b1 100644 --- a/src/platforms/app-plus/service/framework/subscribe-handlers/index.js +++ b/src/platforms/app-plus/service/framework/subscribe-handlers/index.js @@ -5,8 +5,8 @@ import { VD_SYNC_CALLBACK, INVOKE_API, WEBVIEW_READY, - WEB_INVOKE_APPSERVICE, - WEBVIEW_INSERTED, + WEB_INVOKE_APPSERVICE, + WEBVIEW_INSERTED, WEBVIEW_REMOVED } from '../../../constants' @@ -21,11 +21,11 @@ import onVdSyncCallback from './on-vd-sync-callback' import onInvokeApi from './on-invoke-api' import onWxsInvokeCallMethod from './on-wxs-invoke-call-method' - -import { - onWebviewInserted, - onWebviewRemoved -} from './on-webview-lifecycle' + +import { + onWebviewInserted, + onWebviewRemoved +} from './on-webview-lifecycle' export function initSubscribeHandlers () { const { @@ -45,14 +45,20 @@ export function initSubscribeHandlers () { subscribeHandler(data.type, data.data, data.pageId) }) - subscribe(WEBVIEW_READY, onWebviewReady) + if (__uniConfig.renderer !== 'native') { + subscribe(WEBVIEW_READY, onWebviewReady) + + subscribe(VD_SYNC, onVdSync) + subscribe(VD_SYNC_CALLBACK, onVdSyncCallback) - const entryPagePath = '/' + __uniConfig.entryPagePath - const routeOptions = __uniRoutes.find(route => route.path === entryPagePath) - if (!routeOptions.meta.isNVue) { // 首页是 vue - // 防止首页 webview 初始化过早, service 还未开始监听 - publishHandler(WEBVIEW_READY, Object.create(null), [1]) + const entryPagePath = '/' + __uniConfig.entryPagePath + const routeOptions = __uniRoutes.find(route => route.path === entryPagePath) + if (!routeOptions.meta.isNVue) { // 首页是 vue + // 防止首页 webview 初始化过早, service 还未开始监听 + publishHandler(WEBVIEW_READY, Object.create(null), [1]) + } } + // 应该使用subscribe,兼容老版本先用 on api 吧 on('api.' + WEB_INVOKE_APPSERVICE, function (data, webviewIds) { emit('onWebInvokeAppService', data, webviewIds) @@ -60,10 +66,7 @@ export function initSubscribeHandlers () { subscribe('onWxsInvokeCallMethod', onWxsInvokeCallMethod) - subscribe(VD_SYNC, onVdSync) - subscribe(VD_SYNC_CALLBACK, onVdSyncCallback) - - subscribe(INVOKE_API, onInvokeApi) + subscribe(INVOKE_API, onInvokeApi) subscribe(WEBVIEW_INSERTED, onWebviewInserted) subscribe(WEBVIEW_REMOVED, onWebviewRemoved)