Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

Support specifying plugins by path #102

Merged
merged 1 commit into from Sep 12, 2018
Merged

Support specifying plugins by path #102

merged 1 commit into from Sep 12, 2018

Conversation

edmorley
Copy link
Member

This allows the expensive require()s to be skipped in cases where the plugin or webpack configuration won't end up being used. For example, using this feature in Neutrino reduces the overhead of dynamically generating .eslintrc.js from 1800ms to 250ms.

As an added bonus, plugins specified by path will also have their require() statement generated automatically when using toString(), saving the need for callers to manually do so using __expression.

The plugin path is passed back to toString() separately, since it needs stringifying to ensure special characters are escaped (such as the backslashes in Windows-style paths) - and I'd prefer to avoid importing javascript-stringify outside of toString().

This allows the expensive require()s to be skipped in cases where the
plugin or webpack configuration won't end up being used. For example,
using this feature in Neutrino reduces the overhead of dynamically
generating `.eslintrc.js` from 1800ms to 250ms.

As an added bonus, plugins specified by path will also have their
`require()` statement generated automatically when using `toString()`,
saving the need for callers to manually do so using `__expression`.

The plugin path is passed back to `toString()` separately, since it
needs stringifying to ensure special characters are escaped (such as
the backslashes in Windows-style paths) - and I'd prefer to avoid
importing `javascript-stringify` outside of `toString()`.
@edmorley
Copy link
Member Author

@yyx990803 Hi :-) Is this something that vue-cli might use too? Any thoughts/feedback?

@yyx990803
Copy link
Contributor

Nice, this is great!

Copy link
Member

@eliperelman eliperelman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is so incredible! Thank you so much!

@edmorley edmorley merged commit fc8ce23 into neutrinojs:master Sep 12, 2018
@edmorley edmorley deleted the lazy-plugin-support branch September 12, 2018 18:53
@edmorley
Copy link
Member Author

@eliperelman would it be possible to release a new version?
(I must make some time to find out why publishing was broken on Windows, so I can stop pestering you hehe)

edmorley added a commit to neutrinojs/neutrino that referenced this pull request Sep 14, 2018
webpack-chain 4.11.0's `.plugin('abc').use(...)` now supports being
passed the path to a plugin, instead of the plugin itself. See:
neutrinojs/webpack-chain#102

This means we can avoid the expensive `require()` of plugins in cases
where the plugin isn't used - such as when:
* running ESLint's CLI with a Neutrino-generated `.eslintrc.js`
* running tests with Jest/Mocha (which don't perform a webpack build)
* the plugin isn't needed for that `NODE_ENV` (eg `clean-webpack-plugin`
  isn't used in development).

For example, this reduces `time node .eslintrc.js` for a React+AirBnb
project from 1700ms to 370ms - and for projects that use more of the
non-default core Neutrino presets, the improvement will be even more
noticeable.

As an added bonus, plugins specified by path also have their `require()`
statement generated automatically when using `toString()`, meaning
that the configuration output by `--inspect` no longer needs any
adjustments before it can be run.

ie this "just works" with the core presets:

```
$ echo "module.exports = $(yarn neutrino --inspect --mode production);" > exported-config.js
$ yarn webpack --config exported-config.js
```

The webpack-chain docs have also been synced with those from upstream.

Refs #239.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Development

Successfully merging this pull request may close these issues.

None yet

3 participants