mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-23 03:50:11 +08:00
Summary: Makes the delta bundle data structures more consistent. The changes are as follows: * There are now two types of JSON bundles that can be downloaded from the delta endpoint. Base bundles (`Bundle` type), and Delta bundles (`DeltaBundle` type). * The `reset` boolean is renamed to `base`. * `pre` and `post` properties are now strings. * Only `Bundle` can define `pre` and `post` properties. * The `delta` property is renamed to `modules`. * Deleted modules are now listed inside of the `deleted` property, which is only defined by `DeltaBundle`. Reviewed By: mjesun Differential Revision: D10446831 fbshipit-source-id: 40e229a2811d48950f0bad8dd341ece189089e9b
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
/* global Blob, URL: true */
|
|
|
|
(function(global) {
|
|
'use strict';
|
|
|
|
let cachedBundleUrls = new Map();
|
|
|
|
/**
|
|
* Converts the passed delta URL into an URL object containing already the
|
|
* whole JS bundle Blob.
|
|
*/
|
|
async function deltaUrlToBlobUrl(deltaUrl) {
|
|
const client = global.DeltaPatcher.get(deltaUrl);
|
|
|
|
const revisionId = client.getLastRevisionId()
|
|
? `&revisionId=${client.getLastRevisionId()}`
|
|
: '';
|
|
|
|
const data = await fetch(deltaUrl + revisionId);
|
|
const bundle = await data.json();
|
|
|
|
const deltaPatcher = client.applyDelta({
|
|
base: bundle.base,
|
|
revisionId: bundle.revisionId,
|
|
pre: bundle.pre,
|
|
post: bundle.post,
|
|
modules: new Map(bundle.modules),
|
|
});
|
|
|
|
let cachedBundle = cachedBundleUrls.get(deltaUrl);
|
|
|
|
// If nothing changed, avoid recreating a bundle blob by reusing the
|
|
// previous one.
|
|
if (
|
|
deltaPatcher.getLastNumModifiedFiles() === 0 &&
|
|
cachedBundle != null &&
|
|
cachedBundle !== ''
|
|
) {
|
|
return cachedBundle;
|
|
}
|
|
|
|
// Clean up the previous bundle URL to not leak memory.
|
|
if (cachedBundle != null && cachedBundle !== '') {
|
|
URL.revokeObjectURL(cachedBundle);
|
|
}
|
|
|
|
// To make Source Maps work correctly, we need to add a newline between
|
|
// modules.
|
|
const blobContent = deltaPatcher
|
|
.getAllModules()
|
|
.map(module => module + '\n');
|
|
|
|
// Build the blob with the whole JS bundle.
|
|
const blob = new Blob(blobContent, {
|
|
type: 'application/javascript',
|
|
});
|
|
|
|
const bundleContents = URL.createObjectURL(blob);
|
|
cachedBundleUrls.set(deltaUrl, bundleContents);
|
|
|
|
return bundleContents;
|
|
}
|
|
|
|
global.deltaUrlToBlobUrl = deltaUrlToBlobUrl;
|
|
})(window || {});
|