UNPKG

@sanpjs/bundler-webpack

Version:

@sanpjs/bundler-webpack

87 lines 3.86 kB
"use strict"; 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