next
Version:
The React Framework
57 lines (56 loc) • 2.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "trackDynamicImport", {
enumerable: true,
get: function() {
return trackDynamicImport;
}
});
const _invarianterror = require("../../../shared/lib/invariant-error");
const _isthenable = require("../../../shared/lib/is-thenable");
const _trackmoduleloadingexternal = require("./track-module-loading.external");
function trackDynamicImport(modulePromise) {
if (process.env.NEXT_RUNTIME === 'edge') {
throw Object.defineProperty(new _invarianterror.InvariantError("Dynamic imports should not be instrumented in the edge runtime, because `cacheComponents` doesn't support it"), "__NEXT_ERROR_CODE", {
value: "E687",
enumerable: false,
configurable: true
});
}
if (!(0, _isthenable.isThenable)(modulePromise)) {
// We're expecting `import()` to always return a promise. If it's not, something's very wrong.
throw Object.defineProperty(new _invarianterror.InvariantError('`trackDynamicImport` should always receive a promise. Something went wrong in the dynamic imports transform.'), "__NEXT_ERROR_CODE", {
value: "E677",
enumerable: false,
configurable: true
});
}
// Even if we're inside a prerender and have `workUnitStore.cacheSignal`, we always track the promise globally.
// (i.e. via the global `moduleLoadingSignal` that `trackPendingImport` uses internally).
//
// We do this because the `import()` promise might be cached in userspace:
// (which is quite common for e.g. lazy initialization in libraries)
//
// let promise;
// function doDynamicImportOnce() {
// if (!promise) {
// promise = import("...");
// // transformed into:
// // promise = trackDynamicImport(import("..."));
// }
// return promise;
// }
//
// If multiple prerenders (e.g. multiple pages) depend on `doDynamicImportOnce`,
// we have to wait for the import *in all of them*.
// If we only tracked it using `workUnitStore.cacheSignal.trackRead()`,
// then only the first prerender to call `doDynamicImportOnce` would wait --
// Subsequent prerenders would re-use the existing `promise`,
// and `trackDynamicImport` wouldn't be called again in their scope,
// so their respective CacheSignals wouldn't wait for the promise.
(0, _trackmoduleloadingexternal.trackPendingImport)(modulePromise);
return modulePromise;
}
//# sourceMappingURL=track-dynamic-import.js.map