UNPKG

5.74 kBJavaScriptView Raw
1/**
2 * fontface字体精简
3 * @memberOf Watch
4 */
5module.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