mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
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:
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user