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

Vue CLI 常见问题与解决方案总结

2021-03-096.6k 阅读

安装问题

安装失败:网络问题

在使用 npm install -g @vue/cli 安装 Vue CLI 时,最常见的问题之一就是网络问题。npm 默认从国外的服务器下载包,在网络不稳定或者存在网络限制的情况下,安装过程可能会失败。

错误提示

npm ERR! code ECONNRESET
npm ERR! errno ECONNRESET
npm ERR! network socket hang up

解决方案

  1. 切换 npm 源:可以使用 nrm(npm registry manager)工具来切换 npm 源。首先全局安装 nrm
npm install -g nrm

然后使用 nrm 切换到国内的源,比如淘宝源:

nrm use taobao
  1. 使用 yarn:yarn 是另一个包管理器,在某些网络环境下可能表现更好。可以先安装 yarn:
npm install -g yarn

然后使用 yarn 来安装 Vue CLI:

yarn global add @vue/cli

安装版本冲突

有时在安装 Vue CLI 时,可能会遇到版本冲突问题,特别是当系统中已经安装了不同版本的相关依赖时。

错误提示

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: undefined@undefined
npm ERR! Found: @vue/cli@4.5.13
npm ERR! node_modules/@vue/cli
npm ERR!   @vue/cli@"^4.5.13" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer @vue/cli-plugin-babel@"^4.5.0" from @vue/cli-service@4.5.13
npm ERR! node_modules/@vue/cli-service
npm ERR!   @vue/cli-service@"^4.5.13" from the root project
npm ERR!   peer @vue/cli-service@"*" from @vue/cli-plugin-babel@4.5.13
npm ERR!   node_modules/@vue/cli-plugin-babel
npm ERR!     @vue/cli-plugin-babel@"^4.5.0" from the root project

解决方案

  1. 清理 npm 缓存:运行以下命令清理 npm 缓存:
npm cache clean --force

然后重新安装 Vue CLI。 2. 指定版本安装:如果知道所需的 Vue CLI 版本,可以直接指定版本安装。例如,安装 4.5.13 版本:

npm install -g @vue/cli@4.5.13

创建项目问题

创建项目时模板选择问题

当使用 vue create 命令创建新项目时,会面临模板选择的问题。有时可能不明确各个模板的差异,或者想要自定义模板但不知道如何操作。

问题描述: 不清楚 default (babel, eslint)Manually select features 等选项的区别。

解决方案

  1. 理解模板选项
    • default (babel, eslint):这是一个简单的模板,包含 Babel 转码和 ESLint 代码检查配置。适用于快速搭建一个基础的 Vue 项目,对项目配置要求不高的场景。
    • Manually select features:这个选项允许手动选择项目所需的特性,如 Babel、TypeScript、Router、Vuex、CSS 预处理器等。适用于对项目有特定配置需求的场景。
  2. 自定义模板:如果想要创建自定义模板,可以先使用 Manually select features 创建一个项目,然后将该项目作为模板保存。首先在项目根目录下运行:
vue init <template - name> my - project

其中 <template - name> 是自定义模板的名称。之后在其他项目创建时,就可以选择这个自定义模板了。

创建项目失败:权限问题

在某些操作系统环境下,特别是在 Linux 或 macOS 系统中,可能会遇到权限不足导致创建项目失败的问题。

错误提示

vue: command not found

或者在创建项目过程中出现权限相关的错误。

解决方案

  1. 检查全局安装路径权限:如果是全局安装的 Vue CLI,确保安装路径(通常是 /usr/local/bin~/.npm - global/bin)有正确的读写权限。可以使用以下命令更改权限:
sudo chmod -R 755 /usr/local/bin

或者如果是在用户自定义的全局安装路径:

chmod -R 755 ~/.npm - global/bin
  1. 使用 nvm 或 n 管理 Node.js 版本:有时权限问题可能与 Node.js 版本管理有关。可以使用 nvm(Node Version Manager)或 n 工具来管理 Node.js 版本。例如,使用 nvm 安装指定版本的 Node.js:
nvm install 14.17.0
nvm use 14.17.0

然后重新安装 Vue CLI 并创建项目。

项目配置问题

ESLint 配置冲突

ESLint 是 Vue CLI 项目中常用的代码检查工具,但在配置过程中可能会遇到与项目现有代码风格冲突的问题。

问题描述: ESLint 提示大量代码风格错误,与项目原有的代码风格不一致,如单引号和双引号的使用、缩进风格等。

解决方案

  1. 修改 ESLint 配置文件:在项目根目录下的 .eslintrc.js 文件中,可以调整 ESLint 的规则。例如,如果想使用单引号而不是双引号,可以添加以下规则:
module.exports = {
  //...
  rules: {
    "quotes": ["error", "single"]
  }
};
  1. 忽略特定文件或目录:如果某些文件或目录不想被 ESLint 检查,可以在项目根目录下创建 .eslintignore 文件,并在其中添加要忽略的文件或目录路径。例如:
node_modules
dist
src/views/legacy - view.js

CSS 预处理器配置问题

在使用 CSS 预处理器(如 Sass、Less 等)时,可能会遇到配置不正确的问题,导致样式无法正确编译。

问题描述: 引入 Sass 文件时出现 @import 错误,或者 Less 文件无法正确解析变量。

解决方案

  1. Sass 配置:确保已经安装了 sass - loadernode - sass。如果使用的是 Dart Sass(推荐),可以这样安装:
npm install sass - loader sass --save - dev

vue.config.js 文件中,可以配置 Sass 的额外导入路径:

module.exports = {
  css: {
    loaderOptions: {
      sass: {
        additionalData: `@import "@/styles/main.scss";`
      }
    }
  }
};
  1. Less 配置:安装 less - loaderless
npm install less - loader less --save - dev

同样在 vue.config.js 中配置 Less 的变量等:

module.exports = {
  css: {
    loaderOptions: {
      less: {
        lessOptions: {
          modifyVars: {
            '@primary - color': '#1DA57A'
          },
          javascriptEnabled: true
        }
      }
    }
  }
};

运行项目问题

端口冲突

当运行 Vue CLI 项目时,可能会遇到端口被占用的问题,导致项目无法启动。

错误提示

Error: listen EADDRINUSE: address already in use :::8080

解决方案

  1. 查找并关闭占用端口的进程:在 Windows 系统中,可以使用以下命令查找占用 8080 端口的进程:
netstat -ano | findstr :8080

然后使用 taskkill 命令关闭该进程,例如:

taskkill /F /PID <进程 ID>

在 Linux 或 macOS 系统中,可以使用:

sudo lsof -i :8080
sudo kill -9 <进程 ID>
  1. 修改 Vue CLI 项目端口:在 vue.config.js 文件中,可以修改项目启动的端口:
module.exports = {
  devServer: {
    port: 8081
  }
};

热更新问题

热更新是 Vue CLI 开发过程中的一个重要特性,但有时可能会出现热更新不生效的问题。

问题描述: 修改组件代码后,浏览器没有实时更新,需要手动刷新页面。

解决方案

  1. 检查 ESLint 配置:ESLint 检查有时可能会导致热更新失败。可以在 .eslintrc.js 文件中添加以下配置来允许热更新:
module.exports = {
  //...
  watchOptions: {
    ignored: /node_modules/
  }
};
  1. 检查 webpack 配置:如果项目有自定义的 webpack 配置,可能会影响热更新。确保 webpack - dev - server 的配置正确。例如,在 vue.config.js 中:
module.exports = {
  chainWebpack: config => {
    config.devServer.hot(true);
  }
};

打包部署问题

打包后静态资源路径错误

在打包 Vue CLI 项目后,部署到服务器上可能会出现静态资源(如 CSS、JS、图片等)路径错误的问题。

问题描述: 页面加载时,浏览器控制台提示找不到 CSS 或 JS 文件,路径显示不正确。

解决方案

  1. 修改 publicPath:在 vue.config.js 文件中,可以通过修改 publicPath 来指定静态资源的路径。如果项目部署在根目录下,可以设置为 '/';如果部署在子目录下,如 /my - project/,则设置为 '/my - project/'
module.exports = {
  publicPath: process.env.NODE_ENV === 'production'
   ? '/my - project/'
    : '/'
};
  1. 使用相对路径:在模板中引用静态资源时,可以使用相对路径。例如:
<img src="../assets/logo.png" alt="logo">

打包体积过大

随着项目的不断开发,打包后的体积可能会变得过大,影响加载速度。

解决方案

  1. 代码分割:使用 Vue CLI 内置的代码分割功能。在 vue.config.js 中,可以配置 splitChunks
module.exports = {
  chainWebpack: config => {
    config.optimization.splitChunks({
      chunks: 'all'
    });
  }
};

这会将第三方库和公共代码分割出来,避免重复打包。 2. 压缩图片:在打包前对项目中的图片进行压缩。可以使用 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();
  }
};

插件相关问题

插件安装与使用问题

在使用 Vue CLI 插件时,可能会遇到安装不成功或者安装后无法正常使用的问题。

问题描述: 安装了 @vue/cli - plugin - router 插件,但在项目中无法正常配置路由。

解决方案

  1. 检查插件安装:确保插件已经正确安装。可以在项目根目录下的 package.json 文件中查看是否有对应的插件依赖。如果没有,可以重新安装:
vue add @vue/cli - plugin - router
  1. 插件配置:不同的插件有不同的配置方式。对于 @vue/cli - plugin - router,安装后需要在 src/router/index.js 文件中进行配置:
import Vue from 'vue';
import Router from 'vue - router';
import Home from '@/views/Home.vue';

Vue.use(Router);

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

插件版本兼容性问题

插件的版本可能与 Vue CLI 或项目中的其他依赖不兼容,导致各种运行时错误。

问题描述: 安装了最新版本的 @vue/cli - plugin - babel 插件,但项目在编译时出现 Babel 相关的错误。

解决方案

  1. 查看插件文档:查阅插件的官方文档,了解其与 Vue CLI 和其他依赖的版本兼容性。例如,@vue/cli - plugin - babel 插件可能需要特定版本的 @vue/cli - service 才能正常工作。
  2. 锁定插件版本:在 package.json 文件中手动指定插件的版本,确保其与项目环境兼容。例如:
{
  "devDependencies": {
    "@vue/cli - plugin - babel": "4.5.13"
  }
}

然后运行 npm install 重新安装依赖。

跨域问题

开发环境跨域

在 Vue CLI 项目开发过程中,经常会遇到跨域问题,特别是在调用后端 API 时。

问题描述: 浏览器提示 Access to XMLHttpRequest at 'http://api.example.com/api/data' from origin 'http://localhost:8080' has been blocked by CORS policy

解决方案

  1. 使用 proxy 配置:在 vue.config.js 文件中,可以使用 devServer.proxy 来配置代理。例如,如果后端 API 地址是 http://api.example.com,可以这样配置:
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://api.example.com',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
};

这样在前端代码中,所有以 /api 开头的请求都会被代理到 http://api.example.com。例如:

axios.get('/api/data').then(response => {
  console.log(response.data);
});

生产环境跨域

在生产环境中,跨域问题同样需要解决,且不能简单依赖开发环境的 proxy 配置。

解决方案

  1. 后端配置 CORS:在后端服务器(如 Node.js、Java、Python 等)中配置 CORS。以 Node.js 的 Express 框架为例,可以使用 cors 中间件:
const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors());

// 其他路由和中间件配置
  1. 使用反向代理:在生产环境中,可以使用 Nginx 或 Apache 等服务器作为反向代理,并配置 CORS。以 Nginx 为例,在 nginx.conf 文件中添加:
server {
  listen 80;
  server_name your - domain.com;

  location / {
    proxy_pass http://your - backend - server;
    add_header Access - Control - Allow - Origin *;
    add_header Access - Control - Allow - Methods 'GET, POST, OPTIONS';
    add_header Access - Control - Allow - Headers 'DNT,X - User - Token,X - CSRF - Token,Keep - Alive,User - Agent,X - Requested - With,If - Modified - Since,Cache - Control,Content - Type,Authorization';

    if ($request_method = 'OPTIONS') {
      return 204;
    }
  }
}

Vue CLI 与 TypeScript 集成问题

类型声明问题

当在 Vue CLI 项目中使用 TypeScript 时,可能会遇到类型声明不匹配或找不到的问题。

问题描述: 引入第三方库时,TypeScript 提示找不到类型声明文件,例如 Could not find a declaration file for module 'lodash'

解决方案

  1. 安装类型声明文件:对于许多常用库,都有对应的 @types 类型声明包。可以使用 npm install @types/lodash 来安装 lodash 的类型声明。
  2. 自定义类型声明:如果没有官方的类型声明文件,可以在项目中创建自定义的类型声明文件。例如,在 src/types 目录下创建 my - library.d.ts 文件:
declare module'my - library' {
  export function myFunction(): string;
}

Vue 组件中的 TypeScript 语法问题

在 Vue 组件中使用 TypeScript 语法时,可能会遇到语法错误或类型检查不通过的问题。

问题描述: 在 Vue 单文件组件中使用 TypeScript 定义组件时,出现 Property '$emit' does not exist on type 'CombinedVueInstance<Vue, {}, {}, {}, Readonly<Record<never, any>>>'. 这样的错误。

解决方案

  1. 使用 Vue.extend 和 Component 装饰器:可以使用 Vue.extendComponent 装饰器来定义 Vue 组件。例如:
import Vue from 'vue';
import { Component } from 'vue - class - component';

@Component
export default class MyComponent extends Vue {
  data() {
    return {
      message: 'Hello, TypeScript!'
    };
  }

  methods: {
    clickHandler() {
      this.$emit('custom - event');
    }
  }
}
  1. 安装 @types/vue:确保安装了 @types/vue,并且版本与项目中的 Vue 版本兼容。可以使用 npm install @types/vue@2.6.0(假设使用 Vue 2.6 版本)。

其他杂项问题

Vue CLI 升级问题

升级 Vue CLI 时,可能会遇到各种兼容性问题,导致项目无法正常运行。

问题描述: 升级 Vue CLI 后,项目在运行或打包时出现错误,如 Invalid options in vue.config.js: "chainWebpack" is not allowed

解决方案

  1. 查看升级文档:查阅 Vue CLI 的官方升级文档,了解每个版本的变化和注意事项。例如,某些配置选项在新版本中可能被移除或更改。
  2. 逐步升级:不要直接从一个较旧的版本升级到最新版本,可以逐步升级,每次升级一个小版本,并测试项目是否正常运行。例如,从 4.5.x 升级到 4.6.x,然后再到 4.7.x 等。

与其他构建工具集成问题

有时需要将 Vue CLI 项目与其他构建工具(如 Gulp、Grunt 等)集成,可能会遇到配置冲突或集成困难的问题。

解决方案

  1. 了解构建工具的职责:明确每个构建工具的主要职责。例如,Vue CLI 主要负责 Vue 项目的初始化、开发服务器启动、打包等;而 Gulp 或 Grunt 可以用于更细粒度的任务,如文件压缩、图片处理等。
  2. 配置协调:在项目中配置多个构建工具时,要确保它们之间的配置不冲突。例如,如果 Vue CLI 已经配置了 CSS 压缩,在 Gulp 或 Grunt 中就不需要重复配置相同的功能,或者要确保配置参数一致。可以通过在不同的构建工具配置文件中使用不同的命名空间或任务前缀来避免冲突。

通过对以上常见问题的分析和解决方案的介绍,希望能帮助开发者在使用 Vue CLI 进行前端开发时更加顺畅,高效地解决遇到的各种难题。