Provide importedFilePathsByRelativeImportPath to LessCache

This commit is contained in:
Antonio Scandurra
2017-03-14 13:35:28 +01:00
parent dc76e2e144
commit 684d8bd42c
4 changed files with 48 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
'use strict'
const fs = require('fs')
const klawSync = require('klaw-sync')
const glob = require('glob')
const path = require('path')
const LessCache = require('less-cache')
@@ -29,13 +30,17 @@ module.exports = function () {
}
CONFIG.snapshotAuxiliaryData.lessSourcesByRelativeFilePath = {}
function saveIntoSnapshotAuxiliaryData (absoluteFilePath, contents) {
function saveIntoSnapshotAuxiliaryData (absoluteFilePath, content) {
const relativeFilePath = path.relative(CONFIG.intermediateAppPath, absoluteFilePath)
if (!CONFIG.snapshotAuxiliaryData.lessSourcesByRelativeFilePath.hasOwnProperty(relativeFilePath)) {
CONFIG.snapshotAuxiliaryData.lessSourcesByRelativeFilePath[relativeFilePath] = contents
CONFIG.snapshotAuxiliaryData.lessSourcesByRelativeFilePath[relativeFilePath] = {
content: content,
digest: LessCache.digestForContent(content)
}
}
}
CONFIG.snapshotAuxiliaryData.importedFilePathsByRelativeImportPath = {}
// Warm cache for every combination of the default UI and syntax themes,
// because themes assign variables which may be used in any style sheet.
for (let uiTheme of uiThemes) {
@@ -54,6 +59,19 @@ module.exports = function () {
]
})
// Store file paths located at the import paths so that we can avoid scanning them at runtime.
for (const absoluteImportPath of lessCache.getImportPaths()) {
const relativeImportPath = path.relative(CONFIG.intermediateAppPath, absoluteImportPath)
if (!CONFIG.snapshotAuxiliaryData.importedFilePathsByRelativeImportPath.hasOwnProperty(relativeImportPath)) {
CONFIG.snapshotAuxiliaryData.importedFilePathsByRelativeImportPath[relativeImportPath] = []
for (const importedFile of klawSync(absoluteImportPath, {nodir: true})) {
CONFIG.snapshotAuxiliaryData.importedFilePathsByRelativeImportPath[relativeImportPath].push(
path.relative(CONFIG.intermediateAppPath, importedFile.path)
)
}
}
}
function cacheCompiledCSS(lessFilePath, importFallbackVariables) {
let lessSource = fs.readFileSync(lessFilePath, 'utf8')
if (importFallbackVariables) {

View File

@@ -15,6 +15,7 @@
"fs-extra": "0.30.0",
"glob": "7.0.3",
"joanna": "0.0.8",
"klaw-sync": "^1.1.2",
"legal-eagle": "0.14.0",
"lodash.template": "4.4.0",
"minidump": "0.9.0",

View File

@@ -6,7 +6,7 @@ module.exports =
class LessCompileCache
@cacheDir: path.join(process.env.ATOM_HOME, 'compile-cache', 'less')
constructor: ({resourcePath, importPaths, lessSourcesByRelativeFilePath}) ->
constructor: ({resourcePath, importPaths, lessSourcesByRelativeFilePath, importedFilePathsByRelativeImportPath}) ->
@lessSearchPaths = [
path.join(resourcePath, 'static', 'variables')
path.join(resourcePath, 'static')
@@ -17,12 +17,14 @@ class LessCompileCache
else
importPaths = @lessSearchPaths
@cache = new LessCache
cacheDir: @constructor.cacheDir
importPaths: importPaths
resourcePath: resourcePath
lessSourcesByRelativeFilePath: lessSourcesByRelativeFilePath
@cache = new LessCache({
importPaths,
resourcePath,
lessSourcesByRelativeFilePath,
importedFilePathsByRelativeImportPath,
cacheDir: @constructor.cacheDir,
fallbackDir: path.join(resourcePath, 'less-compile-cache')
})
setImportPaths: (importPaths=[]) ->
@cache.setImportPaths(importPaths.concat(@lessSearchPaths))
@@ -30,5 +32,5 @@ class LessCompileCache
read: (stylesheetPath) ->
@cache.readFileSync(stylesheetPath)
cssForFile: (stylesheetPath, lessContent) ->
@cache.cssForFile(stylesheetPath, lessContent)
cssForFile: (stylesheetPath, lessContent, digest) ->
@cache.cssForFile(stylesheetPath, lessContent, digest)

View File

@@ -21,8 +21,10 @@ class ThemeManager
@lessSourcesByRelativeFilePath = null
if typeof snapshotAuxiliaryData is 'undefined'
@lessSourcesByRelativeFilePath = {}
@importedFilePathsByRelativeImportPath = {}
else
@lessSourcesByRelativeFilePath = snapshotAuxiliaryData.lessSourcesByRelativeFilePath
@importedFilePathsByRelativeImportPath = snapshotAuxiliaryData.importedFilePathsByRelativeImportPath
initialize: ({@resourcePath, @configDirPath, @safeMode}) ->
@@ -202,7 +204,12 @@ class ThemeManager
loadLessStylesheet: (lessStylesheetPath, importFallbackVariables=false) ->
unless @lessCache?
LessCompileCache = require './less-compile-cache'
@lessCache = new LessCompileCache({@resourcePath, @lessSourcesByRelativeFilePath, importPaths: @getImportPaths()})
@lessCache = new LessCompileCache({
@resourcePath,
@lessSourcesByRelativeFilePath,
@importedFilePathsByRelativeImportPath,
importPaths: @getImportPaths()
})
try
if importFallbackVariables
@@ -211,8 +218,15 @@ class ThemeManager
@import "variables/syntax-variables";
"""
relativeFilePath = path.relative(@resourcePath, lessStylesheetPath)
less = @lessSourcesByRelativeFilePath[relativeFilePath] ? fs.readFileSync(lessStylesheetPath, 'utf8')
@lessCache.cssForFile(lessStylesheetPath, [baseVarImports, less].join('\n'))
lessSource = @lessSourcesByRelativeFilePath[relativeFilePath]
if lessSource?
content = lessSource.content
digest = lessSource.digest
else
content = baseVarImports + '\n' + fs.readFileSync(lessStylesheetPath, 'utf8')
digest = null
@lessCache.cssForFile(lessStylesheetPath, content, digest)
else
@lessCache.read(lessStylesheetPath)
catch error