VUE 条件编译

       —般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译(conditional compile)。 

                                                                                                                                                                                                                                                                                                                                                                         ----摘自百度百科

 

    条件编译对于后端程序猿来说可能都比较熟悉,那么VUE项目可以条件编译么? 答案是肯定的。 今天就把自己花了不少工夫的结论整理出来,供有需要的朋友参考。

 

               VUE项目要实现条件编译需要三个基本的步骤   1 前置条件    2 配置   3 使用

 

                前置条件

                      2个插件

js-conditional-compile-loader
      一个条件编译的webpack loader, 支持按条件构建各种代码文件,如js、ts、vue、css、scss、html等。
cross-env
     运行跨平台设置和使用环境变量的脚本。

安装插件
npm i -D js-conditional-compile-loader
npm i -D cross-env

 

        配置

                  vue.config.js

let timestamp = new Date().getTime(); //当前时间为了防止打包缓存不刷新,所以给每个js文件都加一个时间戳
// vue.config.js
module.exports = {
  //设置输出目录
  outputDir: process.env.ENV_CONFIG === "public" ? "distPublic" : "distPrivate",

  // 对webpack的设置,该对象将会被 webpack-merge 合并入最终的 webpack 配置。
  configureWebpack: {
    output: {
      filename: `js/[name].${timestamp}.js`, // 每次构建打包时给文件名加上时间戳,确保每次版本更新的文件名不一样
      chunkFilename: `js/[name].${timestamp}.js`,
    },
  },

  //更细粒度的控制其loader内部配置
  chainWebpack: (config) => {
    let vueRule = config.module.rule('vue')
    vueRule
      .use("js-conditional-compile-loader")
      .loader("js-conditional-compile-loader")
      .tap(() => {
        return {
          // isDebug: process.env.NODE_ENV === "development", // optional, this expression is default   development  production
          public: process.env.ENV_CONFIG === "public", // any prop name you want, used for /* IFTRUE_public ...js code... FITRUE_public */
        };
      })
      .end();
  },
};

 

 

          package.json 

 

"scripts": {
    "serve": "cross-env ENV_CONFIG=public vue-cli-service serve",
    "build-public": "cross-env ENV_CONFIG=public vue-cli-service build",
    "build-private": "cross-env ENV_CONFIG=private vue-cli-service build",
    "lint": "vue-cli-service lint
 }

 

 

   使用

<template>
  <div class="hello">
    /*IFTRUE_public*/
    <div class="public">公有云</div>
    /*FITRUE_public*/

    <div class="public private">私有云</div>
  </div>
</template>

<script>
export default {
  mounted() {
    /*IFTRUE_public*/
    console.log(1111111);
    /*FITRUE_public*/

    console.log(2222222222);
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
/*IFTRUE_public*/
.public {
  color: red;
} /*FITRUE_public*/

.private {
  font-size: 40px;
}
</style>

 

posted @ 2021-06-18 16:21  扫地僧2015  阅读(2207)  评论(0编辑  收藏  举报