Skip to content
This repository was archived by the owner on Aug 4, 2021. It is now read-only.

Commit 27d798f

Browse files
committed
perf: cache file stats/reads
1 parent 634dfae commit 27d798f

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/index.js

+35
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,34 @@ const ES6_BROWSER_EMPTY = resolve( __dirname, '../src/empty.js' );
88
const CONSOLE_WARN = ( ...args ) => console.warn( ...args ); // eslint-disable-line no-console
99
const exts = [ '.js', '.json', '.node' ];
1010

11+
let readFileCache = {};
12+
const readFileAsync = file => new Promise((fulfil, reject) => fs.readFile(file, (err, contents) => err ? reject(err) : fulfil(contents)));
13+
const statAsync = file => new Promise((fulfil, reject) => fs.stat(file, (err, contents) => err ? reject(err) : fulfil(contents)));
14+
function cachedReadFile (file, cb) {
15+
if (file in readFileCache === false) {
16+
readFileCache[file] = readFileAsync(file).catch(err => {
17+
delete readFileCache[file];
18+
throw err;
19+
});
20+
}
21+
readFileCache[file].then(contents => cb(null, contents), cb);
22+
}
23+
24+
let isFileCache = {};
25+
function cachedIsFile (file, cb) {
26+
if (file in isFileCache === false) {
27+
isFileCache[file] = statAsync(file)
28+
.then(
29+
stat => stat.isFile(),
30+
err => {
31+
if (err.code == 'ENOENT') return false;
32+
delete isFileCache[file];
33+
throw err;
34+
});
35+
}
36+
isFileCache[file].then(contents => cb(null, contents), cb);
37+
}
38+
1139
export default function nodeResolve ( options = {} ) {
1240
const useModule = options.module !== false;
1341
const useMain = options.main !== false;
@@ -31,6 +59,11 @@ export default function nodeResolve ( options = {} ) {
3159
return {
3260
name: 'node-resolve',
3361

62+
onwrite () {
63+
isFileCache = {};
64+
readFileCache = {};
65+
},
66+
3467
resolveId ( importee, importer ) {
3568
if ( /\0/.test( importee ) ) return null; // ignore IDs with null character, these belong to other plugins
3669

@@ -99,6 +132,8 @@ export default function nodeResolve ( options = {} ) {
99132
}
100133
return pkg;
101134
},
135+
readFile: cachedReadFile,
136+
isFile: cachedIsFile,
102137
extensions: options.extensions
103138
}, customResolveOptions ),
104139
( err, resolved ) => {

0 commit comments

Comments
 (0)