出现场景:
使用gulp开发web页面的,在打包的时候,控制台报了events.js:183, Unhandled ‘error’ event等错误。记录之。
问题描述:
在控制台中出入gulp,会运行写好的task任务,报错信息如下macdeMac-mini:job_admin mac$ gulp
[18:49:57] Using gulpfile ~/project/debug/job_admin/gulpfile.js
[18:49:57] Starting 'clear'...
[18:49:57] Starting 'src'...
[18:49:57] Finished 'src' after 18 ms
[18:49:57] Finished 'clear' after 39 ms
[18:49:57] Starting 'default'...
[18:49:57] Finished 'default' after 11 ms
events.js:183
throw er; // Unhandled 'error' event
^
Error
at new JS_Parse_Error (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:1534:18)
at js_error (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:1542:11)
at croak (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2089:9)
at token_error (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2097:9)
at unexpected (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2103:9)
at semicolon (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2123:56)
at simple_statement (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2314:73)
at eval (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2183:19)
at eval (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2136:24)
at block_ (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:2429:20)
原因分析:
我们在报错信息中看到如下路径at new JS_Parse_Error (eval at <anonymous> (/Users/mac/project/debug/job_admin/node_modules/uglify-js/tools/node.js:28:1), <anonymous>:1534:18)
其中最终是在 node_modules/uglify-js/tools/node.js 中抛出错误的,我在gulp的task任务中,用到了uglify-js 来压缩js文件。
猜想:
1、uglify-js 这个包是从npm上面下载,不大可能是这个包出现了问题。
2、不是这个包出问题,那就是这个包在干活的时候,遇到了问题并抛出了问题。
3、这个包是压缩js的,很有可能是在压缩项目的js文件时遇到了问题,得去看看是不是哪个js文件里面写的有问题。
解决方案:
在task任务中查看uglify-js压缩了如下目录的js代码//压缩 JS
minjs: function(){
var src = [
'./src/**/*.js'
,'!./src/config.js'
,'!./src/lib/extend/echarts.js'
];
return gulp.src(src).pipe(uglify())
.pipe(header.apply(null, note))
.pipe(gulp.dest(destDir));
}
这个task压缩了src所有后代目录下的js文件,这样js文件范围有点大。只能去靠猜是哪个js文件了。
经过一段时间对目标 js 文件注释,终于找到了罪魁祸首,是它是它就是它
options.data = options.data || {};
options.headers = options.headers || {};
if(request.tokenName){
let obj = [] // 就是这一行
obj[request.tokenName] = (layui.sessionData(setter.tableName)[request.tokenName] || '')
options.headers = options.headers || obj;
原因就是 let是es6的语法,而 uglify-js 居然无法处理 let。
要么先用babel把es6转成es5,要么直接写成var。这样 uglify-js 就可以正常工作了
长尾流量优化