Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 074b5d9

Browse files
feat: add ExcludeModulePlugin (mzgoddard#381)
* feat: add ExcludeModulePlugin * fix: add ExcludeModulePlugin info to README
1 parent dda7593 commit 074b5d9

File tree

8 files changed

+125
-6
lines changed

8 files changed

+125
-6
lines changed

‎README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,33 @@ new HardSourceWebpackPlugin({
4747
}),
4848
```
4949

50+
Some further configuration is possible through provided plugins.
51+
52+
```js
53+
plugins: [
54+
new HardSourceWebpackPlugin(),
55+
56+
// You can optionally exclude items that may not be working with HardSource
57+
// or items with custom loaders while you are actively developing the
58+
// loader.
59+
new HardSourceWebpackPlugin.ExcludeModulePlugin([
60+
{
61+
// HardSource works with mini-css-extract-plugin but due to how
62+
// mini-css emits assets, assets are not emitted on repeated builds with
63+
// mini-css and hard-source together. Ignoring the mini-css loader
64+
// modules, but not the other css loader modules, excludes the modules
65+
// that mini-css needs rebuilt to output assets every time.
66+
test: /mini-css-extract-plugin[\\/]dist[\\/]loader/,
67+
},
68+
{
69+
test: /my-loader/,
70+
include: path.join(__dirname, 'vendor'),
71+
},
72+
]),
73+
]
74+
```
75+
76+
5077
## Options
5178

5279
### `cacheDirectory`

‎index.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ const LoggerFactory = require('./lib/loggerFactory');
2020
const cachePrefix = require('./lib/util').cachePrefix;
2121

2222
const CacheSerializerFactory = require('./lib/CacheSerializerFactory');
23-
const SerializerAppendPlugin = require('./lib/SerializerAppendPlugin');
23+
const ExcludeModulePlugin = require('./lib/ExcludeModulePlugin');
24+
const HardSourceLevelDbSerializerPlugin = require('./lib/SerializerLeveldbPlugin');
2425
const SerializerAppend2Plugin = require('./lib/SerializerAppend2Plugin');
26+
const SerializerAppendPlugin = require('./lib/SerializerAppendPlugin');
2527
const SerializerCacachePlugin = require('./lib/SerializerCacachePlugin');
2628
const SerializerJsonPlugin = require('./lib/SerializerJsonPlugin');
27-
const HardSourceLevelDbSerializerPlugin = require('./lib/SerializerLeveldbPlugin');
2829

2930
const hardSourceVersion = require('./package.json').version;
3031

@@ -557,8 +558,10 @@ class HardSourceWebpackPlugin {
557558

558559
module.exports = HardSourceWebpackPlugin;
559560

560-
HardSourceWebpackPlugin.SerializerAppendPlugin = SerializerAppendPlugin;
561+
HardSourceWebpackPlugin.ExcludeModulePlugin = ExcludeModulePlugin;
562+
HardSourceWebpackPlugin.HardSourceLevelDbSerializerPlugin = HardSourceLevelDbSerializerPlugin;
563+
HardSourceWebpackPlugin.LevelDbSerializerPlugin = HardSourceLevelDbSerializerPlugin;
561564
HardSourceWebpackPlugin.SerializerAppend2Plugin = SerializerAppend2Plugin;
565+
HardSourceWebpackPlugin.SerializerAppendPlugin = SerializerAppendPlugin;
562566
HardSourceWebpackPlugin.SerializerCacachePlugin = SerializerCacachePlugin;
563567
HardSourceWebpackPlugin.SerializerJsonPlugin = SerializerJsonPlugin;
564-
HardSourceWebpackPlugin.HardSourceLevelDbSerializerPlugin = HardSourceLevelDbSerializerPlugin;

‎lib/ExcludeModulePlugin.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
const pluginCompat = require('./util/plugin-compat');
2+
3+
const matchTest = (test, source) => {
4+
if (Array.isArray(test)) {
5+
return test.some(subtest => matchTest(subtest, source));
6+
} else if (test instanceof RegExp) {
7+
return test.test(source);
8+
} else if (typeof test === 'string') {
9+
return source.startsWith(test);
10+
} else if (typeof test === 'function') {
11+
return test(source);
12+
}
13+
return false;
14+
};
15+
16+
const matchOne = ({ test, include, exclude }, source) => {
17+
return (
18+
(test ? matchTest(test, source) : true) &&
19+
(include ? matchTest(include, source) : true) &&
20+
(exclude ? !matchTest(exclude, source) : true)
21+
);
22+
};
23+
24+
const matchAny = (test, source) => {
25+
if (Array.isArray(test)) {
26+
return test.some(subtest => matchOne(subtest, source));
27+
}
28+
return matchOne(test, source);
29+
};
30+
31+
class ExcludeModulePlugin {
32+
constructor(match) {
33+
this.match = match;
34+
}
35+
36+
apply(compiler) {
37+
const compilerHooks = pluginCompat.hooks(compiler);
38+
39+
compilerHooks.afterPlugins.tap('HardSource - ExcludeModulePlugin', () => {
40+
compilerHooks._hardSourceAfterFreezeModule.tap(
41+
'HardSource - ExcludeModulePlugin',
42+
(frozen, module, extra) => {
43+
if (matchAny(this.match, module.identifier())) {
44+
return null;
45+
}
46+
return frozen;
47+
},
48+
);
49+
});
50+
}
51+
}
52+
53+
module.exports = ExcludeModulePlugin;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = function(n) {
2+
return n + (n > 0 ? n - 1 : 0);
3+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var fib = require('./fib');
2+
3+
console.log(fib(3));
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
var HardSourceWebpackPlugin = require('../../..');
2+
3+
module.exports = {
4+
context: __dirname,
5+
entry: './index.js',
6+
output: {
7+
path: __dirname + '/tmp',
8+
filename: 'main.js',
9+
},
10+
plugins: [
11+
new HardSourceWebpackPlugin({
12+
cacheDirectory: 'cache',
13+
environmentHash: {
14+
root: __dirname + '/../../..',
15+
},
16+
}),
17+
new HardSourceWebpackPlugin.ExcludeModulePlugin({
18+
test: /fib\.js$/,
19+
}),
20+
],
21+
};

‎tests/hard-source.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ var fs = require('fs');
22

33
var expect = require('chai').expect;
44

5-
var itCompilesChange = require('./util').itCompilesChange;
65
var itCompiles = require('./util').itCompiles;
6+
var itCompilesChange = require('./util').itCompilesChange;
7+
var itCompilesHardModules = require('./util').itCompilesHardModules;
8+
var itCompilesTwice = require('./util').itCompilesTwice;
79
var itCompilesWithCache = require('./util').itCompilesWithCache;
810
var writeFiles = require('./util').writeFiles;
911

@@ -273,4 +275,7 @@ describe('hard-source features', function() {
273275
'yarn.lock': 'b',
274276
});
275277

278+
itCompilesTwice('hard-source-exclude-plugin');
279+
itCompilesHardModules('hard-source-exclude-plugin', ['./index.js', '!./fib.js']);
280+
276281
});

‎tests/util/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,11 @@ exports.itCompilesHardModules = function(fixturePath, filesA, filesB, expectHand
485485
});
486486
}
487487
else {
488-
expect(hardModules).to.include(handle);
488+
if (handle.startsWith('!')) {
489+
expect(hardModules).to.not.include(handle.substring(1));
490+
} else {
491+
expect(hardModules).to.include(handle);
492+
}
489493
}
490494
});
491495
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /