最后,我找到了正确的方法,它是hash,而不是randomNaming 函数。这是用来散列的,所以很明显它的长度很短,命名很广,可能会产生冲突。所以我编写了自己的Webpack 命名函数,并在Webpack 配置文件中使用变量和函数顶部。这些是我的解决方案的步骤:
首先,cache 和 queue 有两个变量。缓存以便于访问LocalName 及其新的randomName 和队列以保存涉及所有新随机名称的变量条目以避免冲突。
let q = [],
cache = {};
其次,我们声明randomNaming 函数。我知道,也许它不是很优化,但效果很好。导出文件很棒,没有任何冲突。
function randomNaming(length, limit) {
let result = '',
chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_',
/*All valid chars*/
fchars = 'abcdefghjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_';
/*All valid first chars*/
do {
if (q.length >= 52 * Math.pow(64, limit - 1) && limit >= length) {
return 'OutOfPossibility';
} else if (q.length >= 52 * Math.pow(64, limit - 1) && limit < length) {
++limit;
}
result = '';
result += fchars[Math.floor(Math.random() * fchars.length)];
for (let i = limit - 1; i > 0; --i) {
result += chars[Math.floor(Math.random() * chars.length)];
}
} while (q.includes(result));
q.push(result); /*push for avoiding collision in next time of funtion call*/
return result;
}
第三,在webpack 配置内的css-loader 范围内,我使用getLocalIdent 而不是localIdentName。
const getLocalIdent = (loaderContext, localIdentName, localName, options) => {
var randName = randomNaming(3, 2);
if (localName.match(/^i-/i)) {
randName = `i-${randName}`;
} else if (localName.match(/^i_/i)) {
randName = `i_`;
} else {
randName = `${randName}`;
}
if (typeof cache[localName] == 'undefined') {
cache[localName] = randName;
return cache[localName];
} else {
return cache[localName];
}
};
现在所有名称都经过哈希处理,CSS 文件的卷大小尽可能小。而HTML 非常轻巧。