/
githubmirror
/
webpack
Обзор
Документация
Войти
/
githubmirror
/
webpack
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
lib/util/publicPathPlaceholder.js
64 строки
2 KB
Alexander Akait
fix: substitute [fullhash] in url() public paths for inlined CSS export types (#21054)
29 май 2026, 19:15
Не верифицирован
29 май 2026, 19:15
66f71f8
Код
Авторство
О чём код?
/* MIT License http://www.opensource.org/licenses/mit-license.php */ "use strict"; // Placeholders embedded into asset `url()` / HTML chunk URLs at code-generation // time, when the final public path can't be resolved yet, then substituted // later once the information is available: // - PUBLIC_PATH_AUTO — stands in for `output.publicPath: "auto"`; replaced // with the per-output-file undo path (relative `../` segments back to the // output root) during chunk/asset render. // - PUBLIC_PATH_FULL_HASH — stands in for `[fullhash]`/`[hash]` in a public // path before the compilation hash exists. Form: `<prefix><len>__`, where // `<len>` is the requested hash length (`0` means the full hash). Replaced // with the real hash (build-time, e.g. CSS `.css` files) or a runtime // `__webpack_require__.h()` expression (inlined CSS in JS). const PUBLIC_PATH_AUTO = "__WEBPACK_CSS_PUBLIC_PATH_AUTO__"; const PUBLIC_PATH_FULL_HASH = "__WEBPACK_CSS_PUBLIC_PATH_FULL_HASH_"; /** * Scan `content` for `PUBLIC_PATH_FULL_HASH` placeholders and invoke `onMatch` * once per well-formed occurrence. The placeholder spans the half-open range * `[start, end)` and encodes the requested hash length (`0` means the full * hash). Callers substitute the build-time hash or a runtime expression * depending on context. * @param {string} content text to scan * @param {(start: number, end: number, length: number) => void} onMatch placeholder callback * @returns {void} */ const walkFullHashPlaceholders = (content, onMatch) => { const prefix = PUBLIC_PATH_FULL_HASH; const prefixLen = prefix.length; const len = content.length; let idx = content.indexOf(prefix); while (idx !== -1) { let digitEnd = idx + prefixLen; while (digitEnd < len) { const cc = content.charCodeAt(digitEnd); if (cc < 48 || cc > 57) break; digitEnd++; } // Well-formed placeholder: at least one digit followed by `__`. if ( digitEnd > idx + prefixLen && digitEnd + 1 < len && content.charCodeAt(digitEnd) === 95 && content.charCodeAt(digitEnd + 1) === 95 ) { const length = Number.parseInt( content.slice(idx + prefixLen, digitEnd), 10 ); onMatch(idx, digitEnd + 2, length); idx = content.indexOf(prefix, digitEnd + 2); } else { idx = content.indexOf(prefix, idx + prefixLen); } } }; module.exports.PUBLIC_PATH_AUTO = PUBLIC_PATH_AUTO; module.exports.PUBLIC_PATH_FULL_HASH = PUBLIC_PATH_FULL_HASH; module.exports.walkFullHashPlaceholders = walkFullHashPlaceholders;