为了性能优化,找出项目中没有用到的css、png、jpeg、jpg、js文件,对项目总体的资源有一个管理控制。
### 技术栈
glob、ac多字符自动机、fs、path
findNouseSource.js
const fs=require('fs'); const path=require('path'); const glob=require('glob'); const acSearch=require('./acSearch'); //找出项目中没有用到的资源 function findNouseSource(sourceFileArr,textFileArr,keyFunc){ let sourceKepMap={} sourceFileArr.forEach(function (filepath,i) { const key=keyFunc(filepath); if(!sourceKepMap[key]){ sourceKepMap[key]=[i]; }else{ sourceKepMap[key].push(i) } }) const keys=Object.keys(sourceKepMap) const nouseSourceArr=[].concat(sourceFileArr); textFileArr.forEach(function (filepath) { const text=fs.readFileSync(filepath).toString(); const keyArr=acSearch(keys,text).map((item)=>item.str) keyArr.forEach(function (key) { sourceKepMap[key].forEach(function (index) { nouseSourceArr[index]=false; }); }) }) return nouseSourceArr.filter((item)=>item) } const srcDir='./src/'; //ignone function filterIgnone(filepath) { if(/\/(build|libs)\//.test(filepath)){ return false; } if(/web-server/.test(filepath)){ return false; } return true; } //被搜索的资源 let textFileArr=glob.sync(srcDir+'**/*.+(html|js|css|ejs|less)').filter(filterIgnone); //png 全名搜索和js 文件name搜索 let sourceFileArr=glob.sync(srcDir+'**/*.+(css|png|gif|jpg|jpeg)').filter(filterIgnone); let jssourceFileArr=glob.sync(srcDir+'**/*.+(js)').filter(filterIgnone); const nouseSource=findNouseSource(sourceFileArr,textFileArr,function (filepath) { return path.basename(filepath); }) // console.log(nouseSource) const nouseJsSource=findNouseSource(jssourceFileArr,textFileArr,function (filepath) { return path.basename(filepath,'.js'); }) // console.log(nouseJsSource) const toText={ lenArr:[nouseSource.length,nouseJsSource.length], nouseSource, nouseJsSource, } fs.writeFileSync('./dist/nouse.map',JSON.stringify(toText,null,2))
nouse.map