From 9e538e8644ace9c4a16b1b9238d255b979456086 Mon Sep 17 00:00:00 2001 From: Mark Brocato Date: Tue, 9 Jun 2020 11:42:38 +0300 Subject: [PATCH 1/3] Added NextScriptDeferred component that allows you to import scripts with defer instead of async in _document.js. --- package.json | 2 +- src/NextScriptDeferred.js | 20 ++++++++++++++++++++ test/NextScriptDeferred.test.js | 31 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/NextScriptDeferred.js create mode 100644 test/NextScriptDeferred.test.js diff --git a/package.json b/package.json index 2a65ea33..b3d5bf3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-storefront", - "version": "8.7.2", + "version": "8.8.0", "description": "Build and deploy e-commerce progressive web apps (PWAs) in record time.", "module": "./index.js", "license": "Apache-2.0", diff --git a/src/NextScriptDeferred.js b/src/NextScriptDeferred.js new file mode 100644 index 00000000..2b3e26a0 --- /dev/null +++ b/src/NextScriptDeferred.js @@ -0,0 +1,20 @@ +import React from 'react' +import { NextScript } from 'next/document' + +/** + * Adds script elements for Next.js static assets with defer instead of async + * to improve paint metrics in lighthouse. + * + * This should be used in the body of `pages/_document.js` in place of `NextScript`. + */ +export default class NextScriptDeferred extends NextScript { + getScripts() { + return super.getScripts().map(script => { + return React.cloneElement(script, { + key: script.props.src, + defer: true, + async: undefined, + }) + }) + } +} diff --git a/test/NextScriptDeferred.test.js b/test/NextScriptDeferred.test.js new file mode 100644 index 00000000..42466935 --- /dev/null +++ b/test/NextScriptDeferred.test.js @@ -0,0 +1,31 @@ +import React, { Component } from 'react' +import { mount } from 'enzyme' + +describe('NextScriptDeferred', () => { + let NextScriptDeferred + + beforeEach(() => { + jest.isolateModules(() => { + jest.doMock('next/document', () => ({ + NextScript: class NextScript extends Component { + getScripts() { + return [