UNPKG

4.72 kBJavaScriptView Raw
1'use strict';
2/**
3 * js文件处理
4 * - js文件压缩
5 * - 文件签名
6 *
7 * @class Compile
8 * {
9 * src:'', <string> 源文件路径
10 * dist:'', <string> 输出路径
11 * }
12 */
13class 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}
136module.exports = Compile;