From edabb95f3aa9d9d6b666b30d6046de51d20458cf Mon Sep 17 00:00:00 2001 From: Janicklas Ralph James Date: Sat, 4 Apr 2020 14:36:29 -0700 Subject: [PATCH 01/12] Updating native-url version --- packages/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/package.json b/packages/next/package.json index a72c2e1e6af4b..3f0e8fd3f508c 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -83,7 +83,7 @@ "jest-worker": "24.9.0", "loader-utils": "2.0.0", "mini-css-extract-plugin": "0.8.0", - "native-url": "0.2.6", + "native-url": "0.3.0", "pnp-webpack-plugin": "1.5.0", "postcss": "7.0.27", "prop-types": "15.7.2", From c1470991c1efb7b995961e0d743d6029768ade6a Mon Sep 17 00:00:00 2001 From: Janicklas Ralph James Date: Sat, 4 Apr 2020 17:32:37 -0700 Subject: [PATCH 02/12] Bump version --- packages/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/package.json b/packages/next/package.json index 3f0e8fd3f508c..8cb0f1dd11d3d 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -83,7 +83,7 @@ "jest-worker": "24.9.0", "loader-utils": "2.0.0", "mini-css-extract-plugin": "0.8.0", - "native-url": "0.3.0", + "native-url": "0.3.1", "pnp-webpack-plugin": "1.5.0", "postcss": "7.0.27", "prop-types": "15.7.2", From 7f37a0f40df155083d874bd31e7fd6bb497ce0c1 Mon Sep 17 00:00:00 2001 From: Janicklas Ralph James Date: Fri, 29 Jan 2021 13:31:06 -0800 Subject: [PATCH 03/12] Enable font optimization by dafault --- packages/next/build/index.ts | 10 ++++----- packages/next/build/webpack-config.ts | 8 +------ .../next-serverless-loader/page-handler.ts | 16 ++++++-------- .../font-stylesheet-gathering-plugin.ts | 4 +--- packages/next/export/index.ts | 1 - packages/next/export/worker.ts | 22 ++++--------------- packages/next/next-server/lib/head.tsx | 6 +---- packages/next/next-server/lib/post-process.ts | 9 +------- packages/next/next-server/server/config.ts | 1 - .../next/next-server/server/next-server.ts | 16 +++++--------- packages/next/next-server/server/render.tsx | 19 ++++++---------- packages/next/pages/_document.tsx | 11 ++-------- .../build-output/test/index.test.js | 4 ++-- .../font-optimization/test/index.test.js | 10 +++------ 14 files changed, 38 insertions(+), 99 deletions(-) diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts index 0ca466995703f..f4579980dc99b 100644 --- a/packages/next/build/index.ts +++ b/packages/next/build/index.ts @@ -410,12 +410,10 @@ export default async function build( BUILD_MANIFEST, PRERENDER_MANIFEST, REACT_LOADABLE_MANIFEST, - config.experimental.optimizeFonts - ? path.join( - isLikeServerless ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY, - FONT_MANIFEST - ) - : null, + path.join( + isLikeServerless ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY, + FONT_MANIFEST + ), BUILD_ID_FILE, ] .filter(nonNullable) diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 686ecd3cdde34..7323cce7f4508 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -1006,9 +1006,6 @@ export default async function getBaseWebpackConfig( 'process.env.__NEXT_REACT_MODE': JSON.stringify( config.experimental.reactMode ), - 'process.env.__NEXT_OPTIMIZE_FONTS': JSON.stringify( - config.experimental.optimizeFonts && !dev - ), 'process.env.__NEXT_OPTIMIZE_IMAGES': JSON.stringify( config.experimental.optimizeImages ), @@ -1110,9 +1107,7 @@ export default async function getBaseWebpackConfig( rewrites, }), new ProfilingPlugin(), - config.experimental.optimizeFonts && - !dev && - isServer && + isServer && (function () { const { FontStylesheetGatheringPlugin, @@ -1200,7 +1195,6 @@ export default async function getBaseWebpackConfig( plugins: config.experimental.plugins, reactStrictMode: config.reactStrictMode, reactMode: config.experimental.reactMode, - optimizeFonts: config.experimental.optimizeFonts, optimizeImages: config.experimental.optimizeImages, optimizeCss: config.experimental.optimizeCss, scrollRestoration: config.experimental.scrollRestoration, diff --git a/packages/next/build/webpack/loaders/next-serverless-loader/page-handler.ts b/packages/next/build/webpack/loaders/next-serverless-loader/page-handler.ts index 3bfccc2bd22ca..48eb98f31564e 100644 --- a/packages/next/build/webpack/loaders/next-serverless-loader/page-handler.ts +++ b/packages/next/build/webpack/loaders/next-serverless-loader/page-handler.ts @@ -281,15 +281,13 @@ export function getPageHandler(ctx: ServerlessHandlerCtx) { const previewData = tryGetPreviewData(req, res, options.previewProps) const isPreviewMode = previewData !== false - if (process.env.__NEXT_OPTIMIZE_FONTS) { - renderOpts.optimizeFonts = true - /** - * __webpack_require__.__NEXT_FONT_MANIFEST__ is added by - * font-stylesheet-gathering-plugin - */ - // @ts-ignore - renderOpts.fontManifest = __webpack_require__.__NEXT_FONT_MANIFEST__ - } + renderOpts.optimizeFonts = true + /** + * __webpack_require__.__NEXT_FONT_MANIFEST__ is added by + * font-stylesheet-gathering-plugin + */ + // @ts-ignore + renderOpts.fontManifest = __webpack_require__.__NEXT_FONT_MANIFEST__ let result = await renderToHTML( req, diff --git a/packages/next/build/webpack/plugins/font-stylesheet-gathering-plugin.ts b/packages/next/build/webpack/plugins/font-stylesheet-gathering-plugin.ts index ba003408ed629..b9470eacf8c19 100644 --- a/packages/next/build/webpack/plugins/font-stylesheet-gathering-plugin.ts +++ b/packages/next/build/webpack/plugins/font-stylesheet-gathering-plugin.ts @@ -153,9 +153,7 @@ export class FontStylesheetGatheringPlugin { isWebpack5 ? '__webpack_require__' : mainTemplate.requireFn }.__NEXT_FONT_MANIFEST__ = ${JSON.stringify( this.manifestContent - )}; - // Enable feature: - process.env.__NEXT_OPTIMIZE_FONTS = JSON.stringify(true);` + )};` } ) } diff --git a/packages/next/export/index.ts b/packages/next/export/index.ts index c820e25c8904d..9480c22dc198f 100644 --- a/packages/next/export/index.ts +++ b/packages/next/export/index.ts @@ -526,7 +526,6 @@ export default async function exportApp( subFolders, buildExport: options.buildExport, serverless: isTargetLikeServerless(nextConfig.target), - optimizeFonts: nextConfig.experimental.optimizeFonts, optimizeImages: nextConfig.experimental.optimizeImages, optimizeCss: nextConfig.experimental.optimizeCss, spanContext, diff --git a/packages/next/export/worker.ts b/packages/next/export/worker.ts index 01e17ade79006..9572140f86636 100644 --- a/packages/next/export/worker.ts +++ b/packages/next/export/worker.ts @@ -49,7 +49,6 @@ interface ExportPageInput { serverRuntimeConfig: string subFolders?: boolean serverless: boolean - optimizeFonts: boolean optimizeImages: boolean optimizeCss: any spanContext: any @@ -70,7 +69,6 @@ interface RenderOpts { ampSkipValidation?: boolean hybridAmp?: boolean inAmpMode?: boolean - optimizeFonts?: boolean optimizeImages?: boolean optimizeCss?: any fontManifest?: FontManifest @@ -96,7 +94,6 @@ export default async function exportPage({ serverRuntimeConfig, subFolders, serverless, - optimizeFonts, optimizeImages, optimizeCss, }: ExportPageInput): Promise { @@ -268,15 +265,11 @@ export default async function exportPage({ { ampPath: renderAmpPath, /// @ts-ignore - optimizeFonts, - /// @ts-ignore optimizeImages, /// @ts-ignore optimizeCss, distDir, - fontManifest: optimizeFonts - ? requireFontManifest(distDir, serverless) - : null, + fontManifest: requireFontManifest(distDir, serverless), locale: locale!, locales: renderOpts.locales!, }, @@ -318,13 +311,9 @@ export default async function exportPage({ } else { /** * This sets environment variable to be used at the time of static export by head.tsx. - * Using this from process.env allows targeting both serverless and SSR by calling - * `process.env.__NEXT_OPTIMIZE_FONTS`. - * TODO(prateekbh@): Remove this when experimental.optimizeFonts are being cleaned up. + * Using this from process.env allows targeting both serverless and SSR + * TODO: Remove this when experimental flags are being cleaned up. */ - if (optimizeFonts) { - process.env.__NEXT_OPTIMIZE_FONTS = JSON.stringify(true) - } if (optimizeImages) { process.env.__NEXT_OPTIMIZE_IMAGES = JSON.stringify(true) } @@ -336,12 +325,9 @@ export default async function exportPage({ ...renderOpts, ampPath: renderAmpPath, params, - optimizeFonts, optimizeImages, optimizeCss, - fontManifest: optimizeFonts - ? requireFontManifest(distDir, serverless) - : null, + fontManifest: requireFontManifest(distDir, serverless), locale: locale as string, } // @ts-ignore diff --git a/packages/next/next-server/lib/head.tsx b/packages/next/next-server/lib/head.tsx index 2a6fa5a40e13b..ea9669a086449 100644 --- a/packages/next/next-server/lib/head.tsx +++ b/packages/next/next-server/lib/head.tsx @@ -138,11 +138,7 @@ function reduceComponents( .reverse() .map((c: React.ReactElement, i: number) => { const key = c.key || i - if ( - process.env.NODE_ENV !== 'development' && - process.env.__NEXT_OPTIMIZE_FONTS && - !props.inAmpMode - ) { + if (process.env.NODE_ENV !== 'development' && !props.inAmpMode) { if ( c.type === 'link' && c.props['href'] && diff --git a/packages/next/next-server/lib/post-process.ts b/packages/next/next-server/lib/post-process.ts index c991a5572cd27..88b7045810846 100644 --- a/packages/next/next-server/lib/post-process.ts +++ b/packages/next/next-server/lib/post-process.ts @@ -6,7 +6,6 @@ const MAXIMUM_IMAGE_PRELOADS = 2 const IMAGE_PRELOAD_SIZE_THRESHOLD = 2500 type postProcessOptions = { - optimizeFonts: boolean optimizeImages: boolean } @@ -255,13 +254,7 @@ function sourceIsSupportedType(imgSrc: string): boolean { } // Initialization -registerPostProcessor( - 'Inline-Fonts', - new FontOptimizerMiddleware(), - // Using process.env because passing Experimental flag through loader is not possible. - // @ts-ignore - (options) => options.optimizeFonts || process.env.__NEXT_OPTIMIZE_FONTS -) +registerPostProcessor('Inline-Fonts', new FontOptimizerMiddleware(), () => true) registerPostProcessor( 'Preload Images', diff --git a/packages/next/next-server/server/config.ts b/packages/next/next-server/server/config.ts index 2408b923a7800..196bd1cad4bde 100644 --- a/packages/next/next-server/server/config.ts +++ b/packages/next/next-server/server/config.ts @@ -82,7 +82,6 @@ const defaultConfig: NextConfig = { reactMode: 'legacy', workerThreads: false, pageEnv: false, - optimizeFonts: false, optimizeImages: false, optimizeCss: false, scrollRestoration: false, diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts index 7d0325545fe06..9bfd501f4eedd 100644 --- a/packages/next/next-server/server/next-server.ts +++ b/packages/next/next-server/server/next-server.ts @@ -151,7 +151,6 @@ export default class Server { customServer?: boolean ampOptimizerConfig?: { [key: string]: any } basePath: string - optimizeFonts: boolean images: string fontManifest: FontManifest optimizeImages: boolean @@ -209,11 +208,9 @@ export default class Server { ampOptimizerConfig: this.nextConfig.experimental.amp?.optimizer, basePath: this.nextConfig.basePath, images: JSON.stringify(this.nextConfig.images), - optimizeFonts: this.nextConfig.experimental.optimizeFonts && !dev, - fontManifest: - this.nextConfig.experimental.optimizeFonts && !dev - ? requireFontManifest(this.distDir, this._isLikeServerless) - : null, + fontManifest: !dev + ? requireFontManifest(this.distDir, this._isLikeServerless) + : null, optimizeImages: this.nextConfig.experimental.optimizeImages, optimizeCss: this.nextConfig.experimental.optimizeCss, domainLocales: this.nextConfig.i18n?.domains, @@ -275,13 +272,10 @@ export default class Server { /** * This sets environment variable to be used at the time of SSR by head.tsx. - * Using this from process.env allows targetting both serverless and SSR by calling + * Using this from process.env allows targeting both serverless and SSR by calling * `process.env.__NEXT_OPTIMIZE_IMAGES`. - * TODO(atcastle@): Remove this when experimental.optimizeImages are being clened up. + * TODO(atcastle@): Remove this when experimental.optimizeImages are being cleaned up. */ - if (this.renderOpts.optimizeFonts) { - process.env.__NEXT_OPTIMIZE_FONTS = JSON.stringify(true) - } if (this.renderOpts.optimizeImages) { process.env.__NEXT_OPTIMIZE_IMAGES = JSON.stringify(true) } diff --git a/packages/next/next-server/server/render.tsx b/packages/next/next-server/server/render.tsx index 2044373d6a447..91183eeadae60 100644 --- a/packages/next/next-server/server/render.tsx +++ b/packages/next/next-server/server/render.tsx @@ -175,7 +175,6 @@ export type RenderOptsPartial = { basePath: string unstable_runtimeJS?: false unstable_JsPreload?: false - optimizeFonts: boolean fontManifest?: FontManifest optimizeImages: boolean optimizeCss: any @@ -1088,17 +1087,13 @@ export async function renderToHTML( } } - // Avoid postProcess if both flags are false - if (process.env.__NEXT_OPTIMIZE_FONTS || process.env.__NEXT_OPTIMIZE_IMAGES) { - html = await postProcess( - html, - { getFontDefinition }, - { - optimizeFonts: renderOpts.optimizeFonts, - optimizeImages: renderOpts.optimizeImages, - } - ) - } + html = await postProcess( + html, + { getFontDefinition }, + { + optimizeImages: renderOpts.optimizeImages, + } + ) if (renderOpts.optimizeCss) { // eslint-disable-next-line import/no-extraneous-dependencies diff --git a/packages/next/pages/_document.tsx b/packages/next/pages/_document.tsx index 5f5bf42ebe720..1e02b00a67772 100644 --- a/packages/next/pages/_document.tsx +++ b/packages/next/pages/_document.tsx @@ -215,10 +215,7 @@ export class Head extends Component< ) }) - if ( - process.env.NODE_ENV !== 'development' && - process.env.__NEXT_OPTIMIZE_FONTS - ) { + if (process.env.NODE_ENV !== 'development') { cssLinkElements = this.makeStylesheetInert( cssLinkElements ) as ReactElement[] @@ -394,11 +391,7 @@ export class Head extends Component< ) } - if ( - process.env.NODE_ENV !== 'development' && - process.env.__NEXT_OPTIMIZE_FONTS && - !inAmpMode - ) { + if (process.env.NODE_ENV !== 'development' && !inAmpMode) { children = this.makeStylesheetInert(children) } diff --git a/test/integration/build-output/test/index.test.js b/test/integration/build-output/test/index.test.js index cf8eca1c83ff2..6a17f942e068f 100644 --- a/test/integration/build-output/test/index.test.js +++ b/test/integration/build-output/test/index.test.js @@ -98,10 +98,10 @@ describe('Build Output', () => { expect(parseFloat(indexFirstLoad)).toBeCloseTo(63.8, 1) expect(indexFirstLoad.endsWith('kB')).toBe(true) - expect(parseFloat(err404Size) - 3.7).toBeLessThanOrEqual(0) + expect(parseFloat(err404Size)).toBeCloseTo(3.7, 1) expect(err404Size.endsWith('kB')).toBe(true) - expect(parseFloat(err404FirstLoad)).toBeCloseTo(67, 1) + expect(parseFloat(err404FirstLoad)).toBeCloseTo(67.2, 1) expect(err404FirstLoad.endsWith('kB')).toBe(true) expect(parseFloat(sharedByAll)).toBeCloseTo(63.5, 1) diff --git a/test/integration/font-optimization/test/index.test.js b/test/integration/font-optimization/test/index.test.js index 358e48c1dd643..90f0bdfe142e2 100644 --- a/test/integration/font-optimization/test/index.test.js +++ b/test/integration/font-optimization/test/index.test.js @@ -117,11 +117,7 @@ function runTests() { describe('Font optimization for SSR apps', () => { beforeAll(async () => { - await fs.writeFile( - nextConfig, - `module.exports = { experimental: {optimizeFonts: true} }`, - 'utf8' - ) + await fs.writeFile(nextConfig, `module.exports = {}`, 'utf8') if (fs.pathExistsSync(join(appDir, '.next'))) { await fs.remove(join(appDir, '.next')) @@ -140,7 +136,7 @@ describe('Font optimization for serverless apps', () => { beforeAll(async () => { await fs.writeFile( nextConfig, - `module.exports = { target: 'serverless', experimental: {optimizeFonts: true} }`, + `module.exports = { target: 'serverless' }`, 'utf8' ) await nextBuild(appDir) @@ -157,7 +153,7 @@ describe('Font optimization for emulated serverless apps', () => { beforeAll(async () => { await fs.writeFile( nextConfig, - `module.exports = { target: 'experimental-serverless-trace', experimental: {optimizeFonts: true} }`, + `module.exports = { target: 'experimental-serverless-trace' }`, 'utf8' ) await nextBuild(appDir) From 16b5cf2d00f8d5d895e6298a21fdea4decda166b Mon Sep 17 00:00:00 2001 From: Janicklas Ralph James Date: Fri, 29 Jan 2021 16:07:27 -0800 Subject: [PATCH 04/12] Refactor test case --- .../font-optimization/test/index.test.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/integration/font-optimization/test/index.test.js b/test/integration/font-optimization/test/index.test.js index 90f0bdfe142e2..5c2323af2a1ba 100644 --- a/test/integration/font-optimization/test/index.test.js +++ b/test/integration/font-optimization/test/index.test.js @@ -10,6 +10,7 @@ import { initNextServerScript, } from 'next-test-utils' import fs from 'fs-extra' +import cheerio from 'cheerio' jest.setTimeout(1000 * 60 * 2) @@ -54,13 +55,21 @@ function runTests() { it('should pass nonce to the inlined font definition', async () => { const html = await renderViaHTTP(appPort, '/nonce') + const $ = cheerio.load(html) expect(await fsExists(builtPage('font-manifest.json'))).toBe(true) - expect(html).toContain( - '' + + const link = $( + 'link[rel="stylesheet"][data-href="https://fonts.googleapis.com/css2?family=Modak"]' ) - expect(html).toMatch( - /