From a85a6788656d5e55ba7afc392f7a0dafe3289f85 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 24 Oct 2019 14:30:29 +0800 Subject: [PATCH] refactor(v3): subscribe-handlers --- packages/uni-app-plus/dist/index.v3.js | 27 ++++-- .../lib/platforms/app-plus/index.js | 3 +- .../app-plus/service/framework/navigator.js | 3 + .../service/framework/plugins/vdom-sync.js | 9 +- .../service/framework/subscribe-handlers.js | 96 ------------------- .../framework/subscribe-handlers/index.js | 30 ++++++ .../subscribe-handlers/on-vd-sync-callback.js | 9 ++ .../subscribe-handlers/on-vd-sync.js | 23 +++++ .../subscribe-handlers/on-webview-ready.js | 39 ++++++++ .../service/framework/webview/index.js | 5 +- 10 files changed, 134 insertions(+), 110 deletions(-) delete mode 100644 src/platforms/app-plus/service/framework/subscribe-handlers.js create mode 100644 src/platforms/app-plus/service/framework/subscribe-handlers/index.js create mode 100644 src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync-callback.js create mode 100644 src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync.js create mode 100644 src/platforms/app-plus/service/framework/subscribe-handlers/on-webview-ready.js diff --git a/packages/uni-app-plus/dist/index.v3.js b/packages/uni-app-plus/dist/index.v3.js index 2b2931bfa..6ecc0301b 100644 --- a/packages/uni-app-plus/dist/index.v3.js +++ b/packages/uni-app-plus/dist/index.v3.js @@ -6246,7 +6246,10 @@ var serviceContext = (function () { function createPreloadWebview () { if (!preloadWebview || preloadWebview.__uniapp_route) { // 不存在,或已被使用 - preloadWebview = plus.webview.create(VIEW_WEBVIEW_PATH, String(id++)); + preloadWebview = plus.webview.create(VIEW_WEBVIEW_PATH, String(id++)); + if (process.env.NODE_ENV !== 'production') { + console.log(`[uni-app] preloadWebview[${preloadWebview.id}]`); + } } return preloadWebview } @@ -6311,6 +6314,9 @@ var serviceContext = (function () { { // 创建预加载 const preloadWebview = createPreloadWebview(); + if (process.env.NODE_ENV !== 'production') { + console.log(`navigateFinish.preloadWebview:${preloadWebview.id}`); + } if (!todoNavigator) { return } @@ -8730,6 +8736,9 @@ var serviceContext = (function () { } function onWebviewReady (data, pageId) { + if (process.env.NODE_ENV !== 'production') { + console.log('[uni-app] onWebviewReady.preloadWebview' + (preloadWebview && preloadWebview.id)); + } const isLaunchWebview = pageId === '1'; if (isLaunchWebview) { // 首页 setPreloadWebview(plus.webview.getLaunchWebview()); @@ -8737,7 +8746,7 @@ var serviceContext = (function () { setPreloadWebview(plus.webview.getWebviewById(pageId)); } if (preloadWebview.id !== pageId) { - return console.error(`webview[${pageId}] not found`) + return console.error(`webviewReady[${preloadWebview.id}][${pageId}] not match`) } preloadWebview.loaded = true; // 标记已 ready @@ -8754,8 +8763,8 @@ var serviceContext = (function () { }) } } - } - + } + const vdSyncHandlers = Object.create(null); function registerVdSync (pageId, callback) { @@ -8778,8 +8787,8 @@ var serviceContext = (function () { } else { console.error(`vdSync[${pageId}] not found`); } - } - + } + const vdSyncCallbacks = []; // 数据同步 callback function onVdSyncCallback () { @@ -8788,8 +8797,8 @@ var serviceContext = (function () { for (let i = 0; i < copies.length; i++) { copies[i](); } - } - + } + function initSubscribeHandlers () { const { subscribe, @@ -9001,7 +9010,7 @@ var serviceContext = (function () { const handleVdData = { [UI_EVENT]: function onUIEvent (vdBatchEvent, vd) { - vdBatchEvent.forEach(([cid, nid, event]) => { + vdBatchEvent.forEach(([cid, nid, event]) => { nid = String(nid); console.log(`[EVENT]`, cid, nid, event); event.preventDefault = noop; 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 40d8ee95c..ec34f90bf 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 @@ -339,7 +339,8 @@ module.exports = function (pagesJson, userManifestJson) { const uniApp = require('../../../package.json')['uni-app'] manifestJson.plus['uni-app'] = uniApp // 控制页类型 - manifestJson.plus['uni-app'].control = process.env.UNI_USING_V8 ? 'v8' : 'webview' + const control = process.env.UNI_USING_V3 ? '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 if (flexDir) { diff --git a/src/platforms/app-plus/service/framework/navigator.js b/src/platforms/app-plus/service/framework/navigator.js index 675e08ab1..8a5785ad5 100644 --- a/src/platforms/app-plus/service/framework/navigator.js +++ b/src/platforms/app-plus/service/framework/navigator.js @@ -52,6 +52,9 @@ export function navigateFinish () { if (__PLATFORM__ === 'app-plus') { // 创建预加载 const preloadWebview = createPreloadWebview() + if (process.env.NODE_ENV !== 'production') { + console.log(`navigateFinish.preloadWebview:${preloadWebview.id}`) + } if (!todoNavigator) { return } diff --git a/src/platforms/app-plus/service/framework/plugins/vdom-sync.js b/src/platforms/app-plus/service/framework/plugins/vdom-sync.js index 06a053eda..98f2ad9e6 100644 --- a/src/platforms/app-plus/service/framework/plugins/vdom-sync.js +++ b/src/platforms/app-plus/service/framework/plugins/vdom-sync.js @@ -10,14 +10,17 @@ import { } from '../../../constants' import { - vdSyncCallbacks, removeVdSync, registerVdSync -} from '../subscribe-handlers' +} from '../subscribe-handlers/on-vd-sync' + +import { + vdSyncCallbacks +} from '../subscribe-handlers/on-vd-sync-callback' const handleVdData = { [UI_EVENT]: function onUIEvent (vdBatchEvent, vd) { - vdBatchEvent.forEach(([cid, nid, event]) => { + vdBatchEvent.forEach(([cid, nid, event]) => { nid = String(nid) console.log(`[EVENT]`, cid, nid, event) event.preventDefault = noop diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers.js b/src/platforms/app-plus/service/framework/subscribe-handlers.js deleted file mode 100644 index 2a209be22..000000000 --- a/src/platforms/app-plus/service/framework/subscribe-handlers.js +++ /dev/null @@ -1,96 +0,0 @@ -import { - VD_SYNC, - VD_SYNC_CALLBACK, - WEBVIEW_READY -} from '../../constants' - -import { - preloadWebview, - setPreloadWebview, - consumeWebviewReady -} from './webview' - -import { - registerPlusMessage -} from './plus-message' - -import { - perf -} from './perf' - -function onWebviewReady (data, pageId) { - const isLaunchWebview = pageId === '1' - if (isLaunchWebview) { // 首页 - setPreloadWebview(plus.webview.getLaunchWebview()) - } else if (!preloadWebview) { // preloadWebview 不存在,重新加载一下 - setPreloadWebview(plus.webview.getWebviewById(pageId)) - } - if (preloadWebview.id !== pageId) { - return console.error(`webview[${pageId}] not found`) - } - preloadWebview.loaded = true // 标记已 ready - - consumeWebviewReady(pageId) - - if (isLaunchWebview) { - const entryPagePath = '/' + __uniConfig.entryPagePath - const routeOptions = __uniRoutes.find(route => route.path === entryPagePath) - if (!routeOptions.meta.isNVue) { // 非 nvue 首页,需要主动跳转 - const navigateType = routeOptions.meta.isTabBar ? 'switchTab' : 'navigateTo' - process.env.NODE_ENV !== 'production' && perf(`${entryPagePath} navigateTo`) - return uni[navigateType]({ - url: entryPagePath - }) - } - } -} - -const vdSyncHandlers = Object.create(null) - -export function registerVdSync (pageId, callback) { - (vdSyncHandlers[pageId] || (vdSyncHandlers[pageId] = [])).push(callback) -} - -export function removeVdSync (pageId) { - delete vdSyncHandlers[pageId] -} - -function onVdSync ({ - data, - options -}, pageId) { - const handlers = vdSyncHandlers[pageId] - if (Array.isArray(handlers)) { - handlers.forEach(handler => { - handler(data) - }) - } else { - console.error(`vdSync[${pageId}] not found`) - } -} - -export const vdSyncCallbacks = [] // 数据同步 callback - -function onVdSyncCallback () { - const copies = vdSyncCallbacks.slice(0) - vdSyncCallbacks.length = 0 - for (let i = 0; i < copies.length; i++) { - copies[i]() - } -} - -export function initSubscribeHandlers () { - const { - subscribe, - subscribeHandler - } = UniServiceJSBridge - - registerPlusMessage('subscribeHandler', (data) => { - subscribeHandler(data.type, data.data, data.pageId) - }) - // TODO 检测目标 preloadWebview 是否已准备好,因为 preloadWebview 准备好时,此处代码还没执行 - subscribe(WEBVIEW_READY, onWebviewReady) - - subscribe(VD_SYNC, onVdSync) - subscribe(VD_SYNC_CALLBACK, onVdSyncCallback) -} diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers/index.js b/src/platforms/app-plus/service/framework/subscribe-handlers/index.js new file mode 100644 index 000000000..a09e29670 --- /dev/null +++ b/src/platforms/app-plus/service/framework/subscribe-handlers/index.js @@ -0,0 +1,30 @@ +import { + VD_SYNC, + VD_SYNC_CALLBACK, + WEBVIEW_READY +} from '../../../constants' + +import { + registerPlusMessage +} from '../plus-message' + +import onWebviewReady from './on-webview-ready' + +import onVdSync from './on-vd-sync' +import onVdSyncCallback from './on-vd-sync-callback' + +export function initSubscribeHandlers () { + const { + subscribe, + subscribeHandler + } = UniServiceJSBridge + + registerPlusMessage('subscribeHandler', (data) => { + subscribeHandler(data.type, data.data, data.pageId) + }) + // TODO 检测目标 preloadWebview 是否已准备好,因为 preloadWebview 准备好时,此处代码还没执行 + subscribe(WEBVIEW_READY, onWebviewReady) + + subscribe(VD_SYNC, onVdSync) + subscribe(VD_SYNC_CALLBACK, onVdSyncCallback) +} diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync-callback.js b/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync-callback.js new file mode 100644 index 000000000..9261ac264 --- /dev/null +++ b/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync-callback.js @@ -0,0 +1,9 @@ +export const vdSyncCallbacks = [] // 数据同步 callback + +export default function onVdSyncCallback () { + const copies = vdSyncCallbacks.slice(0) + vdSyncCallbacks.length = 0 + for (let i = 0; i < copies.length; i++) { + copies[i]() + } +} diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync.js b/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync.js new file mode 100644 index 000000000..af5cdb39a --- /dev/null +++ b/src/platforms/app-plus/service/framework/subscribe-handlers/on-vd-sync.js @@ -0,0 +1,23 @@ +const vdSyncHandlers = Object.create(null) + +export function registerVdSync (pageId, callback) { + (vdSyncHandlers[pageId] || (vdSyncHandlers[pageId] = [])).push(callback) +} + +export function removeVdSync (pageId) { + delete vdSyncHandlers[pageId] +} + +export default function onVdSync ({ + data, + options +}, pageId) { + const handlers = vdSyncHandlers[pageId] + if (Array.isArray(handlers)) { + handlers.forEach(handler => { + handler(data) + }) + } else { + console.error(`vdSync[${pageId}] not found`) + } +} diff --git a/src/platforms/app-plus/service/framework/subscribe-handlers/on-webview-ready.js b/src/platforms/app-plus/service/framework/subscribe-handlers/on-webview-ready.js new file mode 100644 index 000000000..8e2eb763d --- /dev/null +++ b/src/platforms/app-plus/service/framework/subscribe-handlers/on-webview-ready.js @@ -0,0 +1,39 @@ +import { + preloadWebview, + setPreloadWebview, + consumeWebviewReady +} from '../webview' + +import { + perf +} from '../perf' + +export default function onWebviewReady (data, pageId) { + if (process.env.NODE_ENV !== 'production') { + console.log('[uni-app] onWebviewReady.preloadWebview' + (preloadWebview && preloadWebview.id)) + } + const isLaunchWebview = pageId === '1' + if (isLaunchWebview) { // 首页 + setPreloadWebview(plus.webview.getLaunchWebview()) + } else if (!preloadWebview) { // preloadWebview 不存在,重新加载一下 + setPreloadWebview(plus.webview.getWebviewById(pageId)) + } + if (preloadWebview.id !== pageId) { + return console.error(`webviewReady[${preloadWebview.id}][${pageId}] not match`) + } + preloadWebview.loaded = true // 标记已 ready + + consumeWebviewReady(pageId) + + if (isLaunchWebview) { + const entryPagePath = '/' + __uniConfig.entryPagePath + const routeOptions = __uniRoutes.find(route => route.path === entryPagePath) + if (!routeOptions.meta.isNVue) { // 非 nvue 首页,需要主动跳转 + const navigateType = routeOptions.meta.isTabBar ? 'switchTab' : 'navigateTo' + process.env.NODE_ENV !== 'production' && perf(`${entryPagePath} navigateTo`) + return uni[navigateType]({ + url: entryPagePath + }) + } + } +} diff --git a/src/platforms/app-plus/service/framework/webview/index.js b/src/platforms/app-plus/service/framework/webview/index.js index b0cbf2b75..6bb382096 100644 --- a/src/platforms/app-plus/service/framework/webview/index.js +++ b/src/platforms/app-plus/service/framework/webview/index.js @@ -102,7 +102,10 @@ export function initWebview (webview, routeOptions) { export function createPreloadWebview () { if (!preloadWebview || preloadWebview.__uniapp_route) { // 不存在,或已被使用 - preloadWebview = plus.webview.create(VIEW_WEBVIEW_PATH, String(id++)) + preloadWebview = plus.webview.create(VIEW_WEBVIEW_PATH, String(id++)) + if (process.env.NODE_ENV !== 'production') { + console.log(`[uni-app] preloadWebview[${preloadWebview.id}]`) + } } return preloadWebview } -- GitLab