Vue脚手架(Vue CLI)

一、什么是Vue CLI

  • 使用Vue开发大型项目时,如果诸如代码目录结构、项目结构和部署、热加载、代码单元测试等事情,都要手动完成的话,无疑效率比较低效,所以我们通常使用一些脚手架工具来帮助完成这些事情。
  • CIL(Command-Line Interface),翻译为命令行界面,俗称脚手架。使用Vue-CLI可以快速搭建Vue开发环境以及对应的webpack配置。

二、安装脚手架 CLI

  • 脚手架(CLI)依赖于node环境以及webpack
  • 安装命令
    npm install -g@vue/cli
    
  • 如果要使用脚手架2,那么还要安装脚手架2的脚本
     vue init webpack my-project
    

三、创建项目

  • Vue CLI2初始化项目

      vue init webpack my-project
    

1.ESLint规范

一种代码规范,如果不符合要求,那么启动服务时会报错。新手不建议使用。可以在index.js中 useEslint: true属性选择是否使用。

2.runtime-compiler和runtime-only的区别

二者中只有main.js文件不同

  • runtime-compiler
    new Vue({
      el: '#app',
      components: { App },
      template: '<App/>'
    })
    

过程:template解析成ast(抽象语法树);ast再编译成render函数;然后转为虚拟dom;最后转化为真实Dom。

  • runtime-only:1.性能更多高 2.代码量更少(创建项目时就可看出比上面的小6KB,建议使用)
    new Vue({
     el: '#app',
      render: h => h(App)
      //箭头函数相当于下面代码
      // render: function (h) {
      //   return h(App)
      // }
    })
    

过程:render函数转为虚拟dom;最后转化为真实Dom。

runtime-only比对runtime-compiler,减少了解析成render函数的过程。vue-template-compiler这个插件帮助了我们做了这个过程。

3.render函数

首先了解一下createElement函数
new Vue({
  el: '#app',
  // components: { App },
  // template: '<App/>'
    render: function (createElement) {
        //1.普通用法:createElement('标签', {标签的属性}, [显示内容]) 自定义内容
      return createElement('h2',
        {class: 'box'},
        ['Hello World'], createElement('button'), ['按钮'])
        //2.核心用法:传入组件对象 函数还可以传入组件对象,那么我们就可以吧app组件直接传入
        return createElement(App)
    }
  })

第二种用法就是render函数,即runtime-only中的main.js,这里是没有template的。

  • Vue CLI3初始化项目

1.跟Vue CLI2的区别

vue-cli3是基于webpack4打造,vue2还是webpack3;
vue-cli3的设计原则是“0配置”,移除配置文件跟目录下的build和config等目录;
vue-cli3提供了vueui命令,提供了可视化配置,更加人性化;
移除了static文件家,新增了public文件夹,并且index.html移动到public文件夹。

2.创建项目

vue create my-project
vuecli3.png

vue3项目结构.png
main.js
new Vue({
  render: h => h(App),
}).$mount('#app')

[.$mount('#app')] 等同于 [el: '#app']

3.配置去哪了

从上面的项目结构中可以看出,同脚手架2比少了配置文件,那么配置文件放在哪里了呢?

在脚手架3中,如果要修改配置,有三种方案
  • 启动配置服务器:vue ui
    在命令行输入vue ui命令即可打开一个本地服务,端口默认8000
    进入后将项目导入就可以进去操作界面。
  • 找到隐藏起来的配置
    在node-modules中的@vue文件夹中


    配置.png
  • 自定义配置文件vue.config.js,添加想要的配置,会和@vue文件中的配置自动整合

四、Vue-Router(路由)

1.认识路由

路由:通过互联的网络把信息从原地址传输到目的地址的活动
生活中实例:比如路由器。
路由器提供了两种机制:路由和传送
路由:决定数据包从来源到目的的路径
传送:将输入端的数据转移到合适的输出端

2.前端渲染和后端渲染

2.1 第一阶段: 后端渲染

最早期:jsp 包含html+css+java代码(从数据库中读取信息动态放在页面中),称为服务端渲染,即后端渲染。
后端路由:后端处理URL和页面之间的映射关系

2.2 第二个阶段:前后段分离 Ajax

后端只负责提供数据,不负责任何阶段的内容
浏览器中显示的网页中的大部分内容,都是由前端写的js代码在浏览器中执行,最终渲染出来的网页

2.3 第三个阶段 SPA页面 前端路由

在前后段分离的基础上加了前端路由
SPA:单页面富应用,整个页面只有一个html页面,一个url对应一个组件(即页面),有前端维护,所以叫前端路由
前段路由的核心:改变URL页面不进行整体的刷新(前端控制,不与后台交互)

3.如何保证改变URL页面不会刷新

3.1 通过改变hash改变url
  • 初始页面


    [图片上传中...(手动刷新.png-ddfe8f-1601871351865-0)]
  • 刷新时发送请求信息


    手动刷新.png
  • 通过hash改变url并不会发送请求信息


    通过hash修改.png
3.2 HTML5的history模式:pushState
  history.pushState({}, '', 'url')  
  history.back()        等同于 history.go(-1)     后退
  history.forward()     等同于 history.go(1)      前进
pushState.png

会将url压入栈结构中,先进后出


栈结构.jpg
3.3 HTML5的history模式:replaceState
  history.replaceState({}, '', 'home')

与pushState不同的是,replaceState是替换url,无法返回


replace.png
3.4 HTML5的history模式:go
  history.go(-2) 

与pushState一起使用
back、forward、go三个接口等同于浏览器界面的前进后退


go.png

4.安装和使用Vue-router

4.1 安装(脚手架已选择的的话不用再次安装)
 npm install vue-router --save
4.2 在src文件夹下创建router文件夹,并创建index.js文件
4.3 在index中配置所有路由信息
//配置路由相关信息
import VueRouter from 'vue-router'
import Vue from 'vue'

//1.通过Vue.use(插件),安装插件
Vue.use(VueRouter)

//2.创建VueRouter对象
const routes = [

]
const router = new VueRouter({
  routes
})

//3.将router对象传入到Vue实例 导出
export default router
4.3 在mian.js中导入
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,
  render: h => h(App)
})

简单配置实现,但还没有配置映射信息

5.配置映射信息

5.1 创建路由组件

在components文件夹下创建路由组件

5.2 配置映射信息:组件和路径映射关系
import home from '../components/Home.vue'
import about from '../components/About.vue'
const routes = [
  {
    path: '/home',
    component: home
  },
  {
    path: '/about',
    component: about
  }
]
5.3 使用路由:通过<router-link>和<router-view>
  <div id="app">
    <router-link to="/home">首页</router-link>
    <router-link to="/about">关于</router-link>
    <router-view></router-view>
  </div>

在App.vue中配置,<router-view>起到占位作用,路由指向的组件将会渲染拿到<router-view>的位置。

5.4 路由的默认值
  const routes = [
    {
      path: '',
      redirect: '/home'
    },
  ]

在打开网页时,一般情况都是默认直接打开首页,这是使用redirect重定向到home,即可。

5.5 url修改为history模式
url的默认模式时hash模式:
  [http://localhost:8080/#/home](http://localhost:8080/#/home)
可以在new VueRouter中添加属性来改变
  const router = new VueRouter({
    routes,
    mode: 'history'
  })
history模式:没有# 更美观
  [http://localhost:8080/home](http://localhost:8080/home)
5.6 router-link的其他属性补充
  • to:用于指定跳转的路径
  • tag:指定<router-link>渲染成什么组件,默认时<a>,
    <router-link to="/home" tag="button">首页</router-link>
    
  • replace:关闭网页的前进后退功能(pushState转成replaceState)
    <router-link to="/home" tag="button" replace>首页</router-link>
    
  • active-class:当<router-link>对应的路由匹配成功时,会自动给当前元素设置一个router-link-active的class,设置active-class可以修改默认名称,并给其添加style样式
    <router-link to="/about" tag="button" replace active-class="active">关于</router-link>
    
  • 但是如果改变active-class的话,每个<router-link>都要改变,过于麻烦,所以可以在定义路由时添加一个属性linkActiveClass
    const router = new VueRouter({
      routes,
      mode: 'history',
      linkActiveClass: 'active'
    })
    

6.通过代码跳转路由

<div id="app">
  <h2>我是App组件</h2>
  <button @click="homeClick">首页</button>
  <button @click="aboutClick">关于</button>
  <router-view></router-view>
</div>

<script>
export default {
  name: 'App',
  methods: {
    homeClick() {
      // this.$router.push('/home')
      this.$router.replace('/home')
    },
    aboutClick() {
      // this.$router.push('/about')
      this.$router.replace('/about')
    }
  }
}
</script>

6.动态路由的使用

[http://localhost:8080/user]

在进入用户界面时,要求在路由上显示出当前用户的id,即例如[http://localhost:8080/user/zhangsan]的时候,我们称之为动态路由

6.1 动态路由的实现
  App.vue中
 <template>
  <div id="app">
    <router-link v-bind:to="'/user/'+userId">用户</router-link>
    <router-view></router-view>
  </div>
</template>
<script>
  export default {
     data() {
       return {
         userId: 'zhangsan'
       }
     },
  }
 </script>

  index.js的routers中
  const routes = [
    {
      //此处userId会取到App.vue中v-bind:to="'/user/'+userId"的数据
      path: '/user/:userId',
      component: User
    }
  ]

  路由中显示已达成,如何显示到界面中
  User.vue中
  <template>
    <div>
      <h2>我是用户界面</h2>
      <p>我是用户信息,嘿嘿嘿</p>
      使用计算属性:<h2>{{userId}}</h2>
      不使用计算属性:<h2>{{$route.params.userId}}</h2>
    </div>
  </template>

  <script>
    export default {
      name: "user",
      computed: {
        //指向哪个路由,就会拿到哪个路由
        userId() {
          //userId指向的是index.js中path里的userId
          return this.$route.params.userId;
        }
      }
    }
  </script>

7.打包文件的解析

vue-cli不会只打包一个js文件,而是对js文件进行分包,css文件也一样。


打包文件.png
js文件夹中:
  • 第一个文件(app):当前应用程序开发的所有代码(业务代码)
  • 第二个文件:为了打包的代码做底层支撑(如导入导出等)
  • 第三个文件(vendor提供商):第三方,如vue、vue-router等

五、Vuex

六、网络请求封装(axios)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容