条件编译,是指 用同一套代码和一样的编译构建过程,根据设置的条件,选择性地编译指定的代码,从而输出不一样程序的过程。通常用在C++、Java、C#这样的编译执行语言。对于javascript,咱们也可使用基于webpack
的js-conditional-compile-loader
插件实现相似的条件编译功能。javascript
咱们常常会遇到相似这样的需求:前端
使用条件编译的方法,能够优雅地解决这样的问题,同时代码维护方便,发布的程序包中也不会有多余的代码存在。vue
js-conditional-compile-loader插件是一个webpack的loader插件,它会在webpack处理js代码以前,将js代码根据设置的条件进行修改,去掉当前条件下不须要的代码,保留须要的代码,从而实现条件编译的功能。java
可参考这里的中文文档。webpack
npm i -D js-conditional-compile-loader
在rules中为js文件添加loader,做为第一步处理js文件,并配置编译条件。git
module: { rules: [ { test: /\.js$/, include: [resolve('src'), resolve('test')], use: [ //step-2 'babel-loader?cacheDirectory', //step-1 { loader: 'js-conditional-compile-loader', options: { isDebug: process.env.NODE_ENV === 'development', // optional, this is default myFlag: process.env.npm_config_ali, // any name, used for /* IFTRUE_myFlag ...js code... FITRUE_myFlag */ } }, ] }, //other rules ] }
插件支持IFDEBUG和IFTRUE两个条件编译指令。用法是:在js代码的任意地方以/*IFDEBUG
或/*IFTRUE_xxx
开头,以FIDEBUG*/
或FITRUE_xxx*/
结尾,中间是被包裹的js代码。xxx是在webpack中指定的条件属性名,如上面的myFlag。github
举个例子,web
咱们用这样的源代码:npm
/* IFTRUE_forAlibaba */ var aliCode = require('./ali/alibaba-business.js') aliCode.doSomething() /* FITRUE_forAlibaba */ $state.go('win', {dir: menu.winId /*IFDEBUG , reload: true FIDEBUG*/})
当webpack中插件的options配置为{isDebug: true, forAlibaba: true}
时,构建后输出的内容:element-ui
var aliCode = require('./ali/alibaba-business.js') aliCode.doSomething() $state.go('win', {dir: menu.winId, reload: true })
当webpack中插件的options配置为{isDebug: false, forAlibaba: false}
时,构建后输出的内容为:
$state.go('win', {dir: menu.winId})
如此便实现了条件编译。结合命令参数关联到环境变量,能够用命令参数指定不一样的编译条件。例如本文中的配置条件:myFlag: process.env.npm_config_ali
,执行命令时带上--ali
便可激活为true
:npm run build --ali
。
实际项目中能够按照你的须要尽情发挥。
这里是个完整项目的例子,可供参考。