Vue起手式

起手式

Vue中文文档工具@vue/cli文档

Vue的历史

vue、Angular.js、React.js前端三大主流框架。
MVC中的V是Vue的重点,M和V则被简化。
Vue和vue.js没有区别,vue就是vue.js的简称。
Vue你可以认为是框架也可以说是库,Vue中文英文文档都是尤雨溪写的。

15年的1.0版本Vue自称是MVVM框架,不是MVC是MVVM,不过这已经成历史了。现在Vue是MV * 框架,意思就是你说MVC、MVVM都行。但是Vue升级到2.0后,它虽然看起来是MVVM框架,但实际不是MVVM框架了。Vue3直接抄袭React。
Vue作者尤雨溪,主要作品: Vue、Vue Router、Vuex、@vue/cli(主要维护者是蒋豪群)
Vue2版本vue.runtime.min.js Vue3版本vue.runtime.global.prod.js

目标一: 项目搭建

方法一:使用@Vue/cli

使用@vue/cli搭建Vue项目
@Vue/cli 是Vue的创建初始化工具,webpack的升级版,帮你把所有的webpack loader、webpack plugin配好了。利用@Vue/cli,不用学webpack也能用Vue。

步骤 🔍@vue/cli文档
1.打开终端

cd ~/Desktop/
yarn global add @vue/cli@4.1.0-beta.0
vue --version
vue create vue-demo //创建目录vue-demo

2.设置配置(该配置只适合学习,如果是真实项目请自行斟酌选项)
选错用control+c中断重来
没有截图的使用默认选项。
多选:用空格键选中或取消 注意: 不要勾选Choose Vue version!

image.png

3.运行

cd vue-demo
yarn serve
中断control+c,然后把生成的目录vue-demo拖进来
open .
yarn serve //打开本地预览服务器
image.png

现在就可以使用Vue了,还可以用codesandbox.io。
第1种方式:用命令行创建目录,它会自动帮你安装依赖。
第2种方式:用codesandbox.io
不要登录,点击“create sandbox”,选择创建vue沙盒。
下载至本地:点击File-> Export to ZIP 并解压缩

方法二:自己从零搭建Vue项目

目标二.vue.js和vue.runtime.js的使用

做一个简单的"+1"项目
如何使用Vue实例?

App.vue
<template>
  <div id="app">
    {{n}}
    <button @click="add">+1</button>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){ //data是函数
    return {
      n:0
    }
  },
  methods:{//methods是对象
    add(){
      this.n +=1
    }
  }
}
</script>

<style lang="scss">
</style>

分析
index.html<div id="app"> {{n}} </div>不支持{{n}}
main.js new Vue封装了对实例的所有操作

new Vue({//初始化#app
  el : '#app' //我要对这个div进行MVC的封装
})

Vue不支持{{n}},接下来介绍Vue的2个版本,就知道为什么Vue有的支持有的不支持了。


image.png

方法一:从html得到视图「完整版Vue」

1.文档: 使用BootCDN安装
对不同构建版本的解释

image.png

CDN后缀为vue.min.js是vue.js的简洁版,推荐用vue.min.js

⚠️注意CDN引入的Vue版本要与本地Vue版本一致,都是2。
查看版本号:打开package.json:"vue": "^2.6.11";
CDN引入的版本:vue/2.6.14

CDN选择后缀为vue.min.js,选择复制<script>标签,插到index.html。

index.html
<div id="app"> {{n}}</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>

引入版本后就会得到一个全局变量

main.js
console.log(window.Vue)

终端:yarn serve //打开本地预览服务器
image.png

2.使用

main.js
new Vue({
  el: '#app',
  data: {
    n: 0
  }
})

html中的{{n}}加载出来了,页面显示0
关注点: MVC视图没有写在js里,直接写在页面index.html里。
这就是完整版的功能,可以直接在页面里把n变成0

方法二:用JS构建试图「非完整版vue」

CDN选择后缀为vue.runtime.min.js,选择复制<script>标签,插到index.html
页面并未显示0
原因:非完整版vue不支持从html里面获取视图。 只要是从html里产生视图就都不支持,所以在js里用template也没用。

解决方法:修改render
文档

index.html
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.runtime.min.js">
</script>

main.js
console.log(window.Vue)
new Vue({
  el: '#app',
  render(createElement) {
    const h = createElement
    return h('div', [this.n, h('button', { on: { click: this.add } }, '+1')])
  },
  data: {
    n: 0
  },
  methods: {
    add() {
      this.n += 1
    }
  }
})
image.png

不完整版vue必须要用createElement方式把所有元素构造出来。

完整版vue VS 不完整版vue

完整版vue思路:
Vue要把'html{{n}}'变成'html 0'。
直接替换不太好,因为如果有v-if、v-for这些复杂语句你直接用正则替换是做不到的。于是Vue需要写一个compiler(编译器),这个compiler可以把含有占位符或条件循环语句的东西变成真实的DOM节点。这样下次你在写this.n +=1时那么它就知道你要改的是n,于是它就直接改DOM节点,而不是再去编译遍。它根据分析出DOM节点得到了'html 1'。像复杂的语法@click='add'不能直接替换。

compiler(编译器)特点复杂,占用一定代码体积,比「不完整版Vue」大30%的体积,所以需要不完整版Vue。

不完整版vue思路:
不完整版Vue没有compiler,所以没办法把html变成节点,没有这个功能,是利用webpack在写的时候就进行转换。webpack通过vue-loader<div id="app"> {{n}}... </div>转化为h('div',this.n)。我们写还是写html,但是用户下载的是"只支持h函数的「不完整版Vue」",中间通过webpack loader翻译。用户对Vue的依赖可以使用体积少30%的「不完整版vue」,vue为了减少30%体积把核心功能删掉了,在打包的时候自己翻译,翻译完后就不需要html版本了。

我们写代码<div id="app"> {{n}}... </div>,然后通过yarn build得到用户可以用的h('div',this.n),用户可以用的h('div',this.n)+不完整版vue。这里没有html,html早就编译好了,就是把编译器放到build里面,vue-loader会调用compiler,这就是vue作者的逻辑。不完整版意义在于更加的独立,这种方法很不方便,但实际上是对的。
总结:「完整版vue」体积大30%,「不完整版vue」体积小30%但需要用webpack配合。

方法三:使用vue-loader

Vue单文件组件:「不完整版vue」如何用vue-loader翻译?
可以把.vue文件翻译成h构建方法
但这样做html就只有一个div#app,SEO不友好

步骤
1.使用它提供的方法,src目录下新建文件Demo.vue
代码

Demo.vue
//语法
<template> //视图
    <div class="red">
        {{n}}
        <button @click="add">+1</button>
    </div>
</template>

<script> //视图外的其它选项
export default {
    data(){//如果你是用vue-loader写的这个文件,那data必须是函数!
      return { n:0 }
    },
    methods:{
      add(){
        this.n +=1
      }
    }
}
</script>

<style scoped> //CSS
.red{ color: red; }
</style>

vue-loader就可以把这些东西变成一个对象

2.使用

main.js
import Demo from './Demo.vue' //先导入
console.log(Demo)
new Vue({
  el: '#app',
  render(h) {
    return h(Demo)
  },
})

终端:yarn serve //打开本地预览服务器
image.png

render里面就是把html<div class="red"> {{n}}... </div>翻译成render(h) { return h(Demo) },所以Demo.vue不需要自己写render。

总结: 这就是webpack给前端带来的无限可能,你可以任意的方式组织一个对象,只要你最后能够写一个loader把它还原成这个对象就可以了,这就叫做Vue单文件组件

SEO(搜索引擎优化)友好

百度如何知道某个的相关内容呢?

curl https://www.taobao.com/

curl命令(或者右键显示网页源代码)可以得到淘宝输出给百度的curl结果,相关内容比如 标题<title>淘宝网 - 淘!我喜欢</title> 文章<h1>淘宝网</h1>。这时去百度搜索淘宝网就有可能搜到该网站,因为curl后它得到的就是这些关键信息。

反关我们的index.html curl后除了个title外一无所知,因为内容<div id="app"></div>是后来的js渲染进去的,这就叫做SEO不友好或者说用curl命令无法得到相关内容。

SEO友好处理: 补充内容,把主要内容写到页面里。就是把title、description、keyword、h1、a写好即可。

//打开淘宝查看源代码,有例子
<meta name="description" content="淘宝网-亚洲较大的网上交易平台,提供各类服饰..." />
<meta name="keyword" content="淘宝,掏宝,网上购物,C2C,在线交易..." />

虽然最后会不见,但是curl命令会看见它。

⚠️最佳实践:总是使用非完整版,然后配合vue-loader和vue文件。
思路:
1.保证用户体验,用户下载的JS文件体积更小,但只支持h函数
2.保证开发体验,开发者可直接在vue文件里写HTML标签,而不写h函数
3.脏活让loader做,vue-loader把vue文件里的HTML转为h函数
这样你就可以不写h函数也能得到h函数。

深入理解完整版与运行版的区别

image.png

1.非完整版视图: 写在render函数里,用h来创建标签。h可重命名但最好别改。

Demo.vue 代码略...
main.js
import Demo from './Demo.vue'

new Vue({
  el: '#app',
  render(h) {
    return h(Demo)//用h创建标签
  }
})

2.可以用CDN引入这两个版本:vue.js是Vue完整版,vue.runtime.js是Vue非完整版。生产环境(如果要部署给用户)要都改成.min.js,比如vue.runtime.min.js,.min.js是去掉注释压缩后的版本。
3.引用错了会怎样?
非完整版支持render但不支持template,强行用template就会报错警告。
完整版vue.runtime.js错用成vue.js体积会变大,因为vue.js有编译HTML的功能。

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

推荐阅读更多精彩内容