UNPKG

1.49 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5
6"use strict";
7
8const asyncLib = require("neo-async");
9const NormalModule = require("./NormalModule");
10const PrefetchDependency = require("./dependencies/PrefetchDependency");
11
12/** @typedef {import("./Compiler")} Compiler */
13
14class AutomaticPrefetchPlugin {
15 /**
16 * Apply the plugin
17 * @param {Compiler} compiler the compiler instance
18 * @returns {void}
19 */
20 apply(compiler) {
21 compiler.hooks.compilation.tap(
22 "AutomaticPrefetchPlugin",
23 (compilation, { normalModuleFactory }) => {
24 compilation.dependencyFactories.set(
25 PrefetchDependency,
26 normalModuleFactory
27 );
28 }
29 );
30 let lastModules = null;
31 compiler.hooks.afterCompile.tap("AutomaticPrefetchPlugin", compilation => {
32 lastModules = [];
33
34 for (const m of compilation.modules) {
35 if (m instanceof NormalModule) {
36 lastModules.push({
37 context: m.context,
38 request: m.request
39 });
40 }
41 }
42 });
43 compiler.hooks.make.tapAsync(
44 "AutomaticPrefetchPlugin",
45 (compilation, callback) => {
46 if (!lastModules) return callback();
47 asyncLib.forEach(
48 lastModules,
49 (m, callback) => {
50 compilation.addModuleChain(
51 m.context || compiler.context,
52 new PrefetchDependency(`!!${m.request}`),
53 callback
54 );
55 },
56 err => {
57 lastModules = null;
58 callback(err);
59 }
60 );
61 }
62 );
63 }
64}
65module.exports = AutomaticPrefetchPlugin;