/
watch-handler.js
104 lines (88 loc) · 2.77 KB
/
watch-handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* @file File change handler
* @author sparkelwhy@gmail.com
*/
'use strict';
const path = require('path');
const {colors, Timer} = require('../util');
function compileFile(buildManager, file, releaseFiles) {
let logger = buildManager.logger;
typeof file === 'string' && (file = buildManager.createFile(file));
// check file whether is processed
let processed = releaseFiles.processed;
if (processed[file.path]) {
return;
}
processed[file.path] = true;
file.reset();
logger.debug('compile file', file.path);
releaseFiles.processFileNum += 1;
if (file.isImg) {
// xxx: skip image file rebuild to avoid rebuild repeatedly
file.processing || releaseFiles.add(file);
return;
}
// analyse the style file dependence and determine which style file need to recompile
if (file.isStyle && !file.owner) {
// TODO init dep map global to search file by dep effectively
let changeFiles = buildManager.getFilesByDep(file.path);
logger.debug(file.path, 'changeFiles:' + changeFiles.length);
if (changeFiles.length) {
changeFiles.forEach(
item => compileFile(buildManager, item, releaseFiles)
);
return;
}
}
let result = buildManager.compile(file);
if (result) {
buildManager.buildDependencies();
}
}
function rebuildFiles(file, buildManager) {
let timer = new Timer();
timer.start();
let outputFiles = [];
let addReleaseFile = function (file) {
if (!outputFiles.includes(file)) {
outputFiles.push(file);
}
};
let releaseFiles = {
processFileNum: 0,
add: addReleaseFile,
processed: {}
};
buildManager.on('buildFileDone', addReleaseFile);
compileFile(buildManager, file, releaseFiles);
buildManager.removeListener('buildFileDone', addReleaseFile);
if (outputFiles.length) {
let logger = buildManager.logger;
buildManager.release(outputFiles).then(
() => logger.info(
'rebuild',
colors.cyan(releaseFiles.processFileNum),
'files done:',
colors.grey(timer.tick())
)
);
}
}
module.exports = exports = {
fileDel(file, buildManager) {
let dirname = path.dirname(
path.join(buildManager.root, file)
);
buildManager.cache.clearDirFileListInfo(dirname);
},
fileAdd(file, buildManager) {
let dirname = path.dirname(
path.join(buildManager.root, file)
);
buildManager.cache.clearDirFileListInfo(dirname);
rebuildFiles(file, buildManager);
},
fileChange(file, buildManager) {
rebuildFiles(file, buildManager);
}
};