Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLI: Further improve startup performance #1476

Merged
merged 2 commits into from
Aug 23, 2020
Merged

CLI: Further improve startup performance #1476

merged 2 commits into from
Aug 23, 2020

Commits on Aug 23, 2020

  1. CLI: Use picomatch instead of minimatch

    4 of 7 dependencies for the QUnit CLI are 'minimatch' and its
    three dependencies. A fairly popular alternative is micromatch's
    picomatch library, which is a drop-in replacement for what we
    need.
    
    Ref <http://npm.broofa.com/?q=qunit@2.11.0>.
    Krinkle committed Aug 23, 2020
    Configuration menu
    Copy the full SHA
    3cbffc4 View commit details
    Browse the repository at this point in the history
  2. CLI: Reduce startup by using tiny-glob to only scan relevant paths

    This follows-up 837af39, which introduced the ignore list to
    the `--watch` mode when `run.restart()` calls `findFiles()`.
    
    This was a big improvement for watch mode, but it still left two
    major issues behind:
    
    1. It did not apply to when running qunit normally (without --watch).
       This could be easily fixed by passing IGNORED_GLOBS in run()
       down to getFilesFromArgs/findFiles the same way.
    
    2. We are still scanning all other top-level directories that are
       not ignored, even if they do not match any part of the glob pattern.
    
    I investigated numerous matching libraries (picomatch, minimatch, etc.)
    but it seems none of of them offer a way to determine whether
    a given directory could contain a matching file. E.g. something
    that returns false for `src/` when given `test/*.js`, but returns
    true for `src/` if given `**/*.js`.
    
    So rather than approaching it from the angle of a matching library,
    I went looking for various "proper" glob libraries instead which
    handle both the pattern matching and the directory scanning
    responsibilities together.
    
    I considered:
    
    * isaacs/node-glob <http://npm.broofa.com/?q=glob@7.1.6>.
      10 dependencies, including 3 for minimatch. Not an option.
    
    * mrmlnc/fast-glob <http://npm.broofa.com/?q=fast-glob@3.2.4>
      This uses picomatch, which is promising as being a popular
      dependency-free alternative to minimatch.
      But, it unfortunately does add up to 16 dependencies in total.
    
    * Crafity/node-glob <http://npm.broofa.com/?q=node-glob@1.2.0>
      A mostly self-contained implementation with 2 dependencies
      ('async' and 'glob-to-regexp'). Unfortunately, it seems to
      not do a limited traversal but rather
    
    * terkelg/tiny-glob <http://npm.broofa.com/?q=tiny-glob@0.2.6>
      Another self-contained implementation, with two local
      dependencies by the same author. Claims to be much faster
      than both fast-glob and node-glob. I think we have a winner.
    
    Ref #1384.
    Krinkle committed Aug 23, 2020
    Configuration menu
    Copy the full SHA
    fe6c67c View commit details
    Browse the repository at this point in the history