From c5dfa2dbd51d653e5350e2ee99e6ce9726c17faa Mon Sep 17 00:00:00 2001 From: Jean Lauliac Date: Tue, 16 May 2017 05:01:05 -0700 Subject: [PATCH] packager: TransformCache: trivial optimization wins Reviewed By: davidaurelio Differential Revision: D5068811 fbshipit-source-id: 74e4c3218581b2cb081cb7da7639356d0a7d0430 --- .../metro-bundler/src/lib/TransformCache.js | 63 +++++++++++-------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/packages/metro-bundler/src/lib/TransformCache.js b/packages/metro-bundler/src/lib/TransformCache.js index ab1ab19a..eb98342a 100644 --- a/packages/metro-bundler/src/lib/TransformCache.js +++ b/packages/metro-bundler/src/lib/TransformCache.js @@ -138,31 +138,37 @@ class TransformCache { */ _readSync(props: ReadTransformProps): TransformCacheResult { this._collectIfNecessarySync(props.cacheOptions); - const cacheFilePaths = this._getCacheFilePaths(props); - let metadata, transformedCode; try { - metadata = readMetadataFileSync(cacheFilePaths.metadata); - if (metadata == null) { - return {result: null, outdatedDependencies: EMPTY_ARRAY}; - } - const sourceHash = hashSourceCode(props); - if (sourceHash !== metadata.cachedSourceHash) { - return {result: null, outdatedDependencies: metadata.dependencies}; - } - transformedCode = fs.readFileSync(cacheFilePaths.transformedCode, 'utf8'); - const codeHash = crypto - .createHash('sha1') - .update(transformedCode) - .digest('hex'); - if (metadata.cachedResultHash !== codeHash) { - return {result: null, outdatedDependencies: metadata.dependencies}; - } + return this._readFilesSync(props); } catch (error) { if (error.code === 'ENOENT') { return {result: null, outdatedDependencies: EMPTY_ARRAY}; } throw error; } + } + + _readFilesSync(props: ReadTransformProps): TransformCacheResult { + const cacheFilePaths = this._getCacheFilePaths(props); + const metadata = readMetadataFileSync(cacheFilePaths.metadata); + if (metadata == null) { + return {result: null, outdatedDependencies: EMPTY_ARRAY}; + } + const sourceHash = hashSourceCode(props); + if (sourceHash !== metadata.cachedSourceHash) { + return {result: null, outdatedDependencies: metadata.dependencies}; + } + const transformedCode = fs.readFileSync( + cacheFilePaths.transformedCode, + 'utf8', + ); + const codeHash = crypto + .createHash('sha1') + .update(transformedCode) + .digest('hex'); + if (metadata.cachedResultHash !== codeHash) { + return {result: null, outdatedDependencies: metadata.dependencies}; + } return { result: { code: transformedCode, @@ -336,15 +342,7 @@ function readMetadataFileSync( sourceMap: ?MappingsMap, } { const metadataStr = fs.readFileSync(metadataFilePath, 'utf8'); - let metadata; - try { - metadata = JSON.parse(metadataStr); - } catch (error) { - if (error instanceof SyntaxError) { - return null; - } - throw error; - } + const metadata = tryParseJSON(metadataStr); if (!Array.isArray(metadata)) { return null; } @@ -375,6 +373,17 @@ function readMetadataFileSync( }; } +function tryParseJSON(str: string): any { + try { + return JSON.parse(str); + } catch (error) { + if (error instanceof SyntaxError) { + return null; + } + throw error; + } +} + function hashSourceCode(props: { filePath: string, sourceCode: string,