create-react-app 使用 webpack 打包压缩失败

问题,正常 npm run build 打包后,发现打包后的文件异常大,有 > 20M 的大小 

分析,

  1、起初以为是代码本身过大的原因导致的,所以一直在想如何进行代码拆分使得文件能尽可能的小,但是查询了很多资料都没找到为什么文件会过大

  2、后来认真看了一下一直被我自动忽略的 npm run build 的报错信息,发现了这句话:Failed to minify the code from this file. 由于下面的文件导致文件压缩失败

  

  于是,顿悟啊,原来不是因为模块没分割导致的文件过大,而是因为文件压缩失败呀

3、定位问题

  找到相应的文件,发现是因为项目组的同事使用的 supermap 插件导致的压缩失败。

  那怎么办呢?尝试修改报错的当前行的内容,继续进行编译,发现仍是不能成功。

  并且,修改node_modules的方法并不是一劳永逸的办法,因为只要执行一次 npm install node_modules的代码就会发生改变。

  于是,决定单独摘出该插件以及该插件的相关内容。

4、解决方法:报错文件摘出

  1、首先想到的办法是,使用 webpack 的 externals 扩展,将我所使用的 supermap插件,以普通 script 标签的形式引入 index.html 页面,然后在webpack中暴露出扩展插件

    此时,问题又来了。我所使用的 supermap 插件是基于 leaflet 的,这样的话,我需要将 leaflet 同样以上述形式通过 script 标签引入。于是尝试引入,引入后问题又来了。发现不但要引入 leaflet 的 js 文件,还要再引入他的 css 文件。于此种种各种尝试,发现耗伸耗力,终究还是有问题,所以果断放弃。

  2、然后想到的方法是,单独把 supermap 的文件摘出,但不是用 script 文件引入,而是放到自己的项目的目录中,当作自己的普通 js 引入。

    通过查看代码,发现使用的是 supermap 中 echartsLayer 中暴露的内容,因此,找到 echartsLayer.js 源码然后放入到项目中。

    此时发现,只用 echartsLayer.js 不够的,因为他还引用了别的 js ,然后进行相应的增加。

            

    

    这样子此时就完美了,把所有需要的都单独引入。可是又遇到了个小问题,报错说 zoom... 什么什么的,然后发现,是因为 Proj4Leaflet.js 的版本问题

    

    

    发现同事使用的是通过 npm 安装的 proj4leaflet 安装的 js ,因此进行替换,运行OK。此时问题就完全解决了。

    npm run build 打包后只有 7M......

5、总结:看报错信息的重要性!看报错信息的重要性!看报错信息的重要性!(重要的信息说三遍)

  我们时常会忽略 npm 的报错信息,觉得只要编译远程运行成功就万事大吉了。可是,现实告诉我,能够运行成功并不是没有问题。

6、进阶:首屏加载 7M 的文件显然并不是最有方案

  这篇文章 会通过使用 react-router4 的分片加载,进行打包优化。

  

posted @ 2019-01-17 10:50  z春眠不觉晓z  阅读(1703)  评论(0编辑  收藏  举报