Vue.js
vue.js 介绍
Vue是一套用于构建用户界面的渐进式框架。Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层。还便于与第三方库或者是既有项目进行整合。
自底向上逐层应用,作为渐进式框架要实现的目标就是方便项目进行增量开发。
MVVM模式
vue.js是一个MVVM的框架,理解MVVM有利于学习vue.js
MVVM拆分解释为:
- Model:负责数据存储
- View:负责页面展示
- View Model:负责业务逻辑处理 比如ajax请求等,对数据进行加工后交给视图进行展示
MVVM要解决的问题是
- 将业务 逻辑代码与视图代码进行完全分离。使各自的职责更加清晰,后期代码维护更加简单。
- 用图解的形式分析Ajax请求回来数据后直接操作Dom来达到视图更新的缺点,以及使用MMVVM模式是如何来解决这个缺点的。
入门程序:
- 编写HTML文件 引入 vue.min.js
- 编写视图部分的代码(用户界面,只负责展示)
- 编写VM (viewmodel)及其中Model
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue.js测试程序</title>
<script src="vue.min.js"></script>
</head>
<body>
<!--实现在body区域显示一个郑州名称-->
<div id="app">
{{name}}<!--相当于MVVM的view视图-->
</div>
</body>
<script>
//编写MVVM中的model部分及VM(ViewModel)部分
var VM = new Vue({
el:'#app',//vm接管了app区域的管理
data:{//model数据
name:'郑州'
}
});
</script>
</html>
vue.js常用指令
1. v-model
实现数据的双向绑定:
a、由模型数据绑定到Dom对象,模型数据的值改变,Dom的值自动改变
b、由Dom对象绑定到模型数据,Dom对象的值改变,模型数据就变
例如:
我们使用v-model来实现一个加法计算器的例子。在两个输入框中输入数据,显示两个数相加的结果。使用如下的一个简单地例子实现Dom对象和V-model双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue.js常用指令的测试</title>
</head>
<body>
<div id="app">
<!--相当于MVVM的view视图-->
<!--{{name}}-->
<span v-text="name"></span>
</a>
<input type="text" v-model="num1"/> +
<input type="text" v-model="num2"/>=
//在这里我们使用插值表达式进行计算
{{Number.parseInt(num1)+Number.parseInt(num2)}}
</div>
</body>
<script src="vue.min.js"></script>
<script>
//编写MVVM中的model部分及VM(ViewModel)部分
var VM = new Vue({
el:'#app',//vm接管了app区域的管理
data:{//model数据
name:'计算器',
num1:0,
num2:0,
}
});
</script>
</html>
v-model和Dom进行绑定,我们输入Dom中的值,然后模型中的值相应的进行改变。
以上就是双向绑定的效果
注意:
v-model
可以在表单控件或者组件上创建双向绑定
v-model只能在如下的元素中使用
-
input
-
select
-
textarea
-
components(Vue)中的组件
v-text
在以上的例子中我们直接使用了一个插值表达式进行两个输入框中数据的计算,但是当我们的网上过慢的时候,会出现,表达式闪烁的问题,会显示表达式,表达式中的值无法及时的显示
v-test 可以将一个变量的值渲染到指定的元素中,它可以解决插值表达式闪烁的问题。
在上面的例子中,我们可以在标签中添加一个v-text
<span v-text="name"></span>
</a>
<input type="text" v-model="num1"/> +
<input type="text" v-model="num2"/>=
<span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span>
<span v-text="result"></span>
加上v-test之后,当表达式中的值加载完毕之后,才会进行显示。
v-on指令
监听用户事件
在上面的例子中,我们增加一个计算的按钮
<input type="text" v-model="num1"/> +
<input type="text" v-model="num2"/>=
<!-- <span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span>-->
<span v-text="result"></span>
<!--{{Number.parseInt(num1)+Number.parseInt(num2)}}-->
<button v-on:click="change">计算</button>
<script>
//编写MVVM中的model部分及VM(ViewModel)部分
var VM = new Vue({
el:'#app',//vm接管了app区域的管理
data:{//model数据
name:'计算器',
num1:0,
num2:0,
result:0,
size:11
},
methods:{
change:function () {
this.result = Number.parseInt(this.num1)+Number.parseInt(this.num2)
}
}
});
</script>
使用 this.result 把计算结果存储到result变量中,我们访问模型中变量的时候,需要增加this. 这样才可以访问模型中的变量。
v-bind
- 作用:
- v-bind可以将数据对象绑定在dom的任意属性中
- v-bind 可以给dom对象绑定一个或者是多个特性,例如动态的绑定style 和class
例如 :
<a v-bind:href="url">
<span v-text="name"></span>
</a>
我们在模型中增加<a>标签,标签中写上v-bind指令 然后在我们的模型中增加URL属性,这样标签中就可以显示URL属性中的内容。
style绑定:
用v-bind:style
形式是一个对象,对象的key是样式名(如fontSize,注意样式名需要采用驼峰式而不是css式),值是样式的值;
可以直接将对象名放在v-bind:style的等式右边;
对象的值改变,将实时影响内联样式;
对于某些样式,可以针对浏览器加前缀(但某些不能对所有浏览器兼容);
v-for和vi-if
可以循环遍历一个数组或者是一个json数据中每一个属性值。
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF‐8">
<title>Document</title>
<script src="/js/vue/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<!‐‐只显示偶数行‐‐>
<li v‐for="(item,index) in list" :key="index" v‐if="index % 2==0"> {{index}}-{{item}}
</li>
<li v-for ="(value,key) in user"> {{key}}‐{{value}}</li>
<li v‐for="(item,index) in userlist" :key="item.user.uname">
<div v‐if="item.user.uname=='heima'" style="background: chartreuse">
<!‐‐名称为heima的 加背景色‐‐>
{{index}}‐{{item.user.uname}}‐{{item.user.age}}
</div>
<div v-else="">
{{index}}‐{{item.user.uname}}‐{{item.user.age}}
</div>
</li>
</ul>
</div>
</body>
<script>
new Vue({
el:'#app',
data:{
list:[1,2,3,4,4],
user:{uname:'zhangsan',age:10},
userlist:[
{ user:{uname:'xiaohua',age:10}},
{ user:{uname:'xiaoming',age:11}}
]
}
});
</script>
</html>
2. webpack入门
我们在使用vuejs开发大型项目的时候,需要使用webpack打包工具
webpack介绍
webpack是一个前端资源的打包工具,它可以将js image css等资源当成一个模块进行打包
-
模块化开发
- 程序员在开发时可以分模块开发,比如什么角色管理模块,用户管理模块等等模块。我们在不同模块的开发中,创建不同的js css等小文件 方便我们开发,最后使用webpack将这些小文件打包成一个文件,减少了http的请求次数。
- webpack可以实现按需打包,为了避免出现打包文件过大可以将文件打包成多个文件。
-
编译typescript ES6等高级js语法
- 随着前端技术的强大,开发中可以使用JavaScript的很多高级版本,比如typescripy ES6等方便开发,webpack可以将打包文件转换成浏览器可以识别的IS语法。。
-
CSS预编译
- webpack允许在开发中使用Sass和Less等原生CSS的扩展技术,通过sass-loader 、less-loader将Sass和Less的语法编译成浏览器可识别的css语法。
webpack的缺点:
-
1、配置有些繁琐
-
2、文档不丰富
安装webpack
webpack是一个工具,使用之前我们需要进行安装。
webpack基于node.js运行,首先需要安装node.js
node.js介绍
node.js是Javascript的一个运行环境。nodejs是可以运行我们写的js文件的。
node.js是一个基于JavaScript运行时建立的平台,用于方便地搭建响应速度快,易于扩展的网络应用。Node.js使用事件驱动,非常适合在分布式设备上运行数据密集型的实时应用。
为什么会有node.js
有了node.js我们就可以在服务端解析JavaScript。
传统意义上的 JavaScript 运行在浏览器上,Chrome 使用的JavaScript引擎是 V8,Node.js 是一个运行在服务端 的框架,它的底层就使用了V8引擎,这样就可以使用javascript去编写一些服务端的程序,这样也就实现了用javaScript去开发 Apache + PHP 以及 Java Servlet所开发的服务端功能,这样做的好处就是前端和后端都采用 javascript,即开发一份js程序即可以运行在前端也可以运行的服务端,这样比一个应用使用多种语言在开发效率上要高,不过node.js属于新兴产品,一些公司也在尝试使用node.js完成一些业务领域,node.js基于V8引擎,基于事件驱动机制,在特定领域性能出色,比如用node.js实现消息推送、状态监控等的业务功能非常合适。
安装node.js
-
下载对应的版本 https://nodejs.org/en/download/
-
选安装目录进行安装
默认即可
安装完成检查PATH环境变量是否设置了node.js的路径。
3、测试
在命令提示符下输入命令
会显示当前node的版本
安装NPM
- 我们在安装webpack之前需要安装node.js
- node.js的运行又依赖于NPM的包
所有我们要安装webpack 需要通过NPM来进行安装webpack
npm全称Node Package Manager,他是node包管理和分发的工具,使用NPM可以对应用的依赖进行管理,NPM的功能和服务端项目构建工具maven差不多,我们通过npm 可以很方便地下载js库,打包js文件。
node.js已经集成了npm工具,在命令提示符输入 npm -v 可查看当前npm版本
npm -v 查看对应的版本
npm的工作原理就是,去远程下载所依赖的包。
- 设置npm下载的包路径
包路径就是npm从远程下载的js包所存放的路径。
使用 npm config ls 查询NPM管理包路径(NPM下载的依赖包所存放的路径)
NPM默认的管理包路径在C:/用户/[用户名]/AppData/Roming/npm/node_meodules,
为了方便对依赖包管理,我们将管理包的路径设置在单独的地方,将安装目录设置在node.js的目录下,
创建npm_modules和 npm_cache,执行下边的命令:
因为我安装的node.js在D:\Program Files\nodejs下所以执行命令如下:
npm config set prefix "D:\Program Files\nodejs\npm_modules"
npm config set cache "D:\Program Files\nodejs\npm_cache"
我在修改此处命令的时候,还出现个问题就是,上面的两行命令无法执行成功。路径显示未修改,这个时候也可以直接修改nodejs的配置文件。
修改npm文件夹下的npmrc文件,打开修改里面的内容,原来的内容删掉,写入
prefix=D:\Program Files\nodejs\npm_modules
cache=D:\Program Files\nodejs\npm_cache
此时再使用 npm config ls 查询NPM管理包路径发现路径已更改
- 安装cnpm
我们使用npm的时候,默认是从国外的镜像中进行下载的 ,我们可以使用cnpm从国内的镜像中下载。
cnpm替代了npm,可以从国内的镜像中下载文件。
npm默认会去国外的镜像去下载js包,在开发中通常我们使用国内镜像,这里我们使用淘宝镜像
下边我们来安装cnpm: 有时我们使用npm下载资源会很慢,所以我们可以安装一个cnmp(淘宝镜像)来加快下载速度。
输入命令,进行全局安装淘宝镜像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装后,我们可以使用以下命令来查看cnpm的版本
cnpm -v
安装webpack
webpack安装分为本地安装和全局安装:
- 本地安装:仅将webpack安装在当前项目的node_modules目录中,仅对当前项目有效。
- 全局安装:将webpack安装在本机,对所有项目有效,全局安装会锁定一个webpack版本,该版本可能不适用某个 项目。全局安装需要添加 -g 参数。
进入webpacktest测试目录目录,运行:
1)本地安装
只在我的项目中使用webpack,需要进行本地安装,因为项目和项目所用的webpack的版本不一样。本地安装就会 将webpack的js包下载到项目下的npm_modeuls目录下。
在门户目录下创建webpack测试目录webpacktest01:
npm install --save-dev webpack 或 cnpm install --save-dev webpack
npm install --save-dev webpack-cli (4.0以后的版本需要安装webpack-cli)
2)全局安装加-g,如下: 全局安装就将webpack的js包下载到npm的包路径下。
npm install webpack -g 或 cnpm install webpack -g
3)安装webpack指定的版本:
本教程使用webpack3.6.0,安装webpack3.6.0:
进入webpacktest测试目录,
运行:
cnpm install --save-dev webpack@3.6.0
全局安装:
npm install webpack@3.6.0 -g或 cnpm install webpack@3.6.0 -g
在cmd状态输入webpack,出现如下提示说明 webpack安装成功
No configuration file found and no output filename configured via CLI option.
A configuration file could be named ‘webpack.config.js’ in the current directory.
Use --help to display the CLI options.
webpack入门程序
主要是webpack打包的过程及模块化开发的思想。
实现对js文件的打包,体会webpack是如何对应用进行模块化管理。
对上边1+1=2的例子使用webpack进行模块化管理
在webpacktest01目录下创建model01.js 将本程序使用的加法运算的js方法抽取到一个js文件,此文件就是一个模块
model01.js
/**
* Created by Administrator on 2019/9/9.
*/
var add = function (x, y) {
return x+y;
}
var add2 = function (x, y) {
return x+y+2;
}
module.exports.add = add; //model01导出之后,才能导入,ES5高级语法
// module.exports ={add,add2};//如果有多个方法这样导出
// module.exports.add2 = add2//如果有多个方法也可以这样导出
2, 定义入口文件,main.js
在webpacktest01目录下创建main.js,main.js是本程序的js主文件,
包括如下内容:
1、在此文件中会引用model01.js模块
2、引用vue.min.js(它也一个模块)
3、将html页面中构建vue实例的代码放在main.js中。
main.js的代码如下
//导入model01.js
var {add} = require("./model01")
var Vue = require("./vue.min")
var VM = new Vue({
el:'#app',//vm接管了app区域的管理
data:{//model数据
name:'计算器',
num1:0,
num2:0,
result:0,
size:11
},
methods:{
change:function () {
this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2))
}
}
});
打包测试
上边将mode01.js模块及main.js主文件编写完成,下边使用webpack对这些js文件进行打包
1、进入程序目录,进入到该文件上所在目录,然后打开命令窗口执行以下命令
webpack main.js build.js
执行webpack main.js build.js ,这段指令表示将main.js打包输出为 build.js文件
执行完成,观察程序目录是否出现build.js。
执行结果:
Asset Size Chunks Chunk Names
build.js 105 kB 0 [emitted] main
[0] (webpack)/buildin/global.js 509 bytes {0} [built]
[1] ./main.js 447 bytes {0} [built]
[2] ./model01.js 377 bytes {0} [built]
[3] ./vue.min.js 86.7 kB {0} [built]
+ 3 hidden modules
执行完之后,我们就会在我们的项目文件夹下,看到生成的一个build.js文件
然后我们在HTML中,就可以使用来引用我们打包的文件。
以上就是webpack打包的过程。。。
总结:webpack开发过程
1)分模块去定义js
在js找那个要导出将来要被打包的方法module
2)定义main,js 入口文件,这个文件是主文件。在此文件中,导入引用的js文件var {add} = require("./model01")。。可以在main.js中使用导入的js方法
3)使用webpack命令打包js
4)在HTML上引用打包生成的js文件
以上是手动的打包过程,下面使用webpack-server 实现自动的打包和部署
3. webpack-dev-serve
webpack-dev-server开发服务器,它的功能可以实现热加载 并且自动刷新浏览器。
3.1 安装webpack-dev-serve
使用 webpack-dev-server需要安装webpack、 webpack-dev-server和 html-webpack-plugin三个包。
cnpm install webpack@3.6.0 webpack-dev-server@2.9.1 html-webpack-plugin@2.30.1 --save-dev
安装完成,自动创建nodemodule文件夹,这是这个程序所有依赖的包。而且还会发现程序目录出现一个package.json文件,此文件中记录了程序的依赖。
配置webpack-dev-serve
在package.json中配置script
"scripts": {
"dev": "webpack‐dev‐server ‐‐inline ‐‐hot ‐‐open ‐‐port 5008"
},
- inline:自动刷新
- hot:热加载
- port:指定端口
- open:自动在默认浏览器打开
- host:可以指定服务器的 ip,不指定则为127.0.0.1,如果对外发布则填写公网ip地址
此时package.json的文件内容如下:
{
"scripts": {
"dev": "webpack-dev-server --inline --hot --open --port 5008"
},
"devDependencies": {
"html-webpack-plugin": "^2.30.1",
"webpack": "^3.6.0",
"webpack-dev-server": "^2.9.1"
}
}
- devDependencies:开发人员在开发过程中所需要的依赖。
- scripts:可执行的命令
配置webpack.config.js
我们可以在项目目录下创建 webpack.config.js,
webpack.config.js是webpack的配置文件。
在此文件中可以配置应用的入口文件、输出配置、插件等,其中要实现热加载自动刷新功能需要配置html-webpack-plugin插件。
html-webpack-plugin的作用是根据html模板在内存生成html文件,它的工作原理是根据模板文件在内存中生成一 个index.html文件。
- 配置模板文件
vue_02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue.js常用指令的测试</title>
</head>
<body>
<!--实现在body区域显示一个传智播客名称-->
<div id="app">
<!--相当于MVVM的view视图-->
<!--{{name}}-->
<span v-text="name"></span>
</a>
<input type="text" v-model="num1"/> +
<input type="text" v-model="num2"/>=
<span v-text="result"></span>
<button v-on:click="change">计算</button>
</div>
</body>
<script>
//编写MVVM中的model部分及VM(ViewModel)部分
</script>
</html>
2、配置 html-webpack-plugin
在webpack.config.js中配置html-webpack-plugin插件
//引用html-webpack-plugin插件,作用是根据html模板在内存生成html文件,它的工作原理是根据模板文件在内存中生成一个index.html文件。
var htmlwp = require('html-webpack-plugin');
module.exports={
entry:'./src/main.js', //指定打包的入口文件
output:{
path : __dirname+'/dist', // 注意:__dirname表示webpack.config.js所在目录的绝对路径
filename:'build.js' //输出文件
},
devtool: 'eval-source-map',
plugins:[
new htmlwp({
title: '首页', //生成的页面标题<head><title>首页</title></head>
filename: 'index.html', //webpack-dev-server在内存中生成的文件名称,自动将build注入到这个页面底部,才能实现自动刷新功能
template: 'vue_02.html' //根据vue_02.html这个模板来生成(这个文件请程序员自己生成)
})
]
}
启动
启动文件:
1、进入项目文件目录,打开命令窗口,执行npm run dev
2、使用webstorm,右键package.json文件,选择“Show npm Scripts”
打开窗口:
双击 dev。
注意:dev就是在package.json中配置的webpack dev server命令。
发现启动成功自动打开浏览器。
修改src中的任意文件内容,自动加载并刷新浏览器。
以上就是使用webpack打包和使用配置的过程