1 Vue.js与Webpack研究
链接:https://pan.baidu.com/s/1_cxMH4M44kFknkXTet1u6Q
提取码:xook
1 vue.js研究
1.1 vue.js介绍
1、vue.js是什么?
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计
为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一
方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
渐进式框架:Progressive,说明vue.js的轻量,是指一个前端项目可以使用vue.js一两个特性也可以整个项目都用
vue.js。
自底向上逐层应用:作为渐进式框架要实现的目标就是方便项目增量开发。
参考:https://cn.vuejs.org/v2/guide/
2、Vue.js与ECMAScript
Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。
什么是ECMAScript?
ES6:http://www.ecma-international.org/ecma-262/6.0/
ES7:http://www.ecma-international.org/ecma-262/7.0/
3、Vue.js的使用
1)在html页面使用script引入vue.js的库即可使用。
2)使用Npm管理依赖,使用webpack打包工具对vue.js应用打包。
大型应用推荐此方案。
使用vue.js官方提供的CLI脚本架很方便去创建vue.js工程雏形。
4、vue.js有哪些功能?
1)声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。
比如:使用vue.js的插值表达式放在Dom的任意地方, 差值表达式的值将被渲染在Dom中。
2)条件与循环
dom中可以使用vue.js提供的v-if、v-for等标签,方便对数据进行判断、循环。
3)双向数据绑定
Vue 提供v-model 指令,它可以轻松实现Dom元素和数据对象之间双向绑定,即修改Dom元素中的值自动修改绑
定的数据对象,修改数据对象的值自动修改Dom元素中的值。
4)处理用户输入
为了让用户和你的应用进行交互,我们可以用 v-on 指令添加一个事件监听器,通过它调用在 Vue 实例中定义的
方法
5)组件化应用构建
vue.js可以定义一个一个的组件,在vue页面中引用组件,这个功能非常适合构建大型应用。
1.2 vue.js基础
1.2.1 MVVM模式
vue.js是一个MVVM的框架,理解MVVM有利于学习vue.js。
MVVM拆分解释为:
Model:负责数据存储
View:负责页面展示
View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示
MVVM要解决的问题是将业务逻辑代码与视图代码进行完全分离,使各自的职责更加清晰,后期代码维护更
加简单
用图解的形式分析Ajax请求回来数据后直接操作Dom来达到视图的更新的缺点,以及使用MVVM模式是如何
来解决这个缺点的
Vue中的 MVVM
从上图看出,VM(ViewModel)可以把view视图和Model模型解耦合,VM的要做的工作就是vue.js所承担的。
1.2.2 入门程序
打开 webstrom
本次测试我们在门户目录中创建一个html页面进行测试,正式的页面管理前端程序会单独创建工程。
在门户目录中创建vuetest目录,并且在目录下创建vue_01.html文件
=========================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF‐8">
<title>vue.js入门程序</title>
<script src="/js/vue/vue.min.js"></script>
</head>
<body>
<div id="app">
{{name}}
<!‐‐ 在Vue接管区域中使用Vue的系统指令呈现数据
这些指令就相当于是MVVM中的View这个角色 ‐‐>
</div>
</body>
<script>
// 实例化Vue对象
//vm :叫做MVVM中的 View Model
var VM = new Vue({
el:"#app",//表示当前vue对象接管app的div区域
data:{
name:'lww'// 相当于是MVVM中的Model这个角色
}
});
</script>
</html>
==========================
启动 nginx 浏览器输入:http://www.xuecheng.com/vuetest/vue_01.html
代码编写步骤:
1、定义html,引入vue.js
2、定义app div,此区域作为vue的接管区域
3、定义vue实例,接管app区域。
4、定义model(数据对象)
5、VM完成在app中展示数据
1.2.3 1+1=2
=========================
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>Title
<script src="/js/vue/vue.min.js">
<div id="app">
{{name}}
<input type="text" v-model="num1">+
<input type="text" v-model="num2">={{Number.parseInt(num1)+Number.parseInt(num2)}}
<button>计算
// 实例化Vue对象 //vm :叫做MVVM中的 View Model
var VM=new Vue({
el :"#app",// 表示当前vue 接管app的div区域
data:{
name :'lww', // 相当于是MVVM中的Model这个角色
num1 :1,
num2 :2
}
})
</html>
=========================
1、在表单控件或者组件上创建双向绑定 2、v-model仅能在如下元素中使用:
input
select
textarea
components(Vue中的组件)
2、解决插值表达式闪烁问题,使用v-text
v-text可以将一个变量的值渲染到指定的元素中,它可以解决插值表达式闪烁的问题
3、v-on绑定一个按钮的单击事件
4、v-bind
====================
1、作用:
v‐bind可以将数据对象绑定在dom的任意属性中。
v‐bind可以给dom对象绑定一个或多个特性,例如动态绑定style和class
2、举例:
<img v‐bind:src="imageSrc">
<div v‐bind:style="{ fontSize: size + 'px' }"></div>
3、缩写形式
<img :src="imageSrc">
<div :style="{ fontSize: size + 'px' }"></div>
=====================Eg
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>Title
<div id="app">
<span v-text="name">
<input type="text" v-model="num1">+
<input type="text" v-model="num2">=
<span v-text="result">
<button v-on:click="chang">计算
<a v-bind:href="url">360
<div :style="{ fontSize: size + 'px' }">divdiv
<script src="/js/vue/vue.min.js">
// 实例化Vue对象 //vm :叫做MVVM中的 View Model
var VM =new Vue({
el:"#app",// 表示当前vue 接管app的div区域
data: {
name:'lww', // 相当于是MVVM中的Model这个角色
num1:0,
num2:0,
result:0,
url:"https://hao.360.com/?wd=1000",
size:30
},
methods: {
chang:function () {
this.result = Number.parseInt(this.num1) + Number.parseInt(this.num2)
alert("计算结果 " +this.result)
}
}
})
</html>
=====================
1.2.4 v-if和v-for
======================eg
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>Title
<script src="/js/vue/vue.min.js">
<div id="app">
{{name}}
<li v-for="(item,index) in list" :key="index" >{{index}}-{{item}}
<div >aaaaaaaaa
<li v-for="(item,index) in list" :key="index" v-if="index % 2==0">{{index}}-{{item}}
<div >aaaaaaaaa
<li v-for ="(value,key) in user">{{key}}-{{value}}
<div >aaaaaaaaa
<li v-for="(item,index) in userlist" :key="item.user.uname">{{index}}‐{{item.user.uname}}‐{{item.user.age}}
<div >aaaaaaaaa
<li v-for="(item,index) in userlist" :key="item.user.uname">
<div v-if="item.user.uname=='lww'" style="background:chartreuse">
{{index}}‐{{item.user.uname}}‐{{item.user.age}}
<div v-else=""> {{index}}‐{{item.user.uname}}‐{{item.user.age}}
// 实例化Vue对象 //vm :叫做MVVM中的 View Model
var VM=new Vue({
el :"#app",// 表示当前vue 接管app的div区域
data:{
name :'lww', // 相当于是MVVM中的Model这个角色
list:[1,2,3,4,5,6],
user:{uname:'lww',age:10},
userlist:[
{user:{uname:'lww',age:10}},
{user:{uname:'jjj',age:11}}
]
}
})
</html>
======================
1.3 webpack入门
使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法。
1.3.1 webpack介绍
Webpack 是一个前端资源的打包工具,它可以将js、image、css等资源当成一个模块进行打包。
从图中我们可以看出,Webpack 可以将js、css、png等多种静态资源 进行打包,使用webpack有什么好处呢?
1、模块化开发
程序员在开发时可以分模块创建不同的js、 css等小文件方便开发,最后使用webpack将这些小文件打包成一个文
件,减少了http的请求次数。
webpack可以实现按需打包,为了避免出现打包文件过大可以打包成多个文件。
2、 编译typescript、ES6等高级js语法
随着前端技术的强大,开发中可以使用javascript的很多高级版本,比如:typescript、ES6等,方便开发,
webpack可以将打包文件转换成浏览器可识别的js语法。
3、CSS预编译
webpack允许在开发中使用Sass 和 Less等原生CSS的扩展技术,通过sass-loader、less-loader将Sass 和 Less的
语法编译成浏览器可识别的css语法。
webpack的缺点:
1、配置有些繁琐
2、文档不丰富
1.3.2 安装webpack
1.3.2.1 安装Node.js
webpack基于node.js运行,首先需要安装node.js。
为什么会有node.js?
传统意义上的 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:
1、下载对应你系统的Node.js版本:
https://nodejs.org/en/download/
2、选安装目录进行安装
默认即可
安装完成检查PATH环境变量是否设置了node.js的路径。
3、测试
在命令提示符下输入命令
node ‐v
会显示当前node的版本
1.3.2.2 安装NPM
1、自动安装NPM
npm全称Node Package Manager,他是node包管理和分发的工具,使用NPM可以对应用的依赖进行管理,NPM
的功能和服务端项目构建工具maven差不多,我们通过npm 可以很方便地下载js库,打包js文件。
node.js已经集成了npm工具,在命令提示符输入 npm -v 可查看当前npm版本
2、设置包路径
包路径就是npm从远程下载的js包所存放的路径。
使用 npm config ls 查询NPM管理包路径(NPM下载的依赖包所存放的路径)
NPM默认的管理包路径在C:/用户/[用户名]/AppData/Roming/npm/node_meodules,为了方便对依赖包管理,我
们将管理包的路径设置在单独的地方,本教程将安装目录设置在node.js的目录下,创建npm_modules和
npm_cache,执行下边的命令:
本教程安装node.js在D:\soft\javaEE\nodejs下所以执行命令如下:
npm config set prefix "D:\soft\javaEE\nodejs\npm_modules"
npm config set cache "D:\soft\javaEE\nodejs\npm_cache"
此时再使用 npm config ls 查询NPM管理包路径发现路径已更改
将npm_modules 添加到环境变量 path中
3、安装cnpm
npm默认会去国外的镜像去下载js包,在开发中通常我们使用国内镜像,这里我们使用淘宝镜像
下边我们来安装cnpm:
有时我们使用npm下载资源会很慢,所以我们可以安装一个cnmp(淘宝镜像)来加快下载速度。
输入命令,进行全局安装淘宝镜像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装后,我们可以使用以下命令来查看cnpm的版本
进入npm_modules 然后进cmd窗口
nrm ls 查看镜像已经指向taobao
使nrm use XXX切换 镜像
如果nrm没有安装则需要进行全局安装:cnpm install -g nrm
1.3.2.3 安装webpack
1、连网安装
webpack安装分为本地安装和全局安装:
本地安装:仅将webpack安装在当前项目的node_modules目录中,仅对当前项目有效。
全局安装:将webpack安装在本机,对所有项目有效,全局安装会锁定一个webpack版本,该版本可能不适用某个
项目。全局安装需要添加 -g 参数。
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
https://segmentfault.com/a/1190000013699050
全局安装 npm install webpack-cli -g
1.3.3 入门程序
通过本入门程序体会webpack打包的过程及模块化开发的思想。
1.3.3.1 需求分析
通过入门程序实现对js文件的打包,体会webpack是如何对应用进行模块化管理。
对上边1+1=2的例子使用webpack进行模块化管理
1.3.3.2 定义模块
创建webpacktest01目录,将vue.min.js及vue_02.html拷贝到目录下。
1、定义model01.js
在webpacktest01目录下创建model01.js
将本程序使用的加法运算的js方法抽取到一个js文件,此文件就是一个模块
=========================
// 定义add函数
function add(x, y) {
return x + y
}
// function add2(x, y) {
// return x + y+1
// }
// 导出add方法
module.exports.add = add;
// 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的代码如下
============================
var {add} = require('./model01.js');
var Vue = require('./vue.min.js');
var VM =new Vue({
el:"#app",//表示当前vue对象接管app的div区域
data:{
name:'lww', // 相当于是MVVM中的Model这个角色
num1:0,
num2:0,
result:0,
url:"https://hao.360.com/?wd=1000",
size:30
},
methods:{
chang:function () {
this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2))
alert("计算结果 " +this.result)
}
}
});
============================
1.3.3.3 打包测试
上边将mode01.js模块及main.js主文件编写完成,下边使用webpack对这些js文件进行打包
1、进入程序目录,执行webpack ./main.js -o build.js --mode=production ,
这段指令表示将main.js打包输出为 build.js文件
webpack --mode=production // 生产环境
webpack --mode=development // 开发环境
执行完成,观察程序目录是否出现build.js。
2、在html中引用build.js
<script src="build.js"></script>
1.3.4 webpack-dev-server
1、安装webpack-dev-server
使用 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
(--save-dev本地安装)
安装完成,会发现程序目录出现一个package.json文件,此文件中记录了程序的依赖。
2、配置webpack-dev-server
在package.json中配置script
"scripts": {
"dev": "webpack‐dev‐server ‐‐inline ‐‐hot ‐‐open ‐‐port 5008"
},
--inline:自动刷新
--hot:热加载
--port:指定端口
--open:自动在默认浏览器打开
--host:可以指定服务器的 ip,不指定则为127.0.0.1,如果对外发布则填写公网ip地址
devDependencies:开发人员在开发过程中所需要的依赖。
scripts:可执行的命令
1.3.4.2 配置webpack.confifig.js
在webpacktest02目录下创建 webpack.confifig.js, webpack.confifig.js是webpack的配置文件。在此文件中可以配
置应用的入口文件、输出配置、插件等,其中要实现热加载自动刷新功能需要配置html-webpack-plugin插件。
html-webpack-plugin的作用是根据html模板在内存生成html文件,它的工作原理是根据模板文件在内存中生成一
个index.html文件。
配置 html-webpack-plugin
在webpack.confifig.js中配置html-webpack-plugin插件
========================
var htmlwp = require('html‐webpack‐plugin');
module.exports={
entry:'./src/main.js', //指定打包的入口文件
output:{
path : __dirname+'/dist', // 注意:__dirname表示webpack.config.js所在目录的绝对路径
filename:'build.js' //输出文件
},
plugins:[
new htmlwp({
title: '首页', //生成的页面标题<head><title>首页</title></head>
filename: 'index.html', //webpack‐dev‐server在内存中生成的文件名称,自动将build注入到这
个页面底部,才能实现自动刷新功能
template: 'vue_02.html' //根据index1.html这个模板来生成(这个文件请程序员自己生成)
})
]
}
==========================
1.3.4.3 启动
启动文件:
1、进入 webpacktest02目录,执行npm run dev
2、使用webstorm,右键package.json文件,选择“Show npm Scripts”
打开窗口:
双击 dev。
注意:dev就是在package.json中配置的webpack dev server命令。
发现启动成功自动打开浏览器。
修改src中的任意文件内容,自动加载并刷新浏览器。
1.3.4.4 debug调试
使用了webpack之后就不能采用传统js的调试方法在chrome中打断点。
webpack将多个源文件打包成一个文件,并且文件的内容产生了很大的变化,webpack提供devtool进行调试,
devtool是基于sourcemap的方式,在调试时会生成一个map文件,其内容记录生成文件和源文件的内容映射,即
生成文件中的哪个位置对应源文件中的哪个位置,有了sourcemap就可以在调试时看到源代码。
配置如下:
1、在webpack.confifig.js中配置:
devtool: 'eval‐source‐map',
webpack.confifig.js部分内容如下:
=============================
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',
......
==============================
2、在js中跟踪代码的位置上添加debugger
一个例子:
在add方法中添加debugger
====================
// 定义add函数
function add(x, y) {
debugger
return x + y
}
=====================
启动应用,刷新页面跟踪代码:
点击“计算” 即进入debugger代码位置,此时可以使用chrome进行调试了。