UNPKG

6.93 kBJavaScriptView Raw
1class Build{
2 constructor(srcPath,options){
3 const _ts = this;
4
5 let m = _ts.m = {
6 fs:require('fs-extra'),
7 path:require('path'),
8 tip:require('../lib/tip'),
9 pathInfo:require('../lib/getPathInfo'),
10 isFwsDir:require('../lib/isFwsDir'),
11 ReplaceTask:require('../lib/replaceTask'),
12 compressionTask:require('../lib/compressionTask'),
13 simplifyFont:require('../lib/simplifyFont'),
14 fontmin:require('fontmin')
15 },
16 config = _ts.config = {},
17 option = _ts.option = options;
18
19 config.src = fws.srcPath = typeof srcPath === 'string' ? m.path.join(fws.cmdPath,srcPath,'src'+m.path.sep) : fws.srcPath;
20 config.dev = fws.devPath = m.path.join(config.src,'..','dev'+m.path.sep);
21 config.dist = fws.distPath = m.path.join(config.src,'..','dist'+m.path.sep);
22 }
23
24 //初始化
25 init(){
26 const _ts = this;
27
28 let m = _ts.m,
29 config = _ts.config,
30 tasks = _ts.taskList(),
31 f = async ()=>{
32 for(let i=0,len=tasks.length; i<len; i++){
33 let task = await tasks[i]();
34 if(task.status === 'success'){
35 m.tip.success(task.msg);
36 }else if(task.status === 'part'){
37 console.log('');
38 console.log(task.msg);
39 console.log('----------------------------------------');
40 };
41 };
42 return '编译完成。';
43 };
44
45 f().then(v => {
46 console.log('');
47 m.tip.highlight('========================================');
48 m.tip.highlight(v);
49 m.tip.highlight('========================================');
50 }).catch(e => {
51 m.tip.error(e.msg);
52 console.log('error',e);
53 });
54 }
55
56 //taskList
57 taskList(){
58 const _ts = this;
59
60 let m = _ts.m,
61 config = _ts.config,
62 option = _ts.option,
63 tasks = [];
64
65 //备份文件,如果不是fws项目目录且未强制启用不备份功能则需要备份文件
66 let projectDir = m.path.join(config.src,'..'), //项目目录
67 backupDirName = m.pathInfo(projectDir).name+'_fwsBackup'+(+new Date), //备份目录名
68 backupDirPath = m.path.join(projectDir,'..',backupDirName), //备份目录路径
69 isFwsDir = m.isFwsDir(projectDir); //是否为fws项目目录
70
71 //非fws项目需要先备份目录
72 if(!isFwsDir){
73 tasks.push(()=>{
74 return new Promise((resolve,reject)=>{
75 //创建备份目录
76 m.fs.ensureDir(backupDirPath).then(v => {
77 //开始复制文件
78 m.fs.copy(projectDir,backupDirPath).then(v => {
79 resolve({
80 status:'success',
81 msg:`备份 ${projectDir} -> ${backupDirPath}`,
82 data:backupDirPath
83 });
84 }).catch(e => {
85 reject({
86 status:'error',
87 msg:`${projectDir} 备份失败`,
88 info:e
89 });
90 });
91 }).catch(e => {
92 reject({
93 status:'error',
94 msg:`${backupDirPath} 创建失败`,
95 infor:e
96 });
97 });
98 });
99 });
100 }else{
101 //初始化项目
102 tasks.push(_ts.insertPart('初始化:'));
103
104 //将初始化项目任务添加到任务列表
105 let initCompileTasks = require('../lib/initCompile_dev')({
106 src:fws.srcPath,
107 dist:fws.devPath
108 });
109 tasks.push(...initCompileTasks);
110
111
112 //项目编译关键字替换
113 let replaceRule = fws.config.distReplace;
114 if(replaceRule){
115 tasks.push(_ts.insertPart('关键字匹配替换:'));
116
117 //得到目录内的所有文件url路径
118 let replaceTask = new m.ReplaceTask({
119 src:fws.devPath,
120 rule:replaceRule
121 });
122 tasks.push(replaceTask);
123 };
124 };
125
126 //项目文件压缩
127 tasks.push(_ts.insertPart('文件压缩处理:'));
128 let compressionTask = m.compressionTask({
129 src:isFwsDir ? fws.devPath : backupDirPath,
130 dist:isFwsDir ? fws.distPath : projectDir,
131 isMobile:option.mobile, //是否为移动端
132 isBeautify:option.beautify //是否格式化代码
133 });
134 tasks.push(...compressionTask);
135
136 //css Base64压缩
137 tasks.push(_ts.insertPart('CSS inline-image Base64编码压缩'));
138 let cssBase64Simplify = require('../lib/cssBase64Simplify');
139 tasks.push(cssBase64Simplify({
140 src:isFwsDir ? fws.distPath : projectDir,
141 dist:isFwsDir ? fws.distPath : projectDir
142 }));
143
144 //字体文件精简
145 if(isFwsDir){
146 tasks.push(_ts.insertPart('字体文件精简:'));
147 let simplifyFont = require('../lib/fontMin');
148 tasks.push(
149 simplifyFont({
150 src:isFwsDir ? fws.devPath : backupDirPath,
151 dist:isFwsDir ? fws.distPath : projectDir
152 })
153 );
154 };
155
156 return tasks;
157 }
158
159 //insertPart
160 insertPart(partTitle){
161 return ()=>{
162 return new Promise((resolve,reject)=>{
163 resolve({
164 status:'part',
165 msg:partTitle
166 })
167 });
168 }
169 }
170
171};
172
173
174module.exports = {
175 regTask:{
176 command:'[name]',
177 description:'编译项目',
178 option:[
179 ['-m, --mobile','移动端模式,css样式将不会添加全部前缀'],
180 ['-b, --beautify','css、js文件格式化,不被压缩 ']
181 ],
182 help:()=>{
183 console.log('');
184 console.log(' 补充说明:');
185 console.log(' ------------------------------------------------------------');
186 console.log(' 暂无');
187 },
188 action:Build
189 }
190};
\No newline at end of file