程序在开发的过程当中,少不了打印调试用的日志,测试流程时伪造的数据。这些代码是不能出如今生产环境上的。
这意味着在程序打包前,须要把相关代码剔除掉。
这些事情用人手去作很麻烦,很容易疏漏。并且打包出来测试时遇到了bug,又得从新把测试代码添加回去。重复整个繁琐的过程。vue
既然人工作这么麻烦并且容易出错,那能不能用程序帮咱们完成这些事情呢?
固然能够,用选择性编译技术就行,本文就介绍在webpack下解决这一问题的方法。
其实这个方法在webpack官网就有提到,本文只是提供相关示例及作一些延伸。webpack
选择性编译是指根据打包是环境的不一样,选择性地让特定的语句有效,让特定的语句无效。
最简单的例子,在开发环境中,咱们打印日志,但在生产环境中,咱们让全部打印日志的语句无效(让程序不运行打印的语句,甚至让打包出来的文件根本就不包含打印日志的语句)。
选择性编译是笔者本身瞎想出来的名词,不知道用的对不对。
![]()
添加以下代码git
new webpack.DefinePlugin({ 'process.env': config.dev.env, IS_DEV: JSON.stringify(true), }),
添加以下代码github
new webpack.DefinePlugin({ 'process.env': config.dev.env, IS_DEV: JSON.stringify(false), }),
添加以下代码web
if (IS_DEV) { console.log('this is dev env'); } else { console.log('this is prod env'); }
this is dev env
。在生产环境下运行打印了this is prod env
。this is prod env
。咱们发现IS_DEV变成了false。由于浏览器在运行代码时,拿到的文件里面IS_DEV已经被替换成了true或者false,已经不存在IS_DEV这个变量。因此不会报错。chrome
如TEST_DATA: JSON.stringify({name:'momo',age:18}),npm
如:TWO: "1+1",TOW将被替换成这段代码的结果,即2。数组
ESLint是一个用来识别 ECMAScript 而且按照规则给出报告的代码检测工具,使用它能够避免低级错误和统一代码的风格。
配置了eslint的项目在使用选择性编译功能时,可能会报出这样的错误。
http://exlint.org/docs/rules/no-undef 'IS_DEV' is not defined
正如报错信息所说的,这是因为eslint检测代码时,发现IS_DEV没有定义(这侧面说明了eslint是先于条件编译执行的。ESLint检测时,IS_DEV尚未被替换掉)。解决这个问题有如下三种方法:
'eslint':'recommended'
(这是引用默认配置)。则往rules里面添加一条规则'no_undef':'warn'
,以覆盖掉默认配置。若是已经存在'no-undef'的配置,则直接改成'warn'就行。浏览器
用if逻辑判断来输出log可能略显繁琐。其实对于控制台输出的日志,咱们能够经过UglifyJs在打包时来剔除。
具体操做:app
打开build/webpack.prod.conf.js文件,添加以下语句
compress: { warnings: false, // 去除warning警告 drop_debugger: true, // 发布时去除debugger语句 drop_console: true // 发布时去除console语句 },
若是想只去除console.log,同时保留console.error等错误提示。能够指定去除特定的函数
compress: { warnings: false, // 去除warning警告 pure_funcs: ['console.log'], // 配置发布时,不被打包的函数 // drop_debugger: true, // 发布时去除debugger // drop_console: true // 发布时去除console }
注意,添加了这个配置之后,console.log在打包出来的文件就不存在了。因此前面测试用的this is dev env也会消失不见
例如咱们在条件编译打包出来的代码中
if (false) { console.log('this is dev env'); } else { console.log('this is prod env'); }
```console.log('this is dev env');```就是不可达代码。 咱们一样可使用UglifyJs的功能把这部分无用代码去除掉。让条件编译不留痕迹。 具体配置以下: ``` compress: { warnings: false, // 去除warning警告 dead_code: true, // 去除不可达代码 }, sourceMap: true ``` 
UglifyJs还用不少强大的功能,如代码混淆,压缩,重拍版等。这里附上UglifyJs官方网址。
英文很差的同窗还能够查看对应的中文文档(其实这才是重点#机智脸)。