From 29b7fcf124827e1fa2f8132f00fc237b090d44a0 Mon Sep 17 00:00:00 2001 From: Matt Bessey Date: Fri, 2 Mar 2018 13:54:07 -0800 Subject: [PATCH] next.config.js generateBuildId support enable customising the build id via config --- readme.md | 19 +++++++++++++++++++ server/build/index.js | 16 ++++++++++------ test/integration/config/next.config.js | 3 ++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index d344c1382df31f..28648c3d30c117 100644 --- a/readme.md +++ b/readme.md @@ -1066,6 +1066,25 @@ module.exports = { } ``` +#### Configuring the build ID + +Next uses a constant generated at build time to identify which version of your application it is being served by. This can cause problems in multi-server deployments because the default ID is not stable across server builds. In order to make it stable you can customize as you see fit, syncronously: + +```js +module.exports = { + generateBuildId: () => process.env.BUILD_ID +} +``` + +or asyncronously: + + +```js +module.exports = { + generateBuildId: async () => await generateIdFromGitSHA() +} +``` + ### Customizing webpack config

diff --git a/server/build/index.js b/server/build/index.js index 0cbeb8476686e5..5e6ea32ae3d958 100644 --- a/server/build/index.js +++ b/server/build/index.js @@ -7,10 +7,14 @@ import { PHASE_PRODUCTION_BUILD } from '../../lib/constants' import getBaseWebpackConfig from './webpack' import md5File from 'md5-file/promise' -export default async function build(dir, conf = null) { +export default async function build (dir, conf = null) { const config = getConfig(PHASE_PRODUCTION_BUILD, dir, conf) - const buildId = process.env.BUILD_ID || uuid.v4() - + let buildId + if (typeof config.generateBuildId === 'function') { + buildId = await config.generateBuildId() + } else { + buildId = uuid.v4() + } try { await fs.access(dir, fs.constants.W_OK) } catch (err) { @@ -34,7 +38,7 @@ export default async function build(dir, conf = null) { } } -function runCompiler(compiler) { +function runCompiler (compiler) { return new Promise(async (resolve, reject) => { const webpackCompiler = await webpack(await compiler) webpackCompiler.run((err, stats) => { @@ -54,7 +58,7 @@ function runCompiler(compiler) { }) } -async function writeBuildStats(dir, config) { +async function writeBuildStats (dir, config) { // Here we can't use hashes in webpack chunks. // That's because the "app.js" is not tied to a chunk. // It's created by merging a few assets. (commons.js and main.js) @@ -68,7 +72,7 @@ async function writeBuildStats(dir, config) { await fs.writeFile(buildStatsPath, JSON.stringify(assetHashMap), 'utf8') } -async function writeBuildId(dir, buildId, config) { +async function writeBuildId (dir, buildId, config) { const buildIdPath = join(dir, config.distDir, 'BUILD_ID') await fs.writeFile(buildIdPath, buildId, 'utf8') } diff --git a/test/integration/config/next.config.js b/test/integration/config/next.config.js index 05f0cc43bbb26a..b49bd0f858a5b2 100644 --- a/test/integration/config/next.config.js +++ b/test/integration/config/next.config.js @@ -11,5 +11,6 @@ module.exports = withCSS({ }, publicRuntimeConfig: { staticFolder: '/static' - } + }, + generateBuildId: async () => await 'TEST_BUILD_ID' })