diff --git a/.changeset/good-onions-go.md b/.changeset/good-onions-go.md new file mode 100644 index 0000000000..96a492626c --- /dev/null +++ b/.changeset/good-onions-go.md @@ -0,0 +1,7 @@ +--- +"@lynx-js/web-core": patch +--- + +feat: remove multi-thread mts heating + +The default rendering mode is "all-on-ui". Therefore the preheating for "multi-thread" will be removed. diff --git a/packages/web-platform/web-core/src/uiThread/bootWorkers.ts b/packages/web-platform/web-core/src/uiThread/bootWorkers.ts index 8e897cbec3..f36707d366 100644 --- a/packages/web-platform/web-core/src/uiThread/bootWorkers.ts +++ b/packages/web-platform/web-core/src/uiThread/bootWorkers.ts @@ -14,7 +14,6 @@ interface LynxViewRpc { const backgroundWorkerContextCount: number[] = []; const contextIdToBackgroundWorker: (Worker | undefined)[] = []; -let preHeatedMainWorker = createMainWorker(); export function bootWorkers( lynxGroupId: number | undefined, allOnUI?: boolean, @@ -27,8 +26,7 @@ export function bootWorkers( if (allOnUI) { curMainWorker = createUIChannel(); } else { - curMainWorker = preHeatedMainWorker; - preHeatedMainWorker = createMainWorker(); + curMainWorker = createMainWorker(); } const curBackgroundWorker = createBackgroundWorker( lynxGroupId, @@ -124,6 +122,10 @@ function createBackgroundWorker( function createWebWorker(name: string): Worker { return new Worker( + /* webpackFetchPriority: "high" */ + /* webpackChunkName: "web-core-worker-runtime" */ + /* webpackPrefetch: true */ + /* webpackPreload: true */ new URL('@lynx-js/web-worker-runtime', import.meta.url), { type: 'module', diff --git a/packages/web-platform/web-core/src/uiThread/createRenderAllOnUI.ts b/packages/web-platform/web-core/src/uiThread/createRenderAllOnUI.ts index 5d87e5267a..32c6a5e228 100644 --- a/packages/web-platform/web-core/src/uiThread/createRenderAllOnUI.ts +++ b/packages/web-platform/web-core/src/uiThread/createRenderAllOnUI.ts @@ -22,7 +22,14 @@ import { createExposureMonitor } from './crossThreadHandlers/createExposureMonit const { prepareMainThreadAPIs, -} = await import('@lynx-js/web-mainthread-apis'); +} = await import( + /* webpackChunkName: "web-core-main-thread-apis" */ + /* webpackMode: "lazy-once" */ + /* webpackPreload: true */ + /* webpackPrefetch: true */ + /* webpackFetchPriority: "high" */ + '@lynx-js/web-mainthread-apis' +); export function createRenderAllOnUI( mainToBackgroundRpc: Rpc, diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts index 6cbf6e2646..65766033a0 100644 --- a/packages/web-platform/web-tests/tests/react.spec.ts +++ b/packages/web-platform/web-tests/tests/react.spec.ts @@ -720,7 +720,7 @@ test.describe('reactlynx3 tests', () => { }); await wait(50); expect(message).toContain('fin'); - expect(page.workers().length).toStrictEqual(1); + expect(page.workers().length).toStrictEqual(0); }); test('api-error', async ({ page }, { title }) => { @@ -886,43 +886,6 @@ test.describe('reactlynx3 tests', () => { await expect(offset).toBe(true); }); - test('api-preheat', async ({ page }, { title }) => { - await goto(page, title); - const target = page.locator('#target'); - await expect(target).toHaveCSS('background-color', 'rgb(255, 192, 203)'); // pink - expect(page.workers().length).toStrictEqual(ENABLE_MULTI_THREAD ? 3 : 2); - }); - - test('api-preheat-at-least-one', async ({ page }, { title }) => { - await goto(page, title); - const target = page.locator('#target'); - await expect(target).toHaveCSS('background-color', 'rgb(255, 192, 203)'); // pink - expect(page.workers().length).toBe(ENABLE_MULTI_THREAD ? 3 : 2); - await page.evaluate(() => { - document.body.querySelector('lynx-view')?.remove(); - }); - await wait(100); - const threadStrategy = ENABLE_MULTI_THREAD ? 'multi-thread' : 'all-on-ui'; - expect(page.workers().length).toBe(1); - await page.evaluate((threadStrategy) => { - const newView = document.createElement('lynx-view'); - newView.setAttribute('style', 'height:50vh; width:100vw;'); - newView.setAttribute('thread-strategy', threadStrategy); - newView.setAttribute('url', '/dist/api-preheat/main-thread.js'); - document.body.append(newView); - }, threadStrategy); - - await page.evaluate((threadStrategy) => { - const newView = document.createElement('lynx-view'); - newView.setAttribute('style', 'height:50vh; width:100vw;'); - newView.setAttribute('thread-strategy', threadStrategy); - newView.setAttribute('url', '/dist/api-preheat/main-thread.js'); - document.body.append(newView); - }, threadStrategy); - await wait(500); - expect(page.workers().length).toBe(ENABLE_MULTI_THREAD ? 5 : 3); - }); - test('api-setSharedData', async ({ page }, { title }) => { await goto(page, title); await wait(100); @@ -945,23 +908,23 @@ test.describe('reactlynx3 tests', () => { test('api-shared-context-worker-count', async ({ page }) => { await goto(page, 'api-setSharedData', 'api-getSharedData'); await wait(100); - expect(page.workers().length).toBeLessThanOrEqual(4); + expect(page.workers().length).toBeLessThanOrEqual(3); }); test('api-shared-context-worker-count-release', async ({ page }) => { await goto(page, 'api-setSharedData', 'api-getSharedData'); await wait(100); - expect(page.workers().length).toBeLessThanOrEqual(4); + expect(page.workers().length).toBeLessThanOrEqual(3); await page.evaluate(() => document.body.querySelector('lynx-view')?.remove() ); await wait(100); - expect(page.workers().length).toBeLessThanOrEqual(3); + expect(page.workers().length).toBeLessThanOrEqual(2); await page.evaluate(() => document.body.querySelector('lynx-view')?.remove() ); await wait(100); - expect(page.workers().length).toBeLessThanOrEqual(1); + expect(page.workers().length).toBeLessThanOrEqual(0); }); test.describe('api-exposure', () => { diff --git a/packages/web-platform/web-tests/tests/react/api-preheat-at-least-one/index.jsx b/packages/web-platform/web-tests/tests/react/api-preheat-at-least-one/index.jsx deleted file mode 100644 index 686e3df09f..0000000000 --- a/packages/web-platform/web-tests/tests/react/api-preheat-at-least-one/index.jsx +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import { root, useEffect } from '@lynx-js/react'; - -function App() { - useEffect(() => { - return () => { - console.log('fin'); - }; - }, []); - return ( - - ); -} - -root.render(); diff --git a/packages/web-platform/web-tests/tests/react/api-preheat/index.jsx b/packages/web-platform/web-tests/tests/react/api-preheat/index.jsx deleted file mode 100644 index 686e3df09f..0000000000 --- a/packages/web-platform/web-tests/tests/react/api-preheat/index.jsx +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import { root, useEffect } from '@lynx-js/react'; - -function App() { - useEffect(() => { - return () => { - console.log('fin'); - }; - }, []); - return ( - - ); -} - -root.render(); diff --git a/packages/web-platform/web-worker-runtime/src/index.ts b/packages/web-platform/web-worker-runtime/src/index.ts index e2f7f55c31..b6b970da23 100644 --- a/packages/web-platform/web-worker-runtime/src/index.ts +++ b/packages/web-platform/web-worker-runtime/src/index.ts @@ -3,7 +3,6 @@ // LICENSE file in the root directory of this source tree. import { startBackgroundThread } from './backgroundThread/index.js'; -import { startMainThreadWorker } from './mainThread/startMainThread.js'; export interface WorkerStartMessage { mode: 'main' | 'background'; @@ -11,10 +10,16 @@ export interface WorkerStartMessage { toUIThread: MessagePort; } -globalThis.onmessage = (ev) => { +globalThis.onmessage = async (ev) => { const { mode, toPeerThread, toUIThread } = ev .data as WorkerStartMessage; if (mode === 'main') { + const { startMainThreadWorker } = await import( + /* webpackChunkName: "web-worker-runtime-main-thread" */ + /* webpackMode: "lazy-once" */ + /* webpackPreload: true */ + './mainThread/startMainThread.js' + ); startMainThreadWorker(toUIThread, toPeerThread); } else { startBackgroundThread(toUIThread, toPeerThread); diff --git a/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts b/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts index d3371b7ea7..c20bd4350b 100644 --- a/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts +++ b/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts @@ -23,13 +23,18 @@ import { OffscreenDocument } from '@lynx-js/offscreen-document/webworker'; import { _onEvent } from '@lynx-js/offscreen-document/webworker'; import { registerUpdateDataHandler } from './crossThreadHandlers/registerUpdateDataHandler.js'; +const { prepareMainThreadAPIs } = await import( + /* webpackChunkName: "web-core-main-thread-apis" */ + /* webpackMode: "lazy-once" */ + /* webpackPreload: true */ + /* webpackPrefetch: true */ + /* webpackFetchPriority: "high" */ + '@lynx-js/web-mainthread-apis' +); export async function startMainThreadWorker( uiThreadPort: MessagePort, backgroundThreadPort: MessagePort, ) { - const { prepareMainThreadAPIs } = await import( - '@lynx-js/web-mainthread-apis' - ); const uiThreadRpc = new Rpc(uiThreadPort, 'main-to-ui'); const backgroundThreadRpc = new Rpc(backgroundThreadPort, 'main-to-bg'); const { markTimingInternal, flushMarkTimingInternal } =