最近在对老项目(多老呢..多是几年前的吧,比本身入职的时间还久>_<)进行修改。不少时候发现改代码比较简单,可是不简单的是构建问题。笔者在构建的项目是使用的gulp,发如今构建的时候遇到问题,本篇文章主要记录发现问题和解决问题的过程,提供解决构建问题的思路,但愿对遇到一样问题的伙伴有所帮助
项目中使用的构建工具gulp,gulp 是一个基于流的构建工具,能够自动执行指定的任务,想了解更多参考gulp官网。其中有一个指令是使用gulp-webpack 进行js 打包、gulp-uglify 进行压缩,具体内容以下:node
gulp.task("webpack", function() { return gulp.src("./js/index.js") .pipe(webpack(webpackConfig)) .pipe(uglify({ mangle: false })) .pipe(gulp.dest(path.build + "/js/")); }); // webpack.config.js module.exports = { entry:{ "index":"./js/index.js" }, output:{ filename: "[name].js", }, plugins: [//...] }
执行指令以后发现并未顺利的在build 的文件夹中找到index.js,具体错误内容以下:webpack
internal/streams/legacy.js:57 throw er; // Unhandled stream error in pipe. ^ Error at new JS_Parse_Error (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:1526:18) at js_error (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:1534:11) at croak (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2026:9) at token_error (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2034:9) at unexpected (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2040:9) at expr_atom (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2542:13) at maybe_unary (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2716:19) at expr_ops (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2751:24) at maybe_conditional (eval at <anonymous> (D:\git\study\yyb_test\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2756
1.输出更多的错误日志git
根据错误提示是gulp 在进行代码压缩的时候报错,所以想可以输出更多的日志呢,给uglify加入错误捕获web
`.pipe(uglify({ mangle: false }).on('error', function (err) { console.log( err ) }))`
在进行构建后错误日志以下:npm
message: 'D:\\git\\study\\yyb_test\\index.js: Unexpected token: punc ())', fileName: 'D:\\git\\study\\yyb_test\\index.js', lineNumber: 148, stack: 'Error\n at new JS_Parse_Error (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:1526:18)\n at js_error (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:1534:11)\n at croak (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2026:9)\n at token_error (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2034:9)\n at unexpected (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2040:9)\n at expr_atom (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2542:13)\n at maybe_unary (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2716:19)\n at expr_ops (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2751:24)\n at maybe_conditional (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2756:20)\n at maybe_assign (eval at <anonymous> (D:\\git\\study\\yyb_test\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2780:20)', showStack: false, showProperties: true, plugin: 'gulp-uglify' }
2.根据错误关键词搜索
根据关键词 Unexpected token: punc ())
进行Google后发现,原来是代码中有 ES6语法。那么解决方案就是将ES6 的代码转为 ES5,那么如何定位具体的位置呢。gulp
3.问题位置定位
在输出错误信息的时候有个lineNumer: 148,这个是什么呢。根据uglify 的原理应该是讲构建源码进行压缩,所以猜想是不是压缩代码的输入内容,所以尝试去掉uglify压缩功能。
去掉压缩功能后在bulid/index.js
生成对应的文件,快速查找到最后148行后发现以下:
原来是咱们本身的npm 模块中有个箭头函数。
4.解决问题
修改对应的npm 包中箭头函数语法并npm publish,更新npm 包后再构建,发现就成功了!!函数
[17:30:50] Starting 'webpack'... [17:30:50] Version: webpack 1.12.14 Asset Size Chunks Chunk Names index.js 16.5 kB 0 [emitted] index [17:30:50] Finished 'webpack' after 328 ms
解决的方式虽然很简单,可是关键的是要有定位问题的能力:输出更多的错误日志,了解相关原理大胆猜想,或者使用断点调试的方式来定位问题。但愿此思路能对你们解决构建问题能有所帮助,那么就在开心不过了.工具