Add core cache of pre-resolved paths

This reduces the number of calls to Module._findPath for
relative paths since they can be resolved without stating
This commit is contained in:
Kevin Sawicki
2014-10-09 09:38:41 -07:00
parent d7cb1550bf
commit 76187f176c
2 changed files with 45 additions and 0 deletions

View File

@@ -1,4 +1,5 @@
path = require 'path'
fs = require 'fs-plus'
ModuleCache = require '../../src/module-cache'
module.exports = (grunt) ->
@@ -26,4 +27,23 @@ module.exports = (grunt) ->
'vendor'
]
validExtensions = ['.js', '.coffee', '.json', '.node']
extensions = {}
onFile = (filePath) ->
filePath = path.relative(appDir, filePath)
segments = filePath.split(path.sep)
return if segments.length > 1 and not (segments[0] in ['exports', 'node_modules', 'src', 'static', 'vendor'])
extension = path.extname(filePath)
if extension in validExtensions
extensions[extension] ?= []
extensions[extension].push(filePath)
onDirectory = -> true
files = fs.traverseTreeSync(appDir, onFile, onDirectory)
metadata._atomModuleCache.extensions = extensions
grunt.file.write(path.join(appDir, 'package.json'), JSON.stringify(metadata, null, 2))

View File

@@ -83,6 +83,23 @@ satisfies = (version, rawRange) ->
cache.ranges[rawRange] = parsedRange
parsedRange.test(version)
resolveFilePath = (relativePath, parentModule) ->
return unless relativePath
return unless parentModule?.id
return if relativePath[relativePath.length - 1] is '/'
resolvedPath = path.resolve(path.dirname(parentModule.id), relativePath)
if resolvedPath.indexOf(cache.resourcePath) is 0
extension = path.extname(resolvedPath)
if extension
return resolvedPath if cache.extensions[extension]?.has(resolvedPath)
else
for extension, paths of cache.extensions
resolvedPathWithExtension = "#{resolvedPath}#{extension}"
return resolvedPathWithExtension if paths.has(resolvedPathWithExtension)
return
getCachedModulePath = (relativePath, parentModule) ->
return unless relativePath
return unless parentModule?.id
@@ -129,6 +146,7 @@ if cache.debug
Module._findPath = (request, paths) ->
cacheKey = JSON.stringify({request, paths})
cache.findPathCount++ unless Module._pathCache[cacheKey]
startTime = Date.now()
foundPath = originalFindPath.apply(global, arguments)
cache.findPathTime += Date.now() - startTime
@@ -158,6 +176,7 @@ exports.register = (resourcePath) ->
originalResolveFilename = Module._resolveFilename
Module._resolveFilename = (relativePath, parentModule) ->
resolvedPath = getCachedModulePath(relativePath, parentModule)
resolvedPath ?= resolveFilePath(relativePath, parentModule)
resolvedPath ? originalResolveFilename(relativePath, parentModule)
cache.registered = true
@@ -181,6 +200,12 @@ exports.add = (directoryPath, metadata) ->
for folderPath in entry.paths
cache.folders[path.join(directoryPath, folderPath)] = entry.dependencies
if directoryPath is cache.resourcePath
for extension, paths of cacheToAdd?.extensions
cache.extensions[extension] ?= new Set()
for filePath in paths
cache.extensions[extension].add(path.join(directoryPath, filePath))
return
exports.cache = cache