From 6bb0e4688f5f4b3513cd2a228fd0d17e70dc73ab Mon Sep 17 00:00:00 2001 From: GiveMe-A-Name Date: Wed, 6 Sep 2023 15:07:47 +0800 Subject: [PATCH] fix: lazy import preload, then update include.type to include.as --- .changeset/blue-pears-allow.md | 7 ++++ .../server/core/src/types/config/server.ts | 5 ++- .../src/libs/preload/flushServerHeader.ts | 35 ------------------ .../libs/preload/shouldFlushServerHeader.ts | 36 +++++++++++++++++++ .../src/libs/preload/transformLinks2String.ts | 4 +-- .../prod-server/src/libs/render/index.ts | 4 ++- .../server/prod-server/tests/preload.test.ts | 8 ++--- .../ssr/fixtures/preload/modern.config.ts | 9 ++++- .../tests/__snapshots__/preload.test.ts.snap | 1 + 9 files changed, 63 insertions(+), 46 deletions(-) create mode 100644 .changeset/blue-pears-allow.md create mode 100644 packages/server/prod-server/src/libs/preload/shouldFlushServerHeader.ts diff --git a/.changeset/blue-pears-allow.md b/.changeset/blue-pears-allow.md new file mode 100644 index 000000000000..b9143765b735 --- /dev/null +++ b/.changeset/blue-pears-allow.md @@ -0,0 +1,7 @@ +--- +'@modern-js/prod-server': patch +'@modern-js/server-core': patch +--- + +fix: lazy import preload, then update include.type to include.as +fix: 动态加载 preload 功能, 对齐规范将 include.type 属性更新为 include.as diff --git a/packages/server/core/src/types/config/server.ts b/packages/server/core/src/types/config/server.ts index fe54ce61d70c..0948082aa055 100644 --- a/packages/server/core/src/types/config/server.ts +++ b/packages/server/core/src/types/config/server.ts @@ -11,9 +11,8 @@ type Route = }; export type Routes = Record; -type PreloadInclude = Array< - string | { url: string; type?: string; rel?: string } ->; +type PreloadLink = { url: string; as?: string; rel?: string }; +type PreloadInclude = Array; interface PreloadAttributes { script?: Record; style?: Record; diff --git a/packages/server/prod-server/src/libs/preload/flushServerHeader.ts b/packages/server/prod-server/src/libs/preload/flushServerHeader.ts index 99d52eed2c7f..84c769a54ae6 100644 --- a/packages/server/prod-server/src/libs/preload/flushServerHeader.ts +++ b/packages/server/prod-server/src/libs/preload/flushServerHeader.ts @@ -4,41 +4,6 @@ import { ModernServerContext } from '@modern-js/types'; import { parseLinks } from './parseLinks'; import { transformLinks2String } from './transformLinks2String'; -export function transformToRegExp(input: string | RegExp): RegExp { - if (typeof input === 'string') { - return new RegExp(input); - } - return input; -} - -export function shouldFlushServerHeader( - serverConf: ServerOptions['server'], - userAgent?: string, - disablePreload?: boolean, -) { - const { ssr: ssrConf } = serverConf || {}; - - if (disablePreload) { - return false; - } - - if (typeof ssrConf === 'object' && ssrConf.preload) { - // ssr.preload: 'object' - if (typeof ssrConf.preload === 'object') { - const { userAgentFilter } = ssrConf.preload; - if (userAgentFilter && userAgent) { - return !transformToRegExp(userAgentFilter).test(userAgent); - } - return true; - } - // ssr.preload: true; - return true; - } - - // ssr: false or ssr: true - return false; -} - export interface FlushServerHeaderOptions { ctx: ModernServerContext; distDir: string; diff --git a/packages/server/prod-server/src/libs/preload/shouldFlushServerHeader.ts b/packages/server/prod-server/src/libs/preload/shouldFlushServerHeader.ts new file mode 100644 index 000000000000..1500e06b4c3b --- /dev/null +++ b/packages/server/prod-server/src/libs/preload/shouldFlushServerHeader.ts @@ -0,0 +1,36 @@ +import type { ServerOptions } from '@modern-js/server-core'; + +export function transformToRegExp(input: string | RegExp): RegExp { + if (typeof input === 'string') { + return new RegExp(input); + } + return input; +} + +export function shouldFlushServerHeader( + serverConf: ServerOptions['server'], + userAgent?: string, + disablePreload?: boolean, +) { + const { ssr: ssrConf } = serverConf || {}; + + if (disablePreload) { + return false; + } + + if (typeof ssrConf === 'object' && ssrConf.preload) { + // ssr.preload: 'object' + if (typeof ssrConf.preload === 'object') { + const { userAgentFilter } = ssrConf.preload; + if (userAgentFilter && userAgent) { + return !transformToRegExp(userAgentFilter).test(userAgent); + } + return true; + } + // ssr.preload: true; + return true; + } + + // ssr: false or ssr: true + return false; +} diff --git a/packages/server/prod-server/src/libs/preload/transformLinks2String.ts b/packages/server/prod-server/src/libs/preload/transformLinks2String.ts index aac5750bca09..d33a3cf52e1b 100644 --- a/packages/server/prod-server/src/libs/preload/transformLinks2String.ts +++ b/packages/server/prod-server/src/libs/preload/transformLinks2String.ts @@ -1,6 +1,6 @@ import { SSRPreload } from '@modern-js/server-core'; import { Link } from './parseLinks'; -import { transformToRegExp } from './flushServerHeader'; +import { transformToRegExp } from './shouldFlushServerHeader'; export function transformLinks2String( links: Link[], @@ -62,7 +62,7 @@ function addInclude(links: Link[], include?: SSRPreload['include']) { })(); return { uri: item, as: type }; } - return { uri: item.url, as: item.type, rel: item.rel }; + return { uri: item.url, as: item.as, rel: item.rel }; }) || []; return links.concat(includes); diff --git a/packages/server/prod-server/src/libs/render/index.ts b/packages/server/prod-server/src/libs/render/index.ts index fc835a6ee537..d99f8441aed5 100644 --- a/packages/server/prod-server/src/libs/render/index.ts +++ b/packages/server/prod-server/src/libs/render/index.ts @@ -5,7 +5,7 @@ import { ServerOptions } from '@modern-js/server-core'; import { RenderResult, ServerHookRunner } from '../../type'; import { ModernRoute } from '../route'; import { ERROR_DIGEST } from '../../constants'; -import { flushServerHeader, shouldFlushServerHeader } from '../preload'; +import { shouldFlushServerHeader } from '../preload/shouldFlushServerHeader'; import { handleDirectory } from './static'; import { readFile } from './reader'; import * as ssr from './ssr'; @@ -84,7 +84,9 @@ export const createRenderHandler: CreateRenderHandler = ({ const disablePreload = Boolean( ctx.headers[`x-${cutNameByHyphen(metaName)}-disable-preload`], ); + if (shouldFlushServerHeader(conf.server, userAgent, disablePreload)) { + const { flushServerHeader } = await import('../preload'); flushServerHeader({ serverConf: conf.server, ctx, diff --git a/packages/server/prod-server/tests/preload.test.ts b/packages/server/prod-server/tests/preload.test.ts index d80ac51052f0..fae1d4489a6d 100644 --- a/packages/server/prod-server/tests/preload.test.ts +++ b/packages/server/prod-server/tests/preload.test.ts @@ -3,10 +3,10 @@ import type { ServerOptions } from '@modern-js/server-core'; import { fs } from '@modern-js/utils'; import { flushServerHeader, - shouldFlushServerHeader, - parseLinks, FlushServerHeaderOptions, + parseLinks, } from '../src/libs/preload'; +import { shouldFlushServerHeader } from '../src/libs/preload/shouldFlushServerHeader'; describe('test preload', () => { const distDir = path.join(__dirname, 'fixtures', 'preload'); @@ -121,8 +121,8 @@ describe('test preload', () => { ssr: { preload: { include: [ - { url: 'http://example.com', type: 'script' }, - { url: 'http://example.com', type: 'script' }, + { url: 'http://example.com', as: 'script' }, + { url: 'http://example.com', as: 'script' }, { url: 'http://example3.com', rel: 'dns-prefetch', diff --git a/tests/integration/ssr/fixtures/preload/modern.config.ts b/tests/integration/ssr/fixtures/preload/modern.config.ts index d7467837d176..f4aadb90d0e6 100644 --- a/tests/integration/ssr/fixtures/preload/modern.config.ts +++ b/tests/integration/ssr/fixtures/preload/modern.config.ts @@ -3,7 +3,14 @@ import { appTools, defineConfig } from '@modern-js/app-tools'; export default defineConfig({ server: { ssr: { - preload: true, + preload: { + include: [ + { + url: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/nuvshpqnulg/eden-x-logo.png', + as: 'image', + }, + ], + }, }, }, runtime: { diff --git a/tests/integration/ssr/tests/__snapshots__/preload.test.ts.snap b/tests/integration/ssr/tests/__snapshots__/preload.test.ts.snap index 9f7553b7c27c..f3c5b6eaabb2 100644 --- a/tests/integration/ssr/tests/__snapshots__/preload.test.ts.snap +++ b/tests/integration/ssr/tests/__snapshots__/preload.test.ts.snap @@ -9,5 +9,6 @@ exports[`SSR preload should add Links to response headers 1`] = ` "; rel=preload; as=script", "; rel=preload; as=script", "; rel=preload; as=script", + "; rel=preload; as=image", ] `;