2017-08-04-webpack踩坑

Posted by XuBaoshi on August 4, 2017

webpack踩坑

本人所谓的踩坑归根结底还是对官方文档的理解的不透彻,最近项目组将webpack由1.x升级到了webpack3.x,升级时遇到的一些问题及解决方法汇总如下:

webpack3.x 兼容性

使用webpack1.x 打包后的js是可以支持ie8的,但使用webpack3.x后则不可以。报错如下:

/img/webpack-pit/ie8.jpg

Object.defineProperty es5的语法,在ie8是不支持的。

resolve modules选项

resolve.modules该参数为一个数组,它的作用为告诉webpack去何处搜索依赖的文件,如果没有设置resolve.modules,则默认指向[‘node_modules’]。如果想特殊指明文件区域,将文件路径添加即可。有一个地方需要注意的是,别忘了将‘node_modules’(最好放在所有自定义路径的后面)加入进去,如果resolve.modules的数组内没有‘node_modules’,书写的js代码中如果依赖了‘node_modules’的库文件,webpack编译时将找不到会抛错。

/img/webpack-pit/resolve-module1.jpg

附:webpack官方文档

/img/webpack-pit/resolve-modules2.PNG

grunt uglify 报错

由于之前的系统使用grunt作为构建工具,并非所有的js都归webpack进行管理,在打包发布时webpack只是grunt中其中一步,使用grunt-contrib-uglify会扫描指定的js文件并进行压缩,但如果某个js文件中出现了es6的语法时,grunt-contrib-uglify会检测出语法出错,编译终止了(虽然可以使用–force,但做法有点糊弄人)。报错如下:

/img/webpack-pit/grunt-uglify1.PNG

解决方案:grunt-contrib-uglify 可以做两个task,一个是针对es5的uglify,而一个是针对es6的,针对es6的task的先使用grunt-babel插件进行处理一下,然后在进行grunt-contrib-uglify处理。

/img/webpack-pit/grunt-uglify2.jpg

devTool 选项

sourceMap

http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html

7个 devTool区别

http://www.cnblogs.com/hhhyaaon/p/5657469.html

在使用webpack-dev-server或者webpack-dev-middleware时推荐使用 cheap-module-eval-source-map

  • 大部分情况开发时并不关心列信息,而且就算 sourcemap 没有列,有些浏览器引擎(例如 v8) 也会给出列信息,所以我们使用 cheap 模式可以大幅提高 souremap 生成的效率
  • eval 方式可大幅提高持续构建效率,参考webapck devtool速度对比列表

/img/webpack-pit/devtool.PNG