前端开发之走进Vue.js

Vue.js 作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式。本文旨在帮助大家认识 Vue.js,了解 Vue.js 的开发流程,并进一步理解如何通过 Vue.js 来构建一个中大型的前端项目,同时做好相应的部署与优化工作。

文章将以 PPT 图片附加文字介绍的形式展开,不会涉及知识点的具体代码,点到为止。有兴趣的同学可以查看相应的文档进行了解。

Vue.js 简介

从上图的介绍中我们不难发现 Vue.js 是一款轻量级的以数据驱动的前端 JS 框架,其和 jQuery 最大的不同点在于 jQuery 通过操作 DOM 来改变页面的显示,而 Vue 通过操作数据来实现页面的更新与展示。下面便是 Vue 数据驱动的概念模型:

 Vue.js 主要负责的是上图绿色正方体 ViewModel 的部分,其在 View 层(即 DOM 层)与 Model 层(即 JS 逻辑层)之间通过 ViewModel 绑定了 DOM Listeners 与 Data Bingings 两个相当于监听器的东西。

当 View 层的视图发生改变时,Vue 会通过 DOM Listeners 来监听并改变 Model 层的数据。相反,当 Model 层的数据发生改变时,其也会通过 Data Bingings 来监听并改变 View 层的展示。这样便实现了一个双向数据绑定的功能,也是 Vue.js 数据驱动的原理所在。

Vue 实例

在一个 html 文件中,我们直接可以通过 script 标签引入 Vue.js,然后就可以在页面里写 Vue.js 代码了。上图中我们通过 new Vue() 构建了一个 Vue 的实例,在实例中,可以包含挂在元素(el),数据(data),模板(template),方法(methods)与生命周期钩子(created 等)等选项。不同的实例选项拥有不同的功能,如:

(1)el表明我们的 Vue 需要操作哪一个元素下的区域,’#demo’表示操作 id 为 demo 的元素下区域。

(2)data表示 Vue 实例的数据对象,data 的属性能够响应数据的变化。

(3)created表示实例生命周期中创建完成的那一步,当实例已经创建完成之后将调用其方法。

Vue 常用指令

在 Vue 项目的开发中,我们使用的最多的应该就属 Vue 的指令了。通过 Vue 提供的常用指令,我们可以淋漓尽致地发挥 Vue 数据驱动的强大功能。以下便是图中常用指令的简单介绍:

(1)v-text: 用于更新绑定元素中的内容,类似于 jQuery 的 text() 方法

(2)v-html: 用于更新绑定元素中的 html 内容,类似于 jQuery 的 html() 方法

(3)v-if: 用于根据表达式的值的真假条件渲染元素,如果上图 P3 为 false 则不会渲染 P 标签

(4)v-show: 用于根据表达式的值的真假条件显示隐藏元素,切换元素的 display CSS 属性

(5)v-for: 用于遍历数据渲染元素或模板,如图中 P6 为 [1,2,3] 则会渲染 3 个 P 标签,内容依次为 1,2,3

(6)v-on: 用于在元素上绑定事件,图中在 P 标签上绑定了 showP3 的点击事件

关于更多的 Vue 指令可以查看 Vue2.0 文档,地址:https://vuefe.cn/api/# 指令

Vue.js 技术栈

以上我们讲到可以直接在一个 html 页面里通过引入 Vue.js 来直接写 Vue 代码,但是这样的方式并不常用。因为如果我们的项目比较大,项目中会存在很多页面,一旦每个页面都引入一个 Vue.js 或者声明一个 Vue 实例,这样非常不利于后期的维护和代码的公用,也会存在实例名冲突的情况,所以我们需要用到 Vue 提供的技术栈来构建强大的前端项目。

除了 Vue.js 我们还需要用到:

(1)vue-cli:Vue 的脚手架工具,用于自动生成 Vue 项目的目录及文件。

(2)vue-router: Vue 提供的前端路由工具,利用其我们实现页面的路由控制,局部刷新及按需加载,构建单页应用,实现前后端分离。

(3)vuex:Vue 提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象。

(4)ES6:Javascript 的新版本,ECMAScript6 的简称。利用 ES6 我们可以简化我们的 JS 代码,同时利用其提供的强大功能来快速实现 JS 逻辑。

(5)NPM:node.js 的包管理工具,用于同一管理我们前端项目中需要用到的包、插件、工具、命令等,便于开发和维护。

(6)webpack:一款强大的文件打包工具,可以将我们的前端项目文件同一打包压缩至 js 中,并且可以通过 vue-loader 等加载器实现语法转化与加载。

(7)Babel:一款将 ES6 代码转化为浏览器兼容的 ES5 代码的插件

利用以上等技术,我们便可以开始构建我们的 Vue 项目了。

构建大型应用

在构建我们的中大型 Vue 项目中,我们主要介绍如何利用 vue-cli 来自动生成我们项目的前端目录及文件,了解 Vue 中一切皆组件的概念及父子组件的通信问题,讲解在 Vue 项目中我们如何使用第三方插件,最后利用 webpack 来打包及部署我们的项目。

vue-cli 构建

在使用 vue-cli 之前我们需要安装 node.js,利用其提供的 npm 命令来安装 vue-cli。安装 node.js 只需去其官网下载软件并安装即可,地址为:https://nodejs.org/en/
安装完成之后我们打开电脑的 cmd 命令行工具依次输入上图中的命令:

(1)npm install -g vue-cli:全局安装 vue-cli

(2)vue init webpack my-project: 利用 vue-cli 在目录地址生成一个基于 webpack 的名为’my-project‘的 Vue 项目文件及目录

(3)cd my-project:打开刚刚创建的文件夹

(4)npm intall:安装项目所依赖的包文件

(5)npm run dev:利用本地 node 服务器在浏览器中打开并浏览项目页面

这样我们的一个基于 webpack 的 vue 项目目录就构建好了。

单文件组件

在刚刚构建好的 vue 项目中,我们会发现一个 App.vue 和 Hello.vue 的文件,那么像这样的以.vue 后缀结尾的文件便是我们 Vue 项目中常见的单文件组件。单文件组件包含了一个功能或模块的 html、js 及 css。在.vue 文件中,我们可以在 template 标签中写 html,在 script 标签中写 js,在 style 标签中写 css。这样一个功能或模块就是一个.vue 组件,对于组件公用和后期的维护也非常便捷。

父子组件通信

那么像这样在以单文件组件为核心的项目开发中,我们一定会想到一个问题,就是.vue 父子组件之间是如何交换数据来实现通信的呢?在 Vue2.0 中提供了 props 来实现父组件向子组件传递数据,通过 $emit 来实现子组件向父组件传递数据。当然如果是较为复杂和普遍的数据交互,建议大家使用 vuex 来同一管理数据。详情请见:https://vuefe.cn/guide/components.html# 使用 Props 传递数据

插件使用

接下来我们介绍下在基于 webpack 的 vue 项目中我们是如何使用插件的,主要有两种情况:

(一)全局使用

(1)在 index.html 引入:这样的方式不推荐使用,因为存在先后加载顺序的问题,有些插件不支持这一方式。

(2)通过 webpack 配置文件引入:主要通过 plugin 配置项的 webpack.ProvidePlugin() 方法实现,不过只适合支持 CommonJs 规范并提供一个全局变量的插件,如 jQuery 中的 $。

(3)通过 import + Vue.use() 引入:这种方式需要在全局.vue 文件中 import 需要加载的插件,然后通过 Vue.use(‘插件变量名’) 来实现,不过此方法只支持遵循 Vue.js 插件编写规范的插件使用,如 vue-resourece。

(二)单文件使用

(1)通过 import 直接引入:这种方式可以在需要调用插件的.vue 文件中使用,不过需要注意和实例的创建顺序问题,或者也可以通过 require 引入。

(2)import + components 注册:此方式为 Vue 组件的使用方式,可以在一个组件中注册并使用一个子组件。

部署及优化

当我们搞定整个 Vue 项目的前端编码阶段后,我们需要对我们的前端项目文件进行部署和优化工作,主要的几个方式如下:

(1)使用 webpack 的 DefinePlugin 指定生产环境:通过 plugin 中的 DefinePlugin 配置,我们可以声明’process.env’属性为’development’(开发环境) 或者’production’(生产环境),结合 npm 配置文件 package.json 中 scripts 的命令来切换环境模式十分方便。

(2)使用 UglifyJs 自动删除代码块内的警告语句:一般在生产环境的 webpack 配置文件中使用,通过 new webpack.optimize.UglifyJsPlugin() 来进行配置,删除警告语句可以缩减文件的体积。
(3)使用 Webpack hash 处理缓存:当我们需要对发布到线上的文件进行修改时,重新编译的文件名如果和之前版本的相同会引起浏览器无法识别而加载缓存文件的问题。这样我们需要自动的生成带 hash 值的文件名来阻止缓存。详见:https://segmentfault.com/a/1190000006178770#articleHeader7

(4)使用 v-if 减少不必要的组件加载:v-if 指令其实很有用处,它可以让我们项目中暂时不需要的组件不进行渲染,等需要用到的时候在渲染,比如某个弹窗组件等。这样我们可以减少页面首次加载的时间和文件量。

除了以上几点的优化,还有很多优化选择,有兴趣的童鞋可以好好地了解下 webpack 的 API 文档,毕竟 webpack 的功能十分强大。

数据驱动实例

这是我之前利用 Vue.js 数据驱动的原理写的一个拼图游戏,希望能够供大家进一步了解 Vue 数据驱动的理念。

演示地址:拼图游戏

代码地址:拼图代码

总结

本文以 PPT 图片附加文字介绍的形式简单介绍了 Vue.js 的知识点及开发流程,并将前端自动化、组件化、工程化的理念贯穿其中,由浅入深地阐述了 Vue.js“简单却不失优雅,小巧而不发大匠”的独特魅力。