Files
30-seconds-of-code/node_modules/gatsby/dist/commands/build.js
2019-08-20 15:52:05 +02:00

177 lines
4.5 KiB
JavaScript

"use strict";
const _ = require(`lodash`);
const path = require(`path`);
const report = require(`gatsby-cli/lib/reporter`);
const buildHTML = require(`./build-html`);
const buildProductionBundle = require(`./build-javascript`);
const bootstrap = require(`../bootstrap`);
const apiRunnerNode = require(`../utils/api-runner-node`);
const {
copyStaticDirs
} = require(`../utils/get-static-dir`);
const {
initTracer,
stopTracer
} = require(`../utils/tracer`);
const db = require(`../db`);
const tracer = require(`opentracing`).globalTracer();
const signalExit = require(`signal-exit`);
const telemetry = require(`gatsby-telemetry`);
const {
store,
emitter
} = require(`../redux`);
const queryUtil = require(`../query`);
const pageDataUtil = require(`../utils/page-data`);
const WorkerPool = require(`../utils/worker/pool`);
const handleWebpackError = require(`../utils/webpack-error-parser`);
const waitJobsFinished = () => new Promise((resolve, reject) => {
const onEndJob = () => {
if (store.getState().jobs.active.length === 0) {
resolve();
emitter.off(`END_JOB`, onEndJob);
}
};
emitter.on(`END_JOB`, onEndJob);
onEndJob();
});
module.exports = async function build(program) {
const publicDir = path.join(program.directory, `public`);
initTracer(program.openTracingConfigFile);
telemetry.trackCli(`BUILD_START`);
signalExit(() => {
telemetry.trackCli(`BUILD_END`);
});
const buildSpan = tracer.startSpan(`build`);
buildSpan.setTag(`directory`, program.directory);
const {
graphqlRunner
} = await bootstrap(Object.assign({}, program, {
parentSpan: buildSpan
}));
const queryIds = queryUtil.calcInitialDirtyQueryIds(store.getState());
const {
staticQueryIds,
pageQueryIds
} = queryUtil.groupQueryIds(queryIds);
let activity = report.activityTimer(`run static queries`, {
parentSpan: buildSpan
});
activity.start();
await queryUtil.processStaticQueries(staticQueryIds, {
activity,
state: store.getState()
});
activity.end();
await apiRunnerNode(`onPreBuild`, {
graphql: graphqlRunner,
parentSpan: buildSpan
}); // Copy files from the static directory to
// an equivalent static directory within public.
copyStaticDirs();
activity = report.activityTimer(`Building production JavaScript and CSS bundles`, {
parentSpan: buildSpan
});
activity.start();
const stats = await buildProductionBundle(program).catch(err => {
report.panic(handleWebpackError(`build-javascript`, err));
});
activity.end();
const workerPool = WorkerPool.create();
const webpackCompilationHash = stats.hash;
if (webpackCompilationHash !== store.getState().webpackCompilationHash) {
store.dispatch({
type: `SET_WEBPACK_COMPILATION_HASH`,
payload: webpackCompilationHash
});
activity = report.activityTimer(`Rewriting compilation hashes`, {
parentSpan: buildSpan
});
activity.start(); // We need to update all page-data.json files with the new
// compilation hash. As a performance optimization however, we
// don't update the files for `pageQueryIds` (dirty queries),
// since they'll be written after query execution.
const cleanPagePaths = _.difference([...store.getState().pages.keys()], pageQueryIds);
await pageDataUtil.updateCompilationHashes({
publicDir,
workerPool
}, cleanPagePaths, webpackCompilationHash);
activity.end();
}
activity = report.activityTimer(`run page queries`);
activity.start();
await queryUtil.processPageQueries(pageQueryIds, {
activity
});
activity.end();
require(`../redux/actions`).boundActionCreators.setProgramStatus(`BOOTSTRAP_QUERY_RUNNING_FINISHED`);
await waitJobsFinished();
await db.saveState();
activity = report.activityTimer(`Building static HTML for pages`, {
parentSpan: buildSpan
});
activity.start();
try {
await buildHTML.buildPages({
program,
stage: `build-html`,
pagePaths: [...store.getState().pages.keys()],
activity,
workerPool
});
} catch (err) {
let id = `95313`; // TODO: verify error IDs exist
if (err.message === `ReferenceError: window is not defined`) {
id = `95312`;
}
report.panic({
id,
error: err,
context: {
errorPath: err.context && err.context.path
}
});
}
activity.end();
await apiRunnerNode(`onPostBuild`, {
graphql: graphqlRunner,
parentSpan: buildSpan
});
report.info(`Done building in ${process.uptime()} sec`);
buildSpan.finish();
await stopTracer();
workerPool.end();
};
//# sourceMappingURL=build.js.map