私のソリューションは、私のアプリに固有のカスタム ソリューションですが、あなたのアプリにも使用できることを願っています! とてもシンプルです。
styles
いくつかのファイルとディレクトリ (少ない) を含むフォルダーがあると仮定すると、私の解決策は、すべての少ないファイルをコンパイルするのではなく、変更されたファイルのみをコンパイルするフォルダーのホワイト リストを定義することでした。
うなり声の少ない構成:
https://gist.github.com/Vadorequest/bd46bb4d6c326e837710
うなり声構成:
https://gist.github.com/Vadorequest/b48bcfda2d0205ba3f95
フォルダのアーキテクチャ:
これを処理する「最も簡単な」方法は、grunt.watch
イベントをオーバーライドして、変更されたファイルが他のファイルに影響を与える可能性があるかどうかを確認することです。独自のアーキテクチャに応じて、いくつかの方法があります。他のすべてに影響を与えるファイルはstyles
フォルダーのルートまたはサブフォルダー内にあるため、私の場合は十分に単純です。filePath
そのため、ファイルがホワイトリストに属しているかどうかを「ただ」確認する必要がありました。その場合は、その場で grunt 構成を更新し、src
変更されたファイル名のみに一致するようにプロパティを変更します。
grunt.event.on('watch', function(action, filePath, watchedTargetName) {
switch(watchedTargetName){
/*
Compile only what is needed.
Based on a white list of sub folders within the "styles" directory.
White listed folders will not require to compile all LESS file, but only the changed ones.
Others will require to compile everything.
*/
case 'styles':
// Root path from where the files are located.
var rootPath = 'assets/linker/styles/';
// Path of the file
var filePathRelativeToRootPath = path.relative(rootPath, filePath);
// Grunt task name (see less.js)
var gruntTask = 'less';
// Sub task to use.
var subTaskName = 'dev';
// List of folders that don't need to recompile everything.
var whiteListFolders = [
'common',
'devices',
'layous',
'themes',
'views',
];
if(action === 'changed'){
var isDir = path.dirname(filePath) !== '';
var dirName = filePathRelativeToRootPath.split(path.sep)[0];
// If the file is a directory and is belongs to the white list then we will override the grunt config on the fly to compile only that file.
if(isDir && _.contains(whiteListFolders, dirName)){
// We load the less config located at tasks/config/less.js
var config = grunt.config(gruntTask);
// Checks for any misconfiguration.
if(!config){
log.error('There is no config for the grunt task named ' + gruntTask);
}
if(!config[subTaskName]){
log.error('There is no sub task named ' + subTaskName + " for the the grunt task named " + gruntTask);
}
// Update the files.src to be the path to the modified file (relative to srcDir).
// Instead of updating all files, it will only update the one that has been changed.
config[subTaskName].files[0].src = filePathRelativeToRootPath;
grunt.config("less", config);
console.info('watcher LESS - The file ' + filePath + ' is in the white list and will be updated alone.');
}else{
console.info('watcher LESS - The file ' + filePath + ' is not is the white list, all LESS files will be updated.');
}
}
break;
}
} );
ayolan.less
基本的に、ディレクトリ内で名前が付けられたファイルを変更すると、themes
更新時にメモリに設定されるものが次のようになります。( https://gist.github.com/Vadorequest/b48bcfda2d0205ba3f95#file-watch-js-L80-L81を参照)
{
dev: {
files: [{
expand: true,
cwd: 'assets/linker/styles/',
src: 'themes/ayolan.less',// This has been changed in memory, for this specific watch event.
dest: '.tmp/public/linker/styles/',
ext: '.css'
}]
}
}
これにより、http://www.browsersync.io/を使用できるようになりました。これにより、LESS ファイルに単純な変更を加えてから約 1 秒後にブラウザーが更新されます。これは、すべての LESS ファイルをコンパイルする必要があったため、約 5 秒前でした。そしてそれらをコピーします。(他のパフォーマンスの変更も行いましたが、その目標を達成するのに確実に役立ちました!)