vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)

yizhihongxing

下面是实现分环境打包的步骤:

步骤一:配置不同环境的参数

Vue项目中,我们可以通过创建不同的环境变量文件来配置不同环境中的参数。比如我们可以通过创建.env.development.env.production.env.test等文件分别配置开发环境、生产环境和测试环境的参数。其中以VUE_APP_前缀的变量可以在项目中通过process.env对象来使用,例如process.env.VUE_APP_API_URL

下面是一个示例的.env.development文件:

VUE_APP_API_URL=http://localhost:3000/api

步骤二:修改webpack打包配置

我们可以使用Vue CLI提供的vue.config.js文件来修改webpack的打包配置。在这个文件中,我们可以通过configureWebpack属性来覆盖默认的配置,也可以通过chainWebpack属性来链式调用配置。下面是一个示例的vue.config.js文件,假设我们要区分开发环境和生产环境:

const path = require('path')

module.exports = {
  chainWebpack: config => {
    if (process.env.NODE_ENV === 'production') {
      // 生产环境下的配置
      config
        .entry('app')
        .clear()
        .add('./src/main-prod.js')
      config.plugin('html').tap(args => {
        args[0].isProd = true
        args[0].minify.minifyCSS = true
        return args
      })
      config.set('externals', {
        vue: 'Vue',
        'vue-router': 'VueRouter',
        axios: 'axios',
        lodash: '_',
        echarts: 'echarts',
        nprogress: 'NProgress',
        'vue-quill-editor': 'VueQuillEditor'
      })
      config.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
          vendor: {
            name: 'vendor',
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
            chunks: 'initial'
          }
        }
      })
      config.optimization.runtimeChunk('single')
    } else {
      // 开发环境下的配置
      config
        .entry('app')
        .clear()
        .add('./src/main-dev.js')
      config.plugin('html').tap(args => {
        args[0].isProd = false
        return args
      })
    }
  }
}

在这个示例中,我们使用了process.env.NODE_ENV来判断当前的运行环境,进而修改webpack的配置。在生产环境下,我们修改了入口文件、使用html-webpack-plugin插件将一些参数注入HTML中、使用set方法来设置外部的CDN引入等等。在开发环境下,我们只是修改了入口文件。

步骤三:配置不同的打包命令

我们可以在package.json文件中配置不同的打包命令以区分开发环境和生产环境。比如我们可以通过npm run build:devnpm run build:prod来分别打包开发环境和生产环境的代码。下面是一个示例的package.json文件:

{
  "name": "my-project",
  "version": "0.1.0",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build:dev": "vue-cli-service build --mode development",
    "build:prod": "vue-cli-service build --mode production",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "axios": "^0.19.2",
    "core-js": "^3.4.3",
    "echarts": "^4.7.0",
    "element-ui": "^2.13.2",
    "js-cookie": "^2.2.1",
    "lodash": "^4.17.15",
    "moment": "^2.24.0",
    "nprogress": "^0.2.0",
    "vue": "^2.6.11",
    "vue-quill-editor": "^3.0.6",
    "vue-router": "^3.1.5",
    "vuex": "^3.1.2"
  }
}

在这个示例中,我们通过--mode选项来指定打包的环境。npm run build:dev是以开发环境的方式进行打包,npm run build:prod是以生产环境的方式进行打包。

示例1:基于VUE_APP_ENV变量区分不同环境配置

有时我们需要在多种环境中打包,但每个环境的配置不仅仅是API地址等一些常规配置不同外,还可能存在某些逻辑或者插件在不同环境中的启动模式不同。此时我们可以基于环境变量来划分不同环境,并区分配置不同的npm script命令

VUE_APP_ENV=dev #或者test, production等, 指定不同的环境变量
VUE_APP_API_ROOT=http://api.dev.com/ #dev环境的API请求地址
VUE_APP_START_MODE=autostart #或者manualstart, 是开机自启动还是手动启动逻辑

index.html中设置环境变量,在main.js或者需要的组件中读取环境变量

//index.html
<script>
  window.env = {
    VUE_APP_ENV: process.env.VUE_APP_ENV,
    VUE_APP_API_ROOT: process.env.VUE_APP_API_ROOT,
    ...
  };
</script>

//main.js中读取
console.log(process.env.VUE_APP_ENV);//dev
console.log(process.env.VUE_APP_API_ROOT);//http://api.dev.com/

具体通过configureWebpack属性为webpack的全局变量添加赋值

//vue.config.js
module.exports = {
    configureWebpack: {
        plugins: [
            new webpack.DefinePlugin({
                env: JSON.stringify(process.env.VUE_APP_ENV)
            })
        ]
    }
}

//main.js中读取
console.log(env);//dev

通过env来判断使用环境

//main.js
const env = process.env.VUE_APP_ENV;

if (env === "dev") {
    ...
} else if (env === "test") {
    ...
} else {
    ...
}

package.json中基于不同的env值区分不同的npm script命令

"scripts": {
  "build:dev": "VUE_APP_ENV=dev vue-cli-service build",
  "build:test": "VUE_APP_ENV=test vue-cli-service build",
  "build:prod": "VUE_APP_ENV=production vue-cli-service build"
},

使用npm run build:dev命令可以打出NODE_ENV为development,VUE_APP_ENV为dev的包.

示例2:基于命令行参数区分不同环境配置

小项目常常只需区分两个环境:开发环境和生产环境。此时,基于命令行参数来设置特定的环境变量以区分环境也是非常方便的方式。

除了process.env.NODE_ENV变量,我们可以使用process.argv变量来获取命令行参数。例如,我们可以在命令行中使用--env=dev来设置VUE_APP_ENV变量为dev。下面是一个示例:

//设置dev环境变量
node build.js --env=dev

build.js中解析命令行参数

const args = require('minimist')(process.argv.slice(2));
const env = args.env || 'production'; //默认为生产环境

具体区分不同环境

if (env === "dev") {
    ...
} else {
    //在命令行中不传env参数,即--env使用默认生产
    process.env.NODE_ENV = "production";
    ...
}

完整的build.js示例

const fs = require('fs');
const path = require('path');
const minimist = require('minimist');
const { build } = require('vite');
const resolve = (dir) => path.join(__dirname, '..', dir);
const args = minimist(process.argv.slice(2));
const env = args.env || 'production';

async function main() {
  try {
    //Step 1: create a vite build client
    const clientResult = await build({
      root: resolve('.'),
      mode: env,
      configFile: resolve(`vite.${env}.js`),
      build: {
        ssr: false,
        outDir: resolve(`dist/${env}`),
        assetsDir: 'assets',
        rollupOptions: {
          output: {
            entryFileNames: 'assets/[name].[hash].js',
            chunkFileNames: 'assets/[name].[hash].js',
            assetFileNames: 'assets/[name].[hash].[ext]',
          },
        },
      },
    });

    console.log('正常结束')
    return clientResult
  } catch (e) {
    console.error(e)
    process.exitCode = 1
  }
}

main()

这样,我们就完成了Vue项目的分环境打包步骤,可以通过命令行执行不同的打包命令来打出不同环境的代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现分环境打包步骤(给不同的环境配置相对应的打包命令) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue通过过滤器实现数据格式化

    下面就是vue通过过滤器实现数据格式化的完整攻略: 1. 什么是vue过滤器 在vue中,过滤器(Filter)是一种可复用的方法来格式化文本。它可以像管道一样在文本插值和v-bind表达式中使用。 2. 过滤器的语法 Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”字符指示: …

    Vue 2023年5月27日
    00
  • Vue3 源码解读之副作用函数与依赖收集

    作为Vue3的主要开发者之一,核心团队成员黄轶(尤雨溪)在个人博客上分享了Vue3源码解读系列文章,其中就包括了“副作用函数与依赖收集”这一主题。 以下是该主题的完整攻略: 1. 副作用函数 副作用函数(Effect Function)是Vue3源码中的一个重要概念。在React Hook中有个类似的概念,叫做副作用钩子(Effect Hook),可以用来处…

    Vue 2023年5月27日
    00
  • vue如何使用cookie、localStorage和sessionStorage进行储存数据

    让我来为你详细讲解Vue如何使用cookie、localStorage和sessionStorage进行数据储存。 什么是cookie、localStorage和sessionStorage? Cookie:HTTP是一种无状态协议,为了记录用户的状态,引入了cookie技术。Cookie是存储在浏览器中的小型文本文件。它通过在用户计算机中存储信息来跟踪用户…

    Vue 2023年5月27日
    00
  • vue添加axios,并且指定baseurl的方法

    下面为你详细讲解“Vue添加Axios,并且指定BaseURL的方法”: 1. 安装 Axios 我们需要先安装 Axios 库,可以通过 npm 安装,命令如下: npm install axios –save 2. 引入 Axios 安装完成后,我们需要先引入 Axios 库,建议在 main.js 中引入,然后在 Vue.prototype 上挂载 …

    Vue 2023年5月29日
    00
  • Vue 大文件上传和断点续传的实现

    实现 Vue 大文件上传和断点续传需要掌握以下几个步骤: 分片:将大文件分割成若干个小块,便于上传。一般采用 Blob 对象或 ArrayBuffer 来实现。 上传:将分片文件上传到服务器。可以使用 XMLHttpRequest、Fetch 等工具进行上传。 断点续传:如果上传失败或上传过程中断开连接,需要记录已上传的分片,下次上传时跳过已上传的分片。 合…

    Vue 2023年5月28日
    00
  • 3种vue路由传参的基本模式

    当我们使用 Vue.js 构建单页应用(SPA)时,Vue Router 是一项必不可少的插件,它提供了路由切换、嵌套路由、路由参数、路由导航钩子等功能。除此之外,Vue Router 还支持路由传参,使我们可以很方便地将数据传递给组件,并根据传递的参数动态渲染界面。下面,我们将介绍常用的 3 种 Vue 路由传参的基本模式。 1. 动态路由 动态路由是 V…

    Vue 2023年5月28日
    00
  • vue-router路由懒加载及实现方式

    什么是路由懒加载 路由懒加载也被称为按需加载,是一种优化策略,主要是用来加速大型单页应用程序的加载速度。通常情况下,SPA应用程序由多个页面分别对应不同的路由,这些页面通常会一次性加载进浏览器中,然而这样的一干式加载很容易造成文件过大,页面加载速度缓慢。 利用路由懒加载机制,我们可以延迟加载应用程序的某些组件模块,一旦用户进入相应的路由,才加载这个模块,这样…

    Vue 2023年5月28日
    00
  • Vue 中使用vue2-highcharts实现曲线数据展示的方法

    接下来我将详细讲解“Vue 中使用vue2-highcharts实现曲线数据展示的方法”的完整攻略。首先介绍一下vue2-highcharts,它是一种基于Highcharts的Vue2.x插件,可以在Vue项目中方便地使用Highcharts图表。接下来,我将深入讲解如何使用vue2-highcharts来实现曲线数据展示。 步骤一:安装vue2-high…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部