1 | ;
|
2 | /**
|
3 | * js文件处理
|
4 | * - js文件压缩
|
5 | * - 文件签名
|
6 | *
|
7 | * @class Compile
|
8 | * {
|
9 | * src:'', <string> 源文件路径
|
10 | * dist:'', <string> 输出路径
|
11 | * }
|
12 | */
|
13 | class Compile{
|
14 | constructor(option){
|
15 | const _ts = this;
|
16 |
|
17 | option = option || {};
|
18 |
|
19 | let m = _ts.m = {
|
20 | fs:require('fs-extra'),
|
21 | path:require('path'),
|
22 | UglifyJS2:require('uglify-js'),
|
23 | UglifyJS3:require('uglify-es'),
|
24 | pathInfo:require('../lib/getPathInfo'),
|
25 | signature:require('../lib/signature')
|
26 | },
|
27 | config = _ts.config = {};
|
28 |
|
29 | //配置写入到_ts.config
|
30 | for(let i in option){
|
31 | config[i] = option[i];
|
32 | };
|
33 | let src = config.src,
|
34 | dist = config.dist;
|
35 |
|
36 | return _ts.taskList();
|
37 | }
|
38 |
|
39 | taskList(){
|
40 | const _ts = this,
|
41 | m = _ts.m,
|
42 | config = _ts.config;
|
43 |
|
44 | return new Promise((resolve,reject)=>{
|
45 | let js, //js内容
|
46 | signature, //签名
|
47 | miniJs;
|
48 |
|
49 | //读取文件内容
|
50 | if(m.pathInfo(config.src).extension === '.js'){
|
51 | js = m.fs.readFileSync(config.src).toString();
|
52 | signature = m.signature('.js');
|
53 |
|
54 | //压缩之后的js
|
55 | try {
|
56 | //压缩选项
|
57 | let uglify2Option = {
|
58 | fromString:true,
|
59 | output:{}
|
60 | };
|
61 |
|
62 | //开启美化则不启用混淆且格式化代码
|
63 | if(config.isBeautify){
|
64 | uglify2Option.compress = false;
|
65 | uglify2Option.mangle = false;
|
66 | uglify2Option.output.beautify = true;
|
67 | }else{
|
68 | uglify2Option.compress = {};
|
69 | uglify2Option.compress.screw_ie8 = false; //支持ie6-8
|
70 | uglify2Option.mangle = {};
|
71 | uglify2Option.mangle.except = ['$','require','exports']; //忽略的关键字
|
72 | uglify2Option.mangle.screw_ie8 = false; //支持ie6-8
|
73 | uglify2Option.output.beautify = false; //不美化代码
|
74 | };
|
75 |
|
76 | //先使用uglifyJS2来压缩,如果出错(不支持es6)则使用uglifyJS3
|
77 | miniJs = m.UglifyJS2.minify(js,uglify2Option).code;
|
78 | } catch (error) {
|
79 | //压缩选项
|
80 | let uglify3Option = {
|
81 | output:{}
|
82 | };
|
83 |
|
84 | //开启美化则不启用混淆且格式化代码
|
85 | if(config.isBeautify){
|
86 | uglify3Option.mangle = false;
|
87 | uglify3Option.output.beautify = true;
|
88 | }else{
|
89 | uglify3Option.mangle = {};
|
90 | uglify3Option.mangle.reserved = ['$','require','exports']; //忽略的关键字
|
91 | uglify3Option.output.beautify = false; //不美化代码
|
92 | };
|
93 |
|
94 | miniJs = m.UglifyJS3.minify(js,uglify3Option).code;
|
95 | };
|
96 |
|
97 | js = signature + miniJs;
|
98 | }else{
|
99 | reject({
|
100 | status:'error',
|
101 | msg:`${config.src} 不是有效的 JS 文件`
|
102 | });
|
103 | };
|
104 |
|
105 | //写入文件之前先创建好对应的目录
|
106 | let distDir = m.path.dirname(config.dist);
|
107 |
|
108 | m.fs.ensureDir(distDir,err => {
|
109 | if(err){
|
110 | reject({
|
111 | status:'error',
|
112 | msg:`${distDir} 创建失败`,
|
113 | info:err
|
114 | });
|
115 | };
|
116 |
|
117 | //写入文件
|
118 | try{
|
119 | m.fs.writeFileSync(config.dist,js);
|
120 | resolve({
|
121 | status:'success',
|
122 | msg:`写入 ${config.dist}`,
|
123 | data:js
|
124 | });
|
125 | }catch(err){
|
126 | reject({
|
127 | status:'error',
|
128 | msg:`${config.dist} 创建失败`,
|
129 | info:err
|
130 | });
|
131 | };
|
132 | })
|
133 | });
|
134 | }
|
135 | }
|
136 | module.exports = Compile;
|