webpack/lib/asset/AssetModulesPlugin.js

91 lines
2.4 KiB
JavaScript
Raw Normal View History

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Yuta Hiroto @hiroppy
*/
"use strict";
const Generator = require("../Generator");
const { compareModulesById } = require("../util/comparators");
const AssetGenerator = require("./AssetGenerator");
const AssetJavascriptGenerator = require("./AssetJavascriptGenerator");
const AssetParser = require("./AssetParser");
/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("../Chunk")} Chunk */
/** @typedef {import("../ChunkTemplate")} ChunkTemplate */
/** @typedef {import("../Compiler")} Compiler */
/** @typedef {import("../MainTemplate")} MainTemplate */
/** @typedef {import("../Module")} Module */
const type = "asset";
const plugin = "AssetModulesPlugin";
2019-07-16 19:33:45 +08:00
class AssetModulesPlugin {
/**
* @param {Compiler} compiler webpack compiler
* @returns {void}
*/
apply(compiler) {
compiler.hooks.compilation.tap(
plugin,
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.createParser.for(type).tap(plugin, () => {
return new AssetParser();
});
normalModuleFactory.hooks.createGenerator.for(type).tap(plugin, () => {
return Generator.byType({
asset: new AssetGenerator(),
javascript: new AssetJavascriptGenerator(compilation)
});
});
compilation.mainTemplate.hooks.renderManifest.tap(
plugin,
(result, options) => {
2019-07-16 19:33:45 +08:00
const { chunkGraph, moduleGraph } = compilation;
const { chunk, dependencyTemplates, runtimeTemplate } = options;
const { outputOptions } = runtimeTemplate;
for (const module of chunkGraph.getOrderedChunkModulesIterable(
chunk,
compareModulesById(chunkGraph)
)) {
if (module.getSourceTypes().has("asset")) {
2019-06-06 05:29:53 +08:00
const filename = module.nameForCondition();
const filenameTemplate = outputOptions.assetModuleFilename;
result.push({
render: () =>
module.source({
dependencyTemplates,
runtimeTemplate,
moduleGraph,
chunkGraph,
type
}),
filenameTemplate,
pathOptions: {
module,
filename,
chunkGraph
},
auxiliary: true,
identifier: `assetModule${chunkGraph.getModuleId(module)}`,
hash: chunkGraph.getModuleHash(module)
});
}
}
return result;
}
);
}
);
}
}
module.exports = AssetModulesPlugin;