Last active
April 20, 2022 18:57
-
-
Save jthegedus/8e820d37e1f3768f991886fb65de154f to your computer and use it in GitHub Desktop.
Next.js static asset hoisting for Firebase Hosting CDN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var shell = require("shelljs"); | |
var nextjsConfig = require("../next.config"); | |
var distDir = nextjsConfig.distDir || ".next"; | |
var BUILD_ID = shell.cat(`${distDir}/BUILD_ID`); | |
function hoistPages(fileExt, outputPath) { | |
console.log( | |
`${distDir}/server/static/${BUILD_ID}/pages/**/*${fileExt} -> ${outputPath}/` | |
); | |
shell.mkdir("-p", outputPath); | |
var match = new RegExp("\\" + `${fileExt}`); | |
var filesToHoist = shell | |
.find(`${distDir}/server/static/${BUILD_ID}/pages/`) | |
.filter(function (file) { | |
// ensure the file has the required extension and is not a dynamic route (/blog/[pid]) | |
return file.match(match) && file.match(/^((?!\[|\]).)*$/); | |
}); | |
filesToHoist.forEach((filePath) => { | |
var outPath = filePath.split("pages/")[1]; | |
if (outPath.includes("/")) { | |
shell.mkdir( | |
"-p", | |
`${outputPath}/${outPath.substring(0, outPath.lastIndexOf("/"))}` | |
); | |
} | |
shell.cp("-f", filePath, `${outputPath}/${outPath}`); | |
}); | |
} | |
console.log( | |
"next export doesn't support getServerSideProps() so we perform our own copy of static assets to prepare our Firebase Hosting upload" | |
); | |
console.log( | |
"Hoist public/ Next.js runtime and optimised chunks, computed .html and .json data\n" | |
); | |
console.log("public/ -> out/"); | |
shell.mkdir("-p", "out/"); | |
shell.cp("-Rf", "public/*", "out/"); | |
console.log(`${distDir}/static/ -> out/_next/static/`); | |
shell.mkdir("-p", "out/_next/static/"); | |
shell.cp("-Rf", `${distDir}/static/`, "out/_next/"); | |
hoistPages(".html", "out"); | |
hoistPages(".json", `out/_next/data/${BUILD_ID}`); |
18s!!! :O I haven't seen a cold start over 2s!
Yeah, doesn't seem right. Guessing it's either because I'm not paying enough money yet or I have too many deps. (I'm in the process of removing redux everywhere but not there yet).
At this point I'm dropping SSR almost everywhere, running a next export
and trying to cover as many getStaticPaths
as I can, while relying on /api
routes continuing to be served by Cloud Functions.
Maybe some day I'll migrate to Cloud Run, just don't have bandwidth atm.
package.json deps
"@date-io/date-fns": "1.x",
"@google-cloud/bigquery": "^5.5.0",
"@google/maps": "^1.0.1",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "^4.0.0-alpha.56",
"@material-ui/pickers": "^3.2.10",
"@mui-treasury/styles": "^0.5.0",
"@react-hook/window-size": "^3.0.6",
"autosuggest-highlight": "^3.1.1",
"axios": "^0.19.2",
"browser-or-node": "^1.2.1",
"clsx": "^1.0.4",
"common-tags": "^1.8.0",
"core-js": "^3.2.1",
"date-fns": "^2.4.1",
"date-fns-tz": "^1.0.12",
"email-addresses": "^3.1.0",
"firebase": "^8.2.7",
"firebase-admin": "^9.5.0",
"firebase-functions": "^3.13.1",
"ical-generator": "^1.15.1",
"integrify": "^3.0.1",
"isomorphic-unfetch": "^3.0.0",
"js-cookie": "^2.2.1",
"lodash": "^4.17.15",
"next": "^10.0.6",
"next-cookies": "^2.0.3",
"next-images": "^1.1.2",
"next-redux-wrapper": "^6.0.2",
"node": "^14.2.0",
"nodemailer": "^6.2.1",
"nookies": "^2.5.2",
"papaparse": "^5.2.0",
"pluralize": "^8.0.0",
"prop-types": "^15.7.2",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-dropzone": "^10.2.2",
"react-flip-move": "^3.0.3",
"react-ga": "^2.5.7",
"react-redux": "^7.2.1",
"react-redux-firebase": "^3.10.0",
"react-responsive-modal": "^4.0.1",
"react-scroll-parallax": "^2.4.0",
"reactfire": "^3.0.0-rc.0",
"recompose": "^0.30.0",
"redux": "^4.0.5",
"redux-devtools-extension": "^2.13.8",
"redux-firestore": "^0.13.0",
"redux-thunk": "^2.3.0",
"rrule": "^2.6.6",
"uuid": "^8.1.0"
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The
SSG
hack isn't really viable after testing it. Non-cached requests to a cold start app are still insanely slow, like 18 seconds:Cold
Warm