【Vue】脚手架Cli2/3/4分析(含配置移除和构建旧脚手架问题解决)

本文介绍了Vue CLI的基础知识,包括脚手架的作用,Vue CLI 2、3、4的目录解析,以及如何安装和配置。详细讲解了Vue CLI 2的文件结构和关系,CLI 3的升级变化,如基于webpack4,移除build和config目录,以及CLI 4的主要升级点。此外,还提供了在CLI 3上构建config/build配置文件的方法和同时使用CLI 2、3的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

简介:什么是脚手架

Vue cli脚手架官方文档

CLI

在我们开发大型项目的时候,那么需要并且必然使用CLI工具,我们需要考虑代码的目录结构、项目结构、部署、热加载、代码单元测试等事情。如果每个项目都要手动完成这些工作,那么无疑效率极低,所以我们需要通过脚手架工具来帮助我们完成这些事情。

vue cli

  • CLI是 Command-Line Interface,翻译为命令行界面,俗称脚手架
  • 使用vue-cli可以快速搭建Vue开发环境
  • 使用vue-cli可以快速搭建对应的webpack配置

如何安装

安装Node

1.官网下载

https://nodejs.org/zh-cn/download/

2.更改路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ib0HbOi-1600702293863)(FC864CF427B944318465CF86BC368E92)]

3.检查是否安装成功

cmd输入 # node -v

# node -v

出现此图则说明安装成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUHEqcmP-1600702293866)(219721C1F7154714A87D8FD040A07498)]


安装后的本地目录设置

使用npm安装模块分为本地安装和全局安装。

本地安装:npm install express会安装到当前项目

全局安装:npm install express -g 会安装到指定的目录(node_global)

另外,如果没有设置全局目录node_global,那么全局安装的文件将会保存到:

C:\Users\hades\AppData\Roaming\npm(hases是自己设置的计算机名字)

所以,安装好node后,要设置一下node_global和node_cache(node缓存文件夹)

1.创建目录

在node安装目录创建node_global和node_cache文件夹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdrNErpb-1600702293877)(0BAFA10A729E415B98AE10D6579F6E74)]

2.执行更改地址命令

npm config set prefix "D:\Program Files\nodejs\node_global"   

npm config set cache "D:\Program Files\nodejs\node_cache"

安装淘宝镜像加速器cnpm

尽量少用cnpm,可能导致不能使用
首先安装express

#使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,在安装时可以手动指定从哪个镜像服务器获取资源,可以使用阿里巴巴在国内的镜像服务器,命令如下:

npm install -gd express --registry=http://registry.npm.taobao.org

#只需要使用–registry参数指定镜像服务器地址,为了避免每次安装都需要--registry参数,可以使用如下命令进行永久设置:

npm config set registry http://registry.npm.taobao.org

#查看全局安装的目录

npm root -g

然后安装淘宝镜像

下载淘宝镜像
npm install cnpm -g --registry=http://registry.npm.taobao.org
cnpm -v
cnpm install

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqPqTEct-1600702293878)(0D0F61FF12604FC690041C620B8E338A)]


安装cnpm后设置环境变量

原环境变量如下!!!:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOZWLVjS-1600702293882)(818487134CB348D3B73AEC4F75AC1A11)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JooKKoDQ-1600702293884)(6FF4D931340C405682651D558AB6CD03)]

保持不变,然后在path中添加多一个cnpm的环境变量

你的cnpm.cmd所在的路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFJRvSeW-1600702293886)(984BD95A3CF84F2391C38D36A5A1A0FE)]


通过Node安装vue-cil

npm install @vue/cli -g

如果原来已经安装了vue-cli的话需要先卸载原来的安装

npm uninstall vue-cli -g

测试是否安装成功

vue -V

查看检测,vue cli3后支持ui界面

vue ui

Vue cli 2(vue-cli)

目录解析

在这里插入图片描述

文件相关解析

  • build文件夹【主要用来配置构建项目以及webpack打包文件配置】
  • config文件夹【定义webpack配置变量】
    • dev 开发配置
    • index 主要配置
    • prod 生产配置
  • node_modules 【node依赖】
  • static 【静态资源】
  • package.json文件【管理node包】
    • npm run dev
    • npm run build
    • npm run start
  • package-lock.json文件【node版本映射】

在这里插入图片描述


cli2脚手架文件解析

在这里插入图片描述

  1. index.html 单页面应用【连接main.js入口文件】
  • 本质上是一个单页面应用

  • 为什么index.html是项目的入口以及为什么index.html加载后会继续加载main.js、App.vue、index.js,以及他们之间的关系是如何联系起来的呢,

这块的配置文件位于build文件夹下,包括webpack.dev.conf.js等,感兴趣的可以了解下
  • ?index.html内容

在body体中只有一个div标签,其id为app,这个id将会连接到src/main.js内容

  • <div id="app"></div> 默认引用了app.vue根组件
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>y</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
  1. main.js 【入口文件=关联路由+公共组件】
  • ?main.js内容

main.js中,新建了一个vue实例,并使用el:#app链接到index.html中的app,并使用template引入组件<app>路由相关的内容(具体的涉及到vue的语法规则,如果不理解的先记下来吧,继续往后看,等了解vue的相关内容后,可能会更清晰)。也就是说通过main.js我们关联到App.vue组件

  • new Vue({……})
    • el:官方解释为实例提供挂载的元素。此处为index.html中的
    • router:为router:router,的简写,指向引入文件中的routes:[]
    • components:注册哪些组件,需在顶部引入文件
    • template:替换挂载元素的模板组件,而挂载元素的内容都将被忽略。即用template替换index.html里面的
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
 
Vue.config.productionTip = false
 
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})
  1. App.vue【根组件文件】
  • ?App.vue内容

App.vue中的内容,是一个标准的App.vue模板的形式,包含了<template></template>、<script></script>、<style></style>三部分,从template标签中可以看到,使用img标签加载了vue的图像,也就是我们使用npm run dev运行vue项目后看到的图像,那么图像下面的内容是从哪里渲染出来的呢?

我们注意到,<template>标签下,除了<img>标签外,还有<router-view>标签,<router-view>标签将会把路由相关内容渲染在这个地方接下来,我们看一下路由的内容有哪些,在哪里出现的。其实,这个文件位于src/router/index.js中,我们看一下index.js中的代码

  • <router-view>
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>
 
<script>
export default {
  name: 'App'
}
</script>
 
<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
  1. index.js 【路由文件】

在index.js的代码中,建立了路由相关的内容,也就会渲染到app.vue下面的<router-view>中。在index.js中,将helloworld组件发布为路由,换句说,index.js在这里就是将helloword发布为路由,以在图片下面进行展示helloword内容,接下来我们再看看components/helloword中的内容

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
 
Vue.use(Router)
 
export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})

总结

vue = 单页面应用 = 入口文件 + 路由 + 组件

我们可以看到项目加载的过程是

index.tml【单页面应用,默认引用了app.vue根组件】->main.js【入口文件,引入相关资源文件】->app.vue【根组件文件组件嵌套】->index.js【路由文件】->helloworld.vue【具体组件】

这里只是对我们运行项目后,如何出现首页面做了简单的解释,对具体的实现没有进行分析。

http://localhost:8080/#/,首次项目启动的路径,访问的是index.html

在这里插入图片描述


项目安装时runtime-only 和 run time-compiler

在这里插入图片描述

  • runtime-compiler
    • 先在components里面注册
    • 放到template(模板html文件)里面
    • 执行流程:template ->ast抽象语法树->render->v dom 虚拟dom->UI 真实dom
  • runtime-only
    • 性能更高
    • 箭头函数
    • 执行流程:render->v dom 虚拟dom->UI 真实dom

Vue cli 3(@vue/cli)

vue-cli 3 与 2 版本区别

  • 3 基于webpack4打造,2基于webpack3打造
  • 理念是:0配置
    • 移除了build和config目录
  • 提供 vue ui 可视化配置
  • 移除了static文件夹
  • 新增了 public文件夹,把index.html移到public中
  • main.js new Vue改造了挂载渲染(其实和2没有区别,只是底层多了一个判断)

在这里插入图片描述


目录解析

在这里插入图片描述


Vue cli 4

vue cli 4 官方英文升级文档

vue cli 4 主要升级点总结

1.“@vue/cli-plugin-babel”, “@vue/cli-plugin-eslint”, "@vue/cli-service"由 v3 的版本升级到了 v4

2.sass-loader由 v7 的版本升级到了 v8

3.core-js由 v2 的版本升级到了 v3

4.webpack-chain由 v4 的版本升级到了 v6

5.css-loader由 v1 的版本升级到了 v3

6.url-loader由 v1 的版本升级到了 v2

7.file-loader由 v3 的版本升级到了 v4

8.copy-webpack-plugin由 v4 的版本升级到了 v5

9.terser-webpack-plugin由 v1 的版本升级到了 v2

10.@vue/cli-plugin-pwa由 v3 的版本升级到了 v4

11.新增插件 vue add vuex vue add router

12.pug-plain已重命名为pug-plain-loader

13.默认目录结构已更改

src/store.js 改为 src/store/index.js

src/router.js 改为 src/router/index.js

14.由于兼容性原因,仍支持 router&routerHistoryMode 选项 preset.json

但是现在建议使用它来 plugins: { ‘@vue/cli-plugin-router’: { historyMode: true } }

获得更好的一致性

15.api.hasPlugin(‘vue-router’)不再受支持,现在 api.hasPlugin(‘router’)

16.lintOnSave 选项的默认值(未指定时)从 true 更改为 default

17.废弃vue-cli-service test:e2e

18.@vue/cli-plugin-e2e-nightwatch Nightwatch.js已从0.9升级到1.x

19.@vue/cli-plugin-unit-mocha 升级到Mocha 6

20.@vue/cli-plugin-unit-jest jest由 v23 升级到v24

21.@vue/cli-plugin-typescript 更好的ts支持


如何同时使用vue cli2和3

在这里插入图片描述
1.首先需要安装vue cli3在本地

2.全局安装桥架工具

npm install -g @vue/cli-init -g

3.使用命令创建vue cli2初始化项目(使用3直接vue ui / 命令构建即可)

# cli2初始化项目
vue init webpack my-project
# cli3初始化项目
vue create my-project

4.cd到目录,执行初始化命令并且根据提示安装

在这里插入图片描述

在这里插入图片描述
5.cli2脚手架文件目录(完成构建)

在这里插入图片描述


如何在cli3上构建config/build配置文件

方法一:创建vue.config.js(推荐)

在这里插入图片描述

# 这是一个固定写法,官方规定命名为vue.config.js
# module.exports 作用为把这里写的配置和隐藏目录的配置合并起来

module.exports = {
    /* 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath */ 
    /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
    publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
    /* 输出文件目录:在npm run build时,生成文件的目录名称 */
    outputDir: 'dist',
    /* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
    assetsDir: "assets",
    /* 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度 */
    productionSourceMap: false,
    /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) */
    filenameHashing: false,
    /* 代码保存时进行eslint检测 */
    lintOnSave: true,
    /* webpack-dev-server 相关配置 */
    devServer: {
        /* 自动打开浏览器 */
        open: true,
        /* 设置为0.0.0.0则所有的地址均能访问 */
        host: '0.0.0.0',
        port: 8066,
        https: false,
        hotOnly: false,
        /* 使用代理 */
        proxy: {
            '/api': {
                /* 目标代理服务器地址 */
                target: 'http://47.100.47.3/',
                /* 允许跨域 */
                changeOrigin: true,
            },
        },
    },
}

方法二:在隐藏的目录中修改(不推荐)

在这里插入图片描述

—end

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值