webpack中學習到的拓撲排序
阿新 • • 發佈:2019-01-31
在html-webpack-plugin中看到可以通過拓撲排序的方式來對不同的chunks進行處理,所以把程式碼記錄下來:
'use strict';
var toposort = require('toposort');
var _ = require('lodash');
/*
Sorts dependencies between chunks by their "parents" attribute.
This function sorts chunks based on their dependencies with each other.
The parent relation between chunks as generated by Webpack for each chunk
is used to define a directed (and hopefully acyclic) graph, which is then
topologically sorted in order to retrieve the correct order in which
chunks need to be embedded into HTML. A directed edge in this graph is
describing a "is parent of" relationship from a chunk to another (distinct)
chunk. Thus topological sorting orders chunks from bottom-layer chunks to
highest level chunks that use the lower-level chunks.
@param {Array} chunks an array of chunks as generated by the html-webpack-plugin.
It is assumed that each entry contains at least the properties "id"
(containing the chunk id) and "parents" (array containing the ids of the
parent chunks).
@return {Array} A topologically sorted version of the input chunks
因為最上面的通過commonchunkplugin產生的chunk具有webpack的runtime,所以排列在前面
*/
module.exports.dependency = function (chunks) {
if (!chunks) {
return chunks;
}
// We build a map (chunk-id -> chunk) for faster access during graph building.
// 通過chunk-id -> chunk這種Map結構更加容易繪製圖
var nodeMap = {};
chunks.forEach(function (chunk) {
nodeMap[chunk.id] = chunk;
});
// Next, we add an edge for each parent relationship into the graph
var edges = [];
chunks.forEach(function (chunk) {
if (chunk.parents) {
// Add an edge for each parent (parent -> child)
chunk.parents.forEach(function (parentId) {
// webpack2 chunk.parents are chunks instead of string id(s)
var parentChunk = _.isObject(parentId) ? parentId : nodeMap[parentId];
// If the parent chunk does not exist (e.g. because of an excluded chunk)
// we ignore that parent
if (parentChunk) {
edges.push([parentChunk, chunk]);
}
});
}
});
// We now perform a topological sorting on the input chunks and built edges
return toposort.array(chunks, edges);
};
通過這種方式,我們通過commonchunkplugin抽取出來的含有webpack的runtime的chunk就會排列在前面~
參考資料: