Skip to content

Commit

Permalink
Add retriable dynamic imports behind a feature flag (#9860)
Browse files Browse the repository at this point in the history
* import retries

* cache result if succesful
  • Loading branch information
alshdavid authored Jul 23, 2024
1 parent ae96448 commit 3054d8c
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/core/core/test/test-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export const DEFAULT_OPTIONS: ParcelOptions = {
featureFlags: {
exampleFeature: false,
parcelV3: false,
importRetry: false,
},
};

Expand Down
1 change: 1 addition & 0 deletions packages/core/feature-flags/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export type FeatureFlags = _FeatureFlags;
export const DEFAULT_FEATURE_FLAGS: FeatureFlags = {
exampleFeature: false,
parcelV3: false,
importRetry: false,
};

let featureFlagValues: FeatureFlags = {...DEFAULT_FEATURE_FLAGS};
Expand Down
4 changes: 4 additions & 0 deletions packages/core/feature-flags/src/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@ export type FeatureFlags = {|
* Rust backed requests
*/
+parcelV3: boolean,
/**
* Configure runtime to enable retriable dynamic imports
*/
importRetry: boolean,
|};
18 changes: 18 additions & 0 deletions packages/runtimes/js/src/JSRuntime.js
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,24 @@ function getLoaderRuntime({
)}'))`;
}

if (needsEsmLoadPrelude && options.featureFlags.importRetry) {
loaderCode = `
Object.defineProperty(module, 'exports', { get: () => {
let load = require('./helpers/browser/esm-js-loader-retry');
return ${loaderCode}.then((v) => {
Object.defineProperty(module, "exports", { value: Promise.resolve(v) })
return v
});
}})`;

return {
filePath: __filename,
code: loaderCode,
dependency,
env: {sourceType: 'module'},
};
}

let code = [];

if (needsEsmLoadPrelude) {
Expand Down
26 changes: 26 additions & 0 deletions packages/runtimes/js/src/helpers/browser/esm-js-loader-retry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
async function load(id) {
if (!parcelRequire.retryState) {
parcelRequire.retryState = {};
}

if (!globalThis.navigator.onLine) {
await new Promise(res =>
globalThis.addEventListener('online', res, {once: true}),
);
}

let url = require('../bundle-manifest').resolve(id);

if (parcelRequire.retryState[id] != undefined) {
url = `${url}?retry=${parcelRequire.retryState[id]}`;
}

try {
// eslint-disable-next-line no-undef
return await __parcel__import__(url);
} catch (error) {
parcelRequire.retryState[id] = Date.now();
}
}

module.exports = load;

0 comments on commit 3054d8c

Please sign in to comment.