1 | /**
|
2 | * fontface字体精简
|
3 | * @memberOf Watch
|
4 | */
|
5 | module.exports = (option)=>{
|
6 | const {path,FontFaceExtract,Fontmin,getDirFilesPath,tip} = {
|
7 | path:require('path'),
|
8 | FontFaceExtract:require('font-face-extract'),
|
9 | Fontmin:require('fontmin'),
|
10 | getDirFilesPath:require('./getDirFilesPath'),
|
11 | tip:require('./tip')
|
12 | };
|
13 |
|
14 | let src = option.src,
|
15 | dist = option.dist,
|
16 | tasks = [];
|
17 |
|
18 | //分析输入目录文件信息
|
19 | return ()=>{
|
20 | return new Promise((resolve,reject)=>{
|
21 | let scrDirData = getDirFilesPath({
|
22 | srcDir:src,
|
23 | ignore_:false //不排除以"_"开始的文件
|
24 | });
|
25 |
|
26 | //项目中无ttf字体则不作处理
|
27 | let ttfFile = scrDirData['.ttf'];
|
28 | if(scrDirData['.ttf'] === undefined){
|
29 | resolve({
|
30 | status:'success',
|
31 | msg:'项目中未使用到自定义字体'
|
32 | });
|
33 | return;
|
34 | };
|
35 |
|
36 | let htmlFile = [];
|
37 |
|
38 | //将项目中所有html、html文件保存到htmlFile数组中;
|
39 | let htmls = scrDirData['.html'],
|
40 | htms = scrDirData['.htm'];
|
41 | if(htmls){
|
42 | for(let i in htmls){
|
43 | htmlFile.push(i);
|
44 | };
|
45 | };
|
46 | if(htms){
|
47 | for(let i in htms){
|
48 | htmlFile.push(i);
|
49 | };
|
50 | };
|
51 |
|
52 | //如果项目中无html文件放弃处理
|
53 | if(htmlFile.length === 0){
|
54 | resolve({
|
55 | status:'success',
|
56 | msg:'项目中未找到html、htm文件'
|
57 | });
|
58 | return;
|
59 | };
|
60 |
|
61 |
|
62 | //有html、htm文件则开始分析页面
|
63 | let extract = new FontFaceExtract({
|
64 | src:htmlFile
|
65 | });
|
66 |
|
67 | extract.then(v => {
|
68 | let result = v.data.result;
|
69 | if(JSON.stringify(result) === '{}'){
|
70 | resolve({
|
71 | status:'success',
|
72 | msg:'未分析出页面中有使用自定义字体'
|
73 | });
|
74 | }else{
|
75 | //字体任务转换队列
|
76 | let fontMinTask = [];
|
77 |
|
78 | for(let i in result){
|
79 | fontMinTask.push(()=>{
|
80 | return new Promise((resolve,reject)=>{
|
81 | let srcFile = i, // 字体源文件
|
82 | distDir = path.dirname(i.replace(src,dist)); // 输出路径
|
83 |
|
84 | let fontmin = new Fontmin()
|
85 | .src(srcFile) // 输入配置
|
86 | .use(Fontmin.glyph({ // 字型提取插件
|
87 | text:result[i] // 所需文字
|
88 | }))
|
89 | .use(Fontmin.ttf2eot()) // eot 转换插件
|
90 | .use(Fontmin.ttf2woff()) // woff 转换插件
|
91 | .use(Fontmin.ttf2svg()) // svg 转换插件
|
92 | .dest(distDir);
|
93 |
|
94 | //开始转换
|
95 | fontmin.run((err,files,stream)=>{
|
96 | if(err){
|
97 | reject({
|
98 | status:'error',
|
99 | msg:'字体精简过程遇到错误',
|
100 | data:err
|
101 | });
|
102 | }else{
|
103 | resolve({
|
104 | status:'success',
|
105 | msg:'完成字体精简',
|
106 | data:{
|
107 | srcFile:srcFile,
|
108 | outData:files
|
109 | }
|
110 | });
|
111 | };
|
112 | });
|
113 | });
|
114 | });
|
115 | };
|
116 |
|
117 | //执行字体转换任务
|
118 | let f = async ()=> {
|
119 | let data = [];
|
120 | for(let i=0,len=fontMinTask.length; i<len; i++){
|
121 | let subTask = await fontMinTask[i]();
|
122 | data.push(subTask);
|
123 | if(subTask.status === 'success'){
|
124 | tip.success(`精简 ${subTask.data.srcFile}`);
|
125 | };
|
126 | };
|
127 | return {
|
128 | status:'success',
|
129 | msg:'字体精简完成',
|
130 | data:data
|
131 | };
|
132 | };
|
133 |
|
134 | //将转换的结果返回到主任务
|
135 | f().then(v => {
|
136 | resolve(v);
|
137 | }).catch(e => {
|
138 | reject(e);
|
139 | });
|
140 | };
|
141 | }).catch(e => {
|
142 | reject(e);
|
143 | });
|
144 | });
|
145 | };
|
146 |
|
147 | } |
\ | No newline at end of file |