From 102795036122dd2733c37a6b7932db5b891eb00c Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Fri, 20 Mar 2020 14:50:47 +0800 Subject: [PATCH] feat(v3): init native mode --- packages/uni-app-plus/dist/index.v3.js | 67 +++++++++++------ packages/uni-cli-shared/lib/pages.js | 4 +- packages/uni-cli-shared/lib/platform.js | 9 ++- .../template/common/__uniappsuccess.png | Bin 0 -> 2021 bytes .../build/webpack.nvue.conf.js | 25 ++----- .../webpack-app-plus-nvue-plugin/index.js | 2 +- .../packages/webpack-app-plus-plugin/index.js | 2 +- packages/vue-cli-plugin-uni/commands/build.js | 8 +- packages/vue-cli-plugin-uni/lib/env.js | 26 ++++--- .../lib/plugin/index-new.js | 2 +- .../webpack-uni-pages-loader/lib/index-new.js | 4 +- .../platforms/app-plus/app-config-service.js | 9 ++- .../lib/platforms/app-plus/index.js | 70 +++++++++++------- .../app-plus/service/framework/navigator.js | 42 ++++++++--- .../app-plus/service/framework/page.js | 2 +- .../framework/subscribe-handlers/index.js | 37 ++++----- 16 files changed, 183 insertions(+), 126 deletions(-) create mode 100644 packages/uni-cli-shared/template/common/__uniappsuccess.png diff --git a/packages/uni-app-plus/dist/index.v3.js b/packages/uni-app-plus/dist/index.v3.js index e23015077..c302d93fe 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 62add7a45..2173e8a93 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 26e1e78f1..57d2a6eeb 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 GIT binary patch literal 2021 zcma)7eK^x=A72+`^OkKEQTWYFlb05qPGRvo!@P{AZ4rsi#PMX`})4zpZoj$T-W{mX8$YD z$3WLi7Y2hF_)^F;%~`R!;OjKI`&ReYFqqC=U$Q6T)awsL2VytvGkt#34vS^CaX2By zU!LB60M@{nNJ2(I##{v@t`wYo%DIgpUOXi*2L7&4%bCRWH#lL<#($tnIrs0AdJkC| zW3M&dh?kyh7?2&wpZPlBHh#Rpwc%J-;XvW=`YaMI+Ie_sE?l)VCd*i>N#Xw$uV^Oo zAIZSL0BP6B&d$zs!nco?%UqnD8~*&+E!bV_nQrUzjE<^0Fxl zus$tw^bH>`Y1Z%>I-MRu^W4_n)6+8`KR7k(N?w^V+NT|*J#YEs1A`J5%0Hp+XY&+Z zJT`;_FR2k+$6wqFwCSVIzmlbXAh46>yDdYizI$BUfXJMz$mg0KJb?ssmLV&gX=zwZ z1Rh+8^^kTl&?tIs|ItLu9S=&9dubX4x@&`>g$+0`(D`y}Y|Df>3;>A9Xi_4?I?n;I z@%LZ%X*35&;pYV)i|{NJvc7}^$`RC~e1s*WU8ZknSX_V`c}13fU|@E8qe=4JXLGq+ zgj=_m7$>pCDGjT1ecSW0(IhG~Sz6zNJZLeRzIqDAT^cPfy_3T1gXx|BM|$ zqf&NiJlcqoy|2KD8eElLQ9x`Cj%9=j_zh7K!g@9y7zanx5euggdV=m$`j70)7f=vI z+VWrHE;l!pAtvh~`i22knX?v{2XL)ein{sj0gueX)^v8}yVdYzP58DV4aTnByH8u} z%ldxQrwmcTC%~*8NE9$ zWQnLN6`?Wa~NMMBV>SjkxQFxKv{C_I8JD0O&%A^|`i7Dr~r$4}^*BTDXZw&+hfU}_CsL&K%Few1B>HpIXct=oZ@PZwQh`HZWy7P0DP%ybKH_~mfL zfk&IabdfC|)@$fREHr&*C$hW!W%Lp!^QmZ;5$mzV0)L>w=LQN0QLYRMx574XLayk|?T<)M*^Qtd2PtA* zKH8H_aJFABw+U7B#J!&wPRLOU6GVwbccZ?%|A2+o=5Bw_ir^p-MGc)P0uh4oiJaV_ z$R9F``Y@M{q?euRfP&CK$c9hXvW%B@_;{@d2e+SnFh3o)cWdoEaD{J^RF5hhCB9qN zfAWPva`hQ?BQm8g<91m`uH#QvKZUwBG!yw62#RzaSWHk6FECdo(%y7#+|<=P&iAlV z#s}yln@z`g9YVjb3fuamkDijT(W}rcPw5=9IH{R6*CwFz9sTOA_dwl2aR`DNJ1wzC zColY>pxR#^rYMp??V8`k66*t_7k8=D*mu;Z!DXYS{8daWFu zg|mhiIuUJYsAFV2t|NbG*;B%w~YK@z>yEk-Y{UUuN_dmQ$CmUVbu?EUR-;rKF!Dv|VJ?AM7Zbw>;thwlP!olCy7b zYxv0S%%O7sZ=vGj23tFLGZE=kw0_}RwW1sLG)XJGiD%Y7Us}jLunlM9BFy9c1P_(u z{LBvh;rT1@NE>^SEvg@9a=6PpE|usGL3gu7Rk0dE`eeN3YS9G_5wOPUdFX%^UX*)Tl}|?50x;OFpp9V| zo#Uqi2y*O=*zgg&Zg+@EhkppBn!bq8UF?Z$djA^ literal 0 HcmV?d00001 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 a82c9fbda..2407578cd 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 f364a2cfe..75c21a3fe 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 4297c46ca..bde37c939 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 5e1950119..616c9c71a 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 f5e8ebefe..0d7245450 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 4039c497e..3254d97d8 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 b123e1235..579d86323 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 d06b2fa2d..feb833a67 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 70eb6f9e5..ebed11d6b 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 dbe1fb256..97b617f05 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 7f87c3294..ab260cca3 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 346dac65a..6181369ab 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) -- GitLab