@sanpjs/bundler-webpack
Version:
@sanpjs/bundler-webpack
87 lines • 3.86 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @file 检查初始资源
* Reference: https://github.com/ecomfe/reskript/blob/master/packages/cli-build/src/inspect/initialResources.ts
*/
const lodash_uniqBy_1 = __importDefault(require("lodash.uniqBy"));
const inspect_1 = require("../utils/inspect");
const extractInitialChunks = (compilations) => {
const chunks = (0, lodash_uniqBy_1.default)(compilations.reduce((res, { chunks = [] }) => [...res, ...chunks], []), (chunk) => chunk.id);
const initialChunks = chunks.filter((chunk) => chunk.initial);
return initialChunks;
};
const findDisallowedImportsInChunks = (chunks, imports) => {
return imports.reduce((res, disallowed) => {
const match = `node_modules/${disallowed}/`;
const matchedChunks = chunks.filter((chunk) => chunk.modules &&
chunk.modules.some((m) => m.nameForCondition && m.nameForCondition.includes(match)));
const disallowedChunks = matchedChunks.map((chunk) => {
const file = chunk.files ? chunk.files[0] : '(unknown)';
return {
file,
moduleName: disallowed
};
});
return [...res, ...disallowedChunks];
}, []);
};
exports.default = (compilations, initialResConfig) => {
const initialChunks = extractInitialChunks(compilations);
const count = {
config: initialResConfig.count,
defaultValue: Infinity,
check: async (max, { notice, report }) => {
notice(`Initial resource count: ${initialChunks.length}`);
if (initialChunks.length > max) {
report(`Too many initial resoures, max allowed is ${max}`);
}
return initialChunks.length <= max;
}
};
const totalSize = {
config: initialResConfig.totalSize,
defaultValue: Infinity,
check: async (max, { notice, report }) => {
const totalSize = initialChunks.reduce((res, chunk) => {
return res + chunk.size;
}, 0);
notice(`Initial resource size: ${(0, inspect_1.formatSize)(totalSize)} (not gzipped)`);
if (totalSize > max) {
report(`Initial size is too large, max allowed is is ${(0, inspect_1.formatSize)(max)}`);
}
return totalSize <= max;
}
};
const sizeDeviation = {
config: initialResConfig.sizeDeviation,
defaultValue: Infinity,
check: async (max, { report }) => {
const average = initialChunks.reduce((res, chunk) => {
return res + chunk.size;
}, 0) / initialChunks.length;
const abnormalChunks = initialChunks.filter((chunk) => (chunk.size - average) / average > max);
for (const chunk of abnormalChunks) {
report(`Initial resource sizeDeviation: Resource ${(chunk.files || [])[0]} has unbalanced size to other resources`);
}
return !abnormalChunks.length;
}
};
const disallowImports = {
config: initialResConfig.disallowImports,
defaultValue: [],
check: async (disallowImports, { report }) => {
const unwantedChunkImports = findDisallowedImportsInChunks(initialChunks, disallowImports);
for (const { file, moduleName } of unwantedChunkImports) {
report(`Initial resource disallowImports:
Initial chunk ${file} includes disallowed module ${moduleName}`);
}
return !unwantedChunkImports.length;
}
};
return [count, totalSize, sizeDeviation, disallowImports];
};
//# sourceMappingURL=initialRes.js.map