不积跬步--Error index.a0a9eebd.js from UglifyJs 的解决过程

一个难题的价值不仅仅是难题本身,更加有收获的是解决它的过程。

这个bug在网上就可以搜索到解决的答案uglify 压缩报错问题及 es5-imcompatible-versions,建议看这篇文字之前可以先看上面的文章,直接看视频比较直观。如果看完上面的还没有解决,可以看我下面的解决过程。

    Failed to minify the bundle. Error: index.a0a9eebd.js from UglifyJs

什么是 Error: index.a0a9eebd.js from UglifyJs ?

就是当我们运行roadhog build完以后进行压缩的时候发生的错误,因为我们在webpack默认打包的时候,一般都不会对node_modules里面的包进行babel的编译,所以业界有一个默认的规定是你发布包之前应该先把发布的包编译成es5的代码,然后再发布上去。但是就是有一些包并不会遵守这条约定。

所以就造成我们打完包以后,包里有了es6的代码,从而造成压缩的失败。

怎么解决?

sorrycc大佬的文章里已经提供了解决的办法。大家可以直接看视频比较直观。

升级roadhog或者是Umi到最新版。

打开下面的设置:

  es5ImcompatibleVersions: true,
  extraBabelIncludes:[
      // "node_modules/chalk",
      // "node_modules/ansi-styles",
      // "node_modules/ansi-html",
  ]

es5ImcompatibleVersions这个开关设置为true的时候,roadhog打包的时候会对node_modules里的包进行检查,检查到有es5ImcompatibleVersions里设置的 没有打包为es6代码的包。就会对其进行编译。这样就不会出现上面的错误了。

打开以后还是无法解决怎么办呢?

这个时候你就需要自己找到这个包,然后把它添加到extraBabelIncludes里,在打包的时候也会对这里设置的目录进行额外的编译。

那么应该怎么找到这个包呢?

我们看这个错误:

PS C:\Users\玉丽\Desktop\company_work\vitark-web-ui> npm run build

> vitark-web-ui@2.0.0-beta.1 build C:\Users\玉丽\Desktop\company_work\vitark-web-ui
> cross-env  ESLINT=none roadhog build

Build completed in 33.772s

Failed to compile.


Failed to minify the bundle. Error: index.a0a9eebd.js from UglifyJs
Unexpected token: name (matches) [index.a0a9eebd.js:89727,5]
    at doneHandler (C:\Users\玉丽\Desktop\company_work\vitark-web-ui\node_modules\af-webpack\lib\build.js:91:27)
    // ... 
Read more here: http://bit.ly/2tRViJ9

看上面的错误,在第二行,我们可以看到有标识,写着196155,这个就是发生错误的地方。

我们通过上面的行数从打包的文件里找到那一行,

/***/ "FnaF":
/***/ (function(module, exports, __webpack_require__) {

"use strict";

const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;

发现这里确实是有es6的代码。然后通过找到一个比较特别的方法,在node_modules里搜索。

发现这一段代码是属于prettier包的,prettier包是一个工具包。不应该出现在打好的包里呀?
我这里很疑惑,还去请教了sorrycc大佬。大佬告诉我说这是一个工具包,不应该出现在打包的包里。让我去排查一下。

然后我通过查看package-lock.json文件,找到了引用它的位置。

发现在react-slick@0.23.2中,它的dependencies生产环境配置中居然引用了prettier代码。我欣喜若狂,以为找到了我想要的答案。

然后我查看了react-slicknode_modules里的package.json中的引用,果然是这样。
大家也可以通过npm view react-slick这个命令来查看包的情况。

npm view react-slick

react-slick@0.23.2 | MIT | deps: 6 | versions: 89
 React port of slick carousel
https://github.com/akiran/react-slick

keywords: slick, carousel, Image slider, orbit, slider, react-component

dist
.tarball: https://registry.npmjs.org/react-slick/-/react-slick-0.23.2.tgz
.shasum: 8d8bdbc77a6678e8ad36f50c32578c7c0f1c54f6
.integrity: sha512-fM6DXX7+22eOcYE9cgaXUfioZL/Zw6fwS6aPMDBt0kLHl4H4fFNEbp4JsJQdEWMLUNFtUytNcvd9KRml22Tp5w==
.unpackedSize: 322.1 kB

dependencies:
classnames: ^2.2.5               json2mq: ^0.2.0                  prettier: ^1.14.3
enquire.js: ^2.1.6               lodash.debounce: ^4.0.8          resize-observer-polyfill: ^1.5.0

maintainers:
- akiran <kiran.coder0@gmail.com>

dist-tags:
latest: 0.23.2

published 5 months ago by akiran <kiran@neostack.com>
PS C:\Users\玉丽\Desktop\company_work\vitark-web-ui>

然后这个react-slick是在antd下面的引用。

哦哦,原来是因为你的原因。我去检查了react-slick线上的发布的包,发现只有最新版0.23.2中有这个问题。而在过去的发布的包中并没有引用prettier

我果断降级安装了npm install react-slick@0.23.1 --save dev这个包。

现在项目里没有了引用prettier的代码,应该不会报这个错误了。

为了保险起见,我把prettier添加到了编译的数组里。

  es5ImcompatibleVersions: true,
  extraBabelIncludes:[
       "node_modules/prettier",
  ]

打包,结果还是发生错误。

开始检查所有的引用连接,通过搜索prettier发现非常多的包用到了这个prettier,但是他们基本全都是在devDependencies中。并没有发现在dependencies中引用的代码。

我把prettier这里包都删除掉了,结果还是能发现它的代码在里面,幽灵代码啊。

这个时候我想到了另一种解决思路,在文章中提到的可以通过babel 7来编译node_modules,通过升级发现roadhog 2.5的最新版本是用的babel 7,然后我设置了

  es5ImcompatibleVersions: true,
  extraBabelIncludes:[
       "node_modules",
  ]

编译node_modules下所有的包,顺利通过编译,没有报错。

但是,打出来的包有问题,甚至不能在谷歌浏览器里运行。说明在编译的时候对编译过的代码重新编译出现了错误。

还是绕不开这个问题。

怎么办?我想到了一个办法,手动编译,具体思路是这样。

设置编译所有的代码,也就是编译node_modules里的代码。

  es5ImcompatibleVersions: true,
  extraBabelIncludes:[
       "node_modules",
  ]

然后运行下面的命令,它会打包,但是不会压缩。

 "builds": "cross-env ESLINT=none COMPRESS=none roadhog build",

运行完成以后拷贝出来,然后把上面的//"node_modules",注释掉。

重新运行打包命令,然后找到上一次出问题的代码,把里面的es6的代码在我们第一次打包的文件中找到。

/***/ "FnaF":
/***/ (function(module, exports, __webpack_require__) {

"use strict";

可以搜索模块前面的字符串标识,Fnaf来找到。然后替换。

ie浏览器中运行。

既然我们替换了es6的代码,那么它就可以运行了,但是并没有,从ie的报错里,我们找到报错的地方,发现又是一处新的es6代码,按照之前的步骤,我们通过搜索关键字找到它的模块,然后把这个模块添加到

es5ImcompatibleVersions: true,
  extraBabelIncludes:[
       "node_modules/chalk",
       "node_modules/ansi-styles",
       "node_modules/ansi-html",
  ]

重新打包,找到新的错误代码,重复这个过程,直到找到所有的es6的包。

就是这样,按个找到了这些模块。

这就是折磨了我好几天的这个bug的解决过程。

还好最后解决了...在解决的过程还是学到很多东西的,也发现了之前自己认识上的不足。

嗯嗯,就这样。

有什么问题可以随时问我,关于这个错误的。

对这个问题的更新 按照这个步骤来就可以了!

发现其他的同事上面居然不能运行,不应该呀,通过上面的步骤按个找:
1.运行 npm run build
2.查看错误的行数,例如:119999
3.打开打包的.js文件,
4.通过快捷键ctrl+G跳转到119999这一行,可以看到出问题的代码,
5.复制一行特别的代码(特别的代码就是不容易在其他的包里重复的)
6.在node_modules里搜索这个代码。
7.顺利的话,你会定位到那个包,发现这个包里包含了ES6的代码。
8.在extraBabelIncludes里添加。

 extraBabelIncludes:[
       "node_modules/chalk",
       "node_modules/ansi-styles",
       "node_modules/ansi-html",
  ]

9.如果在搜索的时候发现有很多,你可能定位了很多的包,其实有可能是很多包都引用了同样的包,
然后再它们自己下面的node_modules里维护。
10.解决办法就是用yarn add chalk来安装这个包,yarn会对包进行识别,如果很多包使用了同样的包,那么它会只维护一个包,而不是各自引用各自自己的。
11.当然你也可以添加不同的路劲,把它们都放进去就可以了。只要能找到。

2019年10月29日更新:
在最新的Umi版本下的,改为这样处理:

 es5ImcompatibleVersions: true,
    extraBabelIncludes: [
        require('path').resolve(__dirname, 'node_modules/swiper'),
        require('path').resolve(__dirname, 'node_modules/chalk'),
        require('path').resolve(__dirname, 'node_modules/ansi-styles'),
        require('path').resolve(__dirname, 'node_modules/@babel/highlight'),
        require('path').resolve(__dirname, 'node_modules/@babel/code-frame'),
        require('path').resolve(__dirname, 'node_modules/eslint-plugin-react'),
        require('path').resolve(__dirname, 'node_modules/@bundled-es-modules'),
    ],

over...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 共 4741 字,读完需 8 分钟,速读 2 分钟。我有幸参与了该项目的部分中文版翻译、校对工作,感谢 Sacha...
    王仕军阅读 980评论 0 11
  • 一、工具准备 WebStorm - 下载 Nodejs - 下载 Chrome - 下载 下载并安装以上工具 二、...
    游戏小狗狗阅读 6,150评论 0 4
  • 学习流程 参考文档:入门Webpack,看这篇就够了Webpack for React 一. 简单使用webpac...
    Jason_Zeng阅读 3,141评论 2 16
  • 一朝一夕,一点一滴 用酒粉刷僵硬的战旗 纵然破军十万于尘嚣 仍难逃脱内心生长的圆里 溶情于水 漫延四千一百公里 我...
    租了五颗星阅读 170评论 1 4
  • 每一个喜欢民谣的人,都会被其中各不相同的旋律,却又充满故事的描述性语言所打动。 如果你能听到一首歌,就身临其境,觉...
    三言堂居阅读 400评论 2 5