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

Commit 0c3689c

Browse files
committed
perf: cache file stats/reads
1 parent 902c848 commit 0c3689c

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/index.js

+38
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,37 @@ 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+
throw err;
33+
}
34+
).catch(err => {
35+
delete isFileCache[file];
36+
throw err;
37+
});
38+
}
39+
isFileCache[file].then(contents => cb(null, contents), cb);
40+
}
41+
1142
export default function nodeResolve ( options = {} ) {
1243
const useModule = options.module !== false;
1344
const useMain = options.main !== false;
@@ -31,6 +62,11 @@ export default function nodeResolve ( options = {} ) {
3162
return {
3263
name: 'node-resolve',
3364

65+
write () {
66+
isFileCache = {}
67+
readFileCache = {}
68+
},
69+
3470
resolveId ( importee, importer ) {
3571
if ( /\0/.test( importee ) ) return null; // ignore IDs with null character, these belong to other plugins
3672

@@ -99,6 +135,8 @@ export default function nodeResolve ( options = {} ) {
99135
}
100136
return pkg;
101137
},
138+
readFile: cachedReadFile,
139+
isFile: cachedIsFile,
102140
extensions: options.extensions
103141
}, customResolveOptions ),
104142
( err, resolved ) => {

0 commit comments

Comments
 (0)