UNPKG

6.5 kBJavaScriptView Raw
1/**
2 * 项目文件压缩
3 * @memberOf Watch
4 */
5module.exports = (option)=>{
6 const fs = require('fs-extra'),
7 path = require('path'),
8 tip = require('./tip'),
9 getImgInfo = require('./getImgInfo'),
10 getDirFilesPath = require('./getDirFilesPath'); //获取目录文件数据
11
12 let config = {};
13
14 for(let i in option){
15 config[i] = option[i];
16 };
17
18 return ()=>{
19 return new Promise((resolve,reject)=>{
20 //读取目录中所有文件
21 let distDirFiles = getDirFilesPath({
22 srcDir:config.src,
23 ignoreDir:[], //不排除任何目录
24 ignore_:false //不排除以"_"开始的文件
25 }),
26 distImgsData = {}, //dist/images目录图片数据
27 cssFiles = (()=>{
28 let cssListObj = distDirFiles['.css'],
29 temp = [];
30 if(cssListObj){
31 for(let i in cssListObj){
32 temp.push(i);
33 };
34 };
35 return temp;
36 })(),
37 imgFiles = (()=>{
38 let temp = [];
39
40 //遍历以几类图片列表,将文件属于dist/images目录中的图片筛选出来
41 ['jpg','jpeg','png','gif'].forEach((item)=>{
42 item = distDirFiles['.'+item];
43 if(item){
44 for(let i in item){
45 if(i.indexOf(path.join(config.dist,'images',path.sep)) === 0){
46 temp.push(i);
47 };
48 };
49 };
50 });
51 return temp;
52 })(),
53 getImgsDataTask = (()=>{
54 let task = [];
55 if(imgFiles.length){
56 imgFiles.forEach((item)=>{
57 task.push(getImgInfo(item));
58 });
59 return Promise.all(task);
60 }else{
61 return undefined;
62 };
63 })();
64
65 if(!cssFiles.length){
66 resolve({
67 status:'success',
68 msg:'无有效的CSS文件需要进行压缩'
69 });
70 };
71
72 if(getImgsDataTask){
73 getImgsDataTask.then(v => {
74 //将dist/images目录内图片数据组织到成为JSON格式
75 v.forEach((item)=>{
76 if(item.status === 'success'){
77 let data = item.data,
78 key = data.path.replace(config.dist,'../').replace(/\\/g,'/');
79 distImgsData[key] = data;
80 };
81 });
82
83 cssFiles.forEach((item,index)=>{
84 let css = fs.readFileSync(item).toString(),
85 newCss;
86
87 for(let i in distImgsData){
88 //将src/images中的数据(base64)替换为dist/images中优化过后的数据(base64)
89 if(fws.ImgsData[i] && distImgsData[i] && fws.ImgsData[i]['base64'] && distImgsData[i]['base64']){
90
91 //使用数据分开再合并法,拼接新的CSS
92 newCss = (()=>{
93 let c = css.split(fws.ImgsData[i]['base64']),
94 temp = '';
95 c.forEach((item,index)=>{
96 if(index < c.length - 1){
97 //temp += item + distImgsData[i]['base64'];
98 temp += item + distImgsData[i]['base64'];
99 }else{
100 temp += item;
101 };
102 });
103 return temp;
104 })();
105 };
106 };
107
108 //如果新压缩的CSS小于
109 if(newCss && css && newCss.length < css.length){
110 //创建目录并写入文件
111 let distDir = path.dirname(item);
112 fs.ensureDir(distDir,err => {
113 if(err){
114 reject({
115 status:'error',
116 msg:`创建失败 ${distDir}`,
117 info:err
118 });
119 };
120
121 //写入css文件
122 try {
123 fs.writeFileSync(item,newCss);
124 tip.success(`更新 ${item}`);
125 if(index === cssFiles.length - 1){
126 resolve({
127 status:'success',
128 msg:'CSS inline-image 压缩处理完成'
129 });
130 };
131 } catch (err) {
132 reject({
133 status:'error',
134 msg:`写入失败 ${item}`,
135 distPath:item,
136 info:err
137 });
138 };
139 });
140 }else if(index === cssFiles.length - 1){
141 resolve({
142 status:'success',
143 msg:'CSS inline-image 压缩处理完成'
144 });
145 };
146 });
147 });
148 }else{
149 resolve({
150 status:'success',
151 msg:config.dist+'目录无有效图片需要进行base64转换'
152 });
153 };
154 });
155 };
156}
\No newline at end of file