MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Vue CLI 开发环境与生产环境的配置差异与优化技巧

2022-07-143.0k 阅读

一、Vue CLI 开发环境与生产环境概述

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,它为开发者提供了一套标准化的项目结构、开发流程以及构建工具。在开发过程中,我们通常会涉及到开发环境和生产环境,这两个环境有着不同的特点和需求。

开发环境主要是为了方便开发者进行代码的编写、调试和测试。在这个环境中,我们更注重开发效率,例如快速的热更新、详细的错误提示等功能,以便于我们能及时发现和修复代码中的问题。

而生产环境则是面向最终用户的环境,此时更强调应用的性能、稳定性和安全性。我们需要对代码进行优化,减少文件体积,提高加载速度,确保应用在各种网络环境和设备上都能流畅运行。

二、Vue CLI 开发环境配置

(一)基础配置文件

Vue CLI 的基础配置文件是 vue.config.js,在项目根目录下创建该文件,如果项目是通过 Vue CLI 3.x 及以上版本创建的,它会自动生成一些默认配置。在开发环境中,我们可以在这个文件中进行一些基本的配置。

例如,设置开发服务器的端口:

module.exports = {
  devServer: {
    port: 8080
  }
};

上述代码将开发服务器的端口设置为 8080,如果该端口被占用,Vue CLI 会自动尝试下一个可用端口。

(二)热更新配置

热更新(Hot Module Replacement,HMR)是开发环境中非常重要的一项功能,它允许在应用运行过程中,实时更新修改的模块,而无需刷新整个页面。Vue CLI 默认已经开启了热更新功能。

但有时候,我们可能需要对热更新进行一些自定义配置。比如,当我们在使用一些特殊的模块或插件时,可能会遇到热更新不生效的情况。这时,我们可以在 vue.config.js 中对 devServerhothotOnly 选项进行调整。

module.exports = {
  devServer: {
    hot: true,
    hotOnly: false
  }
};

hot 选项用于开启或关闭热更新功能,true 表示开启;hotOnly 选项设置为 true 时,热更新失败不会刷新页面,而是在控制台输出热更新失败的提示,这在某些情况下有助于我们更好地调试热更新相关问题。

(三)代理配置

在开发过程中,我们经常会遇到前端应用与后端 API 不在同一个域名下的情况,这就会导致跨域问题。Vue CLI 提供了代理配置来解决这个问题。

假设我们的后端 API 地址是 http://api.example.com,我们可以在 vue.config.js 中进行如下配置:

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://api.example.com',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
};

上述配置表示,当我们在前端代码中请求以 /api 开头的 URL 时,会将请求代理到 http://api.example.comchangeOrigin 设置为 true 是为了让目标服务器认为请求来自同源,pathRewrite 则是对请求路径进行重写,将 /api 前缀去掉,这样代理后的请求路径就与后端 API 实际的路径一致了。

(四)插件配置

在开发环境中,我们通常会使用一些插件来辅助开发,比如 vue - routervuex 等。以 vue - router 为例,我们首先通过 npm install vue - router 安装插件,然后在 src/router/index.js 文件中进行配置:

import Vue from 'vue';
import Router from 'vue - router';
import Home from '@/components/Home.vue';
import About from '@/components/About.vue';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    },
    {
      path: '/about',
      name: 'About',
      component: About
    }
  ]
});

这样,我们就可以在开发环境中使用路由功能了,通过 this.$router.push('/about') 等方式进行页面跳转。

三、Vue CLI 生产环境配置

(一)构建优化

  1. 代码压缩 生产环境中,为了减少文件体积,提高加载速度,我们需要对代码进行压缩。Vue CLI 默认使用 terser - webpack - plugin 对 JavaScript 代码进行压缩。在 vue.config.js 中,我们可以对压缩配置进行一些调整:
module.exports = {
  configureWebpack: {
    optimization: {
      minimizer: [
        new TerserPlugin({
          terserOptions: {
            compress: {
              drop_console: true
            }
          }
        })
      ]
    }
  }
};

上述代码中,drop_console: true 表示在压缩过程中删除所有的 console.log 语句,这样可以进一步减小代码体积。但需要注意的是,在开发环境中不要使用这个配置,否则会影响调试。

  1. 图片优化 对于图片资源,我们可以使用 image - webpack - loader 插件进行优化。首先通过 npm install image - webpack - loader --save - dev 安装插件,然后在 vue.config.js 中进行如下配置:
module.exports = {
  chainWebpack: config => {
    config.module
     .rule('images')
     .use('image - webpack - loader')
     .loader('image - webpack - loader')
     .options({
        mozjpeg: {
          progressive: true,
          quality: 65
        },
        // optipng.enabled: false will disable optipng
        optipng: {
          enabled: false
        },
        pngquant: {
          quality: [0.65, 0.90],
          speed: 4
        },
        gifsicle: {
          interlaced: false
        },
        // the webp option will enable WEBP
        webp: {
          quality: 75
        }
      })
     .end();
  }
};

这个配置对不同格式的图片进行了相应的优化设置,例如调整 JPEG 图片的质量,禁用或调整 PNG 图片的压缩参数等。

(二)性能优化

  1. 代码分割 随着项目规模的增大,JavaScript 代码体积也会越来越大。为了提高应用的加载性能,我们可以使用代码分割技术。Vue CLI 内置了对代码分割的支持,通过 import() 语法可以实现动态导入模块,从而实现代码分割。

例如,在路由配置中,我们可以将组件的导入改为动态导入:

import Vue from 'vue';
import Router from 'vue - router';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: () => import('@/components/Home.vue')
    },
    {
      path: '/about',
      name: 'About',
      component: () => import('@/components/About.vue')
    }
  ]
});

这样,当用户访问相应路由时,才会加载对应的组件代码,而不是在应用启动时就加载所有组件代码,从而提高了初始加载速度。

  1. 懒加载 懒加载与代码分割类似,也是为了提高性能。在 Vue 中,我们可以对图片等资源进行懒加载。例如,使用 vue - lazyload 插件。首先通过 npm install vue - lazyload 安装插件,然后在 main.js 中进行如下配置:
import Vue from 'vue';
import App from './App.vue';
import VueLazyload from 'vue - lazyload';

Vue.use(VueLazyload, {
  preLoad: 1.3,
  error: require('./assets/error.png'),
  loading: require('./assets/loading.gif'),
  attempt: 1
});

new Vue({
  render: h => h(App)
}).$mount('#app');

在模板中使用懒加载图片:

<template>
  <div>
    <img v - lazy="imageUrl" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageUrl: 'http://example.com/image.jpg'
    };
  }
};
</script>

这样,只有当图片进入视口时才会加载,避免了一次性加载大量图片,提高了页面的性能。

(三)安全性优化

  1. HTTPS 配置 在生产环境中,使用 HTTPS 协议可以提高数据传输的安全性,防止数据被窃取或篡改。如果你的服务器支持 HTTPS,可以在 vue.config.js 中配置开发服务器使用 HTTPS:
module.exports = {
  devServer: {
    https: {
      key: fs.readFileSync('/path/to/key.pem'),
      cert: fs.readFileSync('/path/to/cert.pem')
    }
  }
};

在实际生产部署中,需要将服务器配置为使用 HTTPS 协议,通常可以通过在服务器上安装 SSL 证书来实现。例如,在 Nginx 服务器上,可以通过如下配置启用 HTTPS:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://your_backend_server;
        proxy_set_header Host $host;
        proxy_set_header X - Real - IP $remote_addr;
        proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
        proxy_set_header X - Forwarded - Proto $scheme;
    }
}
  1. 防止 XSS 攻击 XSS(Cross - Site Scripting)攻击是一种常见的网络攻击方式,攻击者通过在网页中注入恶意脚本,获取用户的敏感信息。在 Vue 应用中,我们可以通过以下方式防止 XSS 攻击:
  • 使用 v - html 指令时进行严格过滤:当使用 v - html 指令渲染用户输入的 HTML 内容时,要对输入内容进行严格的过滤,只允许安全的标签和属性。例如,可以使用 DOMPurify 库进行过滤:
import DOMPurify from 'dompurify';

export default {
  data() {
    return {
      userInput: '<script>alert("XSS")</script>',
      sanitizedInput: ''
    };
  },
  created() {
    this.sanitizedInput = DOMPurify.sanitize(this.userInput);
  }
};
  • 对所有用户输入进行转义:在将用户输入显示到页面上时,使用 Vue 的内置转义机制,确保特殊字符被正确转义,防止恶意脚本被执行。例如:
<template>
  <div>
    {{ userInput }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      userInput: '<script>alert("XSS")</script>'
    };
  }
};
</script>

Vue 会自动将 userInput 中的特殊字符转义,显示为 <script>alert("XSS")</script>,而不会执行恶意脚本。

四、开发环境与生产环境配置差异总结

  1. 目标差异 开发环境侧重于提高开发效率,方便开发者进行代码编写、调试和测试,因此配置更注重快速反馈,如热更新、详细错误提示等。而生产环境则以提供高性能、稳定且安全的应用为目标,配置重点在于代码优化、性能提升和安全加固。

  2. 配置项差异

  • 开发服务器配置:开发环境中,开发服务器主要用于本地开发,关注端口设置、代理配置等,以方便与后端服务交互。生产环境中不存在开发服务器,但在部署时,可能需要配置服务器的反向代理等,以确保应用能正确运行。
  • 代码处理配置:开发环境中代码通常不进行压缩,以便于调试。而生产环境会对代码进行压缩,删除无用代码,减小文件体积。同时,生产环境会对图片等资源进行优化,而开发环境一般不会进行这些操作。
  • 插件使用差异:在开发环境中,我们可能会使用一些辅助开发的插件,如 vue - devtools 用于调试 Vue 应用。而在生产环境中,这些插件通常不会被使用,因为它们可能会增加应用体积或带来安全风险。
  1. 优化方向差异 开发环境的优化主要是为了让开发者能更高效地工作,如优化热更新性能。生产环境的优化则围绕用户体验,包括提高加载速度、减少资源占用、增强安全性等方面。

五、根据环境差异进行优化的技巧

  1. 动态加载配置 我们可以根据不同的环境动态加载不同的配置。例如,在 src/config 目录下创建 dev.jsprod.js 文件,分别存放开发环境和生产环境的配置。然后在 main.js 中根据 process.env.NODE_ENV 来加载相应的配置:
import Vue from 'vue';
import App from './App.vue';

if (process.env.NODE_ENV === 'development') {
  const devConfig = require('./config/dev.js');
  Vue.config.devtools = devConfig.devtools;
} else {
  const prodConfig = require('./config/prod.js');
  Vue.config.productionTip = prodConfig.productionTip;
}

new Vue({
  render: h => h(App)
}).$mount('#app');

这样可以灵活地根据环境调整配置,确保开发和生产环境都能得到合适的设置。

  1. 自动化脚本 可以编写自动化脚本,根据不同的环境执行不同的任务。例如,使用 npm scripts,在 package.json 中添加如下脚本:
{
  "scripts": {
    "dev": "vue - cli - service serve",
    "build": "vue - cli - service build",
    "deploy:dev": "npm run dev && echo 'Development environment deployed'",
    "deploy:prod": "npm run build && echo 'Production environment built and ready for deployment'"
  }
}

通过 npm run deploy:devnpm run deploy:prod 可以分别执行开发环境和生产环境的相关任务,提高开发和部署的效率。

  1. 代码分离与复用 对于一些在开发和生产环境中都需要使用的代码,可以进行分离和复用。例如,一些通用的工具函数、组件等。以工具函数为例,在 src/utils 目录下创建 util.js 文件:
export function formatDate(date) {
  return date.toISOString().split('T')[0];
}

在开发和生产环境的组件中都可以引入这个函数:

import { formatDate } from '@/utils/util.js';

export default {
  data() {
    return {
      currentDate: new Date()
    };
  },
  computed: {
    formattedDate() {
      return formatDate(this.currentDate);
    }
  }
};

这样既保证了代码的复用性,又便于根据不同环境对代码进行扩展和优化。

  1. 环境变量的合理使用 Vue CLI 支持使用环境变量来区分不同的环境。我们可以在项目根目录下创建 .env.development.env.production 文件,分别定义开发环境和生产环境的变量。例如,在 .env.development 中:
VUE_APP_API_URL=http://localhost:3000/api

.env.production 中:

VUE_APP_API_URL=http://api.example.com/api

然后在代码中通过 process.env.VUE_APP_API_URL 来获取相应环境的 API 地址,这样可以方便地在不同环境中切换 API 地址,而无需修改大量代码。

  1. 测试与监控 在开发环境中,要注重单元测试和集成测试,确保代码的质量。可以使用 jest 等测试框架进行单元测试,使用 cypress 等工具进行集成测试。例如,使用 jest 测试一个函数:
// src/utils/calc.js
export function add(a, b) {
  return a + b;
}

// src/utils/calc.test.js
import { add } from './calc.js';

test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});

在生产环境中,要建立完善的监控体系,及时发现和处理应用出现的问题。可以使用 Sentry 等监控工具,捕获应用中的错误和性能数据,以便及时进行优化和修复。例如,在 main.js 中集成 Sentry

import Vue from 'vue';
import App from './App.vue';
import Sentry from '@sentry/vue';

Sentry.init({
  Vue,
  dsn: 'YOUR_DSN_HERE'
});

new Vue({
  render: h => h(App)
}).$mount('#app');

这样,当应用在生产环境中出现错误时,Sentry 会捕获并发送错误信息,方便我们进行排查和修复。

通过以上对 Vue CLI 开发环境与生产环境配置差异的分析以及优化技巧的介绍,希望能帮助开发者更好地构建高效、稳定且安全的 Vue 应用。无论是开发环境还是生产环境,合理的配置和优化都是提高应用质量的关键。在实际开发过程中,要根据项目的具体需求和特点,灵活运用这些知识,打造出优秀的前端应用。