近况
最近十分焦虑,vue还没学完,工作上还需要赶紧学SpringCloud,计划这周把vue博客笔记写完,
下周开始写vue实战项目,总之,尽快结束vue,然后10月份学习SpringCloud,在过年之前,学完Cloud!
Vue-Cli
vue-cli是vue的脚手架,Cli指的是Command-line interface,翻译为命令行界面,但是俗称脚手架
当我们使用vue开发大型应用时,脚手架能帮我们配置代码目录结构,项目结构和部署,热加载,代码单元测试等事情
使用vue-cli可以快速搭建vue开发环境以及对应的webpack配置,下面是使用步骤:
- 全局安装vue脚手架命令:
npm install @vue/cli -g - 安装脚手架2(vue-cli2)模板
当我们vue-cli版本是3时,和2的版本在使用命令上有些区别,所以如果你用的脚手架3但是却希望
输入脚手架2的命令时也能成功执行,那么你需要全局安装一个依赖,npm install -g @vue/cli-init
安装好后,使用脚手架2的命令也能成功被执行 - 创建vue项目
vue-cli2初始化项目:vue init webpack studyvuecli2 //项目名小写
vue-cli3初始化项目:vue create studyvuecli3
执行命令后,你可能需要配置一些vue项目中模块,按照操作配置即可。
下面是使用脚手架2命令创建项目的目录结构
通过脚手架2创建的项目,项目中有很多配置文件,下面来说说这些配置文件的含义:
- build和config目录是webpack的配置文件,脚手架将webpack配置文件分离了,都放在这里
- node_modules目录npm的本地安装位置,或者说局部安装
- src中assets目录,主要放一部分图片,放在这里的图片,webpack会根据配置判断,
图片是否会转成base64格式,如果图片小于我们的配置,则会被转成base64格式发送给浏览器
如果图片大于我们的配置,则是浏览器请求url的方式获取图片。 - src中components目录放我们的组件文件,以.vue结尾的文件,该文件是将以前写的组件抽出来成独立的JS文件
src目录下还可以放更多其他目录,比如vue-router,vuex,axios的目录等等 - static目录,放在该目录中的文件,会原封不动拷贝到dist目录中
.babelrc文件是es6转es5的配置文件.editorconfig文件是项目文本相关的配置,规定项目文件的规则,例如代码缩进几个空格之类的.postcssrc.js文件是css转化时的配置- package.json文件是npm用来管理项目的文件,记录着项目的一些依赖信息,这里的记录的依赖版本
并不准确,如果想查看当前项目依赖的准确版本,可以查看package-lock.json文件
下面是使用脚手架3命令创建项目的目录结构
我们可以看到,Vue-cli3创建的项目没有了很多配置文件,解释一下其中配置文件的含义:
- 这里的public目录对应着就是vue-cli2中的static目录,该目录的东西会原封不动拷贝到dist目录中
webpack以生产模式启动项目就会生成dist目录,并将打包进该目录中。 .browserslistrc文件主要是当我们使用babel-loader时,将es6转成es5,而这个文件是配置
哪些适配哪些浏览器,占市场多大的份额的浏览器,一般不动它babel.config.js文件就是babel-loader的配置文件
我们可以发现,vue-cli3创建的项目的配置目录没有了,其实是脚手架给藏起来了,如果你想查看这些配置文件
你可以查看项目的以下目录找到它:node_modules/@vue/cli-service/lib/Service.js文件
或者你可以通过vue-cli3提供的图形化界面查看项目配置:vue ui,该命令会打开一个浏览器页面,可以查看安装依赖,
如果你想有一些自己的配置文件,你可以在项目根目录中创建vue.config.js文件,文件名是固定的
在其中导出自己的配置(和之前webpack.config.js一样写法),之后在启动服务后,vue-cli会自动将vue.config.js与默认的配置进行合并
小提示:vue-cli3是基于webpack4打造的,vue-cli2是基于webpack3
runtimeCompiler与runtimeOnly的区别
我们在使用脚手架创建项目的时候,可能会有一个选择,让你选择是使用runtimeCompiler还是runtimeOnly方式构建我们的项目
首先来看看不同版本脚手架生成的src/main.js中有什么不同
//vue-cli2版本创建的项目中main.js
import Vue from 'vue'
import App from './App'
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})
/*
在组件篇中,我们很少看到根组件中同时存在el和template属性,然而其实根组件是可以有template属性的
根组件的template会在项目启动时替换掉el管理的div标签。
*/
//vue-cli3版本创建的项目中main.js
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
/*
可以看到非常的简便了,其实这里是通过不断的演化来的,来看看这里的配置如何演进的
最开始:
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})
然后:
new vue({
el: '#app',
render: h=>{ //render函数相当于template+components
return h(App);
}
})
再然后:
new vue({
render: h=>{
return h(App);
}
}).$mount('#app') //$mount取代了el属性
最后:
createApp(App).mount('#app') //createApp函数封装了vue实例
*/
在使用vue-cli2创建的项目中的main.js,我们template代码,会被ast(abstract syntax tree抽象语法书),然后再转成render函数
render函数再转成虚拟DOM(VDOM),最后转成真实DOM(UI)。这就是使用runtimeCompiler方式构建的项目解释template的方式,
而使用runtimeOnly方式构建的项目则直接从render函数开始,相比runtimeCompiler方式,节省了很多环节
所以使用runtimeOnly方式构建的项目比runtimeCompiler方式构建的项目要小大概10KB
使用runtimeOnly方式构建的项目,在main.js中的vue实例中,使用render函数代替了template,这个函数其实
是一个钩子函数,它接收一个对象,并根据我们的APP组件去调用函数,其实内部创建了一个<APP/>标签
总结:
- 如果在之后的开发中,依然使用template,就选择runtime-Compiler方式构建项目
- 如果在之后的开发中,使用.vue文件开发组件,那么可以选择runtime-only

