diff --git a/core/includes/file.inc b/core/includes/file.inc index b9c217b..8c2e13a 100644 --- a/core/includes/file.inc +++ b/core/includes/file.inc @@ -10,6 +10,7 @@ use Drupal\Component\PhpStorage\FileStorage; use Drupal\Component\Utility\Bytes; use Drupal\Core\File\FileSystem; +use Drupal\Core\Site\Settings; use Drupal\Core\StreamWrapper\PublicStream; use Drupal\Core\StreamWrapper\PrivateStream; @@ -945,6 +946,19 @@ function file_scan_directory($dir, $mask, $options = array(), $depth = 0) { $dir_has_slash = (substr($dir, -1) === '/'); } + // By default, when there is no explicit 'nomask' option, do not check for + // files in common special-purpose directories. The folders here are front-end + // related and they have been added to avoid issues with Drupal recursive + // scanning. In this case, we added node_modules and bower_components. This + // also improves performance on frontend builds. + if (!isset($options['nomask'])) { + $ignore_directories = Settings::get('drupal_file_scan_ignore_directories', [ + 'node_modules', + 'bower_components', + ]); + $options['nomask'] = '/^' . implode('|', $ignore_directories) . '$/'; + } + $options['key'] = in_array($options['key'], array('uri', 'filename', 'name')) ? $options['key'] : 'uri'; $files = array(); // Avoid warnings when opendir does not have the permissions to open a diff --git a/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php index a74dcfc..fc9b445 100644 --- a/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php +++ b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php @@ -71,6 +71,8 @@ class RecursiveExtensionFilterIterator extends \RecursiveFilterIterator { 'js', 'misc', 'templates', + 'node_modules', + 'bower_components', // Legacy subdirectories. 'includes', // Test subdirectories.