MVC是一个非常好的协作模式, 能够有效降低代码的耦合度从架构上能够让开发者明白代码应该写在哪里。为了让View更纯粹, 还可以使用Thyme leaf、Frree marker等模板引擎, 使模板里无法写入Java代码, 让前后端分工更加清晰。
缺点
前端开发重度依赖开发环境,开发效率低,这种架构下,前后端协作有两种模式:
-
第一种是前端写DEMO, 写好后, 让后端去套模板。好处是DEMO可以本地开发, 很高效。不足是还需要后端套模板,有可能套错,套完后还需要前端确定,来回沟通调整的成本比较大;
-
另一种协作模式是前端负责浏览器端的所有开发和服务器端的View层模板开发。好处是UI相关的代码都是前端去写就好,后端不用太关注,不足就是前端开发重度绑定后端环境,环境成为影响前端开发效率的重要因素。
前后端职责纠缠不清:模板引擎功能强大,依旧可以通过拿到的上下文变量来实现各种业务逻辑。这样,只要前端弱势一点,往往就会被后端要求在模板层写出不少业务代码,还有一个很大的灰色地带是Controller, 页面路由等功能本应该是前端最关注的, 但却是由后端来实现。Controller本身与Model往往也会纠缠不清,看了让人咬牙的业务代码经常会出现在Controller层。这些问题不能全归结于程序员的素养, 否则JSP就够了。
对前端发挥的局限性:性能优化如果只在前端做空间非常有限,于是我们经常需要后端合作,但由于后端框架限制,我们很难使用[Comet】、【Big Pipe】等技术方案来优化性能。
注:在这期间(2005年以前) , 包括早期的JSP、PHP可以称之为Web 1.0时代。在这里想说一句, 如果你是一名Java初学者, 请你不要再把一些陈旧的技术当回事了, 比如JSP, 因为时代在变、技术在变、什么都在变(引用扎克伯格的一句话:唯一不变的是变化本身);当我们去给大学做实训时,有些同学会认为我们没有讲什么干货,其实不然,只能说是你认知里的干货对于市场来说早就过时了而已
2.2基于AJAX带来的SPA时代
时间回到2005年A OAX(Asynchronous JavaScript And XML, 异步JavaScript和XML,老技术新用法)被正式提出并开始使用CDN作为静态资源存储, 于是出现了JavaScript王者归来(在这之前JS都是用来在网页上贴狗皮膏药广告的) 的SPA(Single Page Application) 单页面应用时代。
优点
这种模式下, 前后端的分工非常清晰, 前后端的关键协作点是AJAX接口。看起来是如此美妙, 但回过头来看看的话, 这与JSP时代区别不大。复杂度从服务端的JSP里移到了浏览器的JavaScript,浏览器端变得很复杂。类似Spring MVC, 这个时代开始出现浏览器端的分层架构:
缺点
前后端接口的约定
:如果后端的接口一塌糊涂,如果后端的业务模型不够稳定,那么前端开发会很痛苦;不少团队也有类似尝试,通过接口规则、接口平台等方式来做。有了和后端一起沉淀的接口规则,还可以用来模拟数据,使得前后端可以在约定接口后实现高效并行开发。
前端开发的复杂度控制
:SPA应用大多以功能交互型为主,JavaScript代码过十万行很正常。大量JS代码的组织,与View层的绑定等,都不是容易的事情。
2.3前端为主的MV*时代
此处的MV*模式如下:
MVC(同步通信为主) :Model、View、Controller
MVP(异步通信为主) :Model、View、Presenter
MVVM(异步通信为主):Model、View、View Model为了降低前端开发复杂度,涌现了大量的前端框架,比如:Angular
JS
、React
、Vue.js
、Ember JS等, 这些框架总的原则是先按类型分层, 比如Templates、Controllers、Models, 然后再在层内做切分,如下图:
优点
-
前后端职责很清晰
:前端工作在浏览器端,后端工作在服务端。清晰的分工,可以让开发并行,测试数据的模拟不难, 前端可以本地开发。后端则可以专注于业务逻辑的处理, 输出RESTful等接口。 -
前端开发的复杂度可控
:前端代码很重,但合理的分层,让前端代码能各司其职。这一块蛮有意思的,简单如模板特性的选择,就有很多很多讲究。并非越强大越好,限制什么,留下哪些自由,代码应该如何组织,所有这一切设计,得花一本书的厚度去说明。 -
部署相对独立
:可以快速改进产品体验缺点 -
代码不能复用。比如后端依旧需要对数据做各种校验,校验逻辑无法复用浏览器端的代码。如果可以复用,那么后端的数据校验可以相对简单化。
-
全异步, 对SEO不利。往往还需要服务端做同步渲染的降级方案。
-
性能并非最佳,特别是移动互联网环境下。
-
SPA不能满足所有需求, 依旧存在大量多页面应用。URL Design需要后端配合, 前端无法完全掌控。
2.4Node JS带来的全栈时代
前端为主的MV*模式解决了很多很多问题, 但如上所述, 依旧存在不少不足之处。随着Node JS的兴起, JavaScript开始有能力运行在服务端。这意味着可以有一种新的研发模式:
在这种研发模式下,前后端的职责很清晰
。对前端来说,两个UI层各司其职:
-
Front-end Ul layer处理浏览器层的展现逻辑。通过
CSS渲染样式
, 通过JavaScript添加交互
功能, HTML的生成也可以放在这层, 具体看应用场景。 -
Back-end Ul layer
处理路由、模板、数据获取、Cookie等
。通过路由, 前端终于可以自主把控URL Design, 这样无论是单页面应用还是多页面应用, 前端都可以自由调控。后端也终于可以摆脱对展现的强关注,转而可以专心于业务逻辑层的开发。 -
通过Node, WebServer层也是JavaScript代码, 这意味着部分代码可前后复用, 需要SEO的场景可以在服务端同步渲染,由于异步请求太多导致的性能问题也可以通过服务端来缓解。前一种模式的不足,通过这种模式几乎都能完美解决掉。
-
与JSP模式相比, 全栈模式看起来是一种回归, 也的确是一种向原始开发模式的回归, 不过是一种螺旋上升式的回归。
-
基于Node JS的全栈模式, 依旧面临很多挑战:
-
需要前端对服务端编程有更进一步的认识。比如TCP/IP等网络知识的掌握。
-
Node JS层与Java层的高效通信。Node JS模式下, 都在服务器端, RESTful HTTP通信未必高效, 通过SOAP等方式通信更高效。一切需要在验证中前行。
-
对部著、运维层面的熟练了解,需要更多知识点和实操经验。
-
大量历史遗留问题如何过渡。这可能是最大最大的阻力。
3.1、什么是MVVM
MVVM(Model-View-ViewModel)是一种软件设计模式
,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于Java Applet,简单点说就是在浏览器上运行WPF)的架构师Ken Cooper和Ted Peters开发,是一种简化用户界面的事件驱动编程方式。由John Gossman(同样也是WPF和Sliverlight的架构师)与2005年在他的博客上发表。
MVVM源自于经典的MVC(Model-View-Controller)模式。MVVM的核心是ViewModel
层,负责转换Model中的数据对象来让数据变得更容易管理和使用。其作用如下:
-
该层向上
与视图层进行双向数据绑定
-
向下与
Model层通过接口请求进行数据交互
MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流行的MVVM框架有Vue.js
,Anfular JS
3.2为什么要使用MVVM
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model)
,有几大好处
-
低耦合:
视图(View)
可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 -
可复用
:你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。 -
独立开发
:开发人员可以专注于业务逻辑和数据的开发
(ViewMode),设计人员可以专注于页面设计
。 -
可测试
:界面素来是比较难以测试的,而现在测试可以针对ViewModel来写。
(1)View
View是视图层
, 也就是用户界面。前端主要由HTML和CSS来构建, 为了更方便地展现vi ew Model或者Model层的数据, 已经产生了各种各样的前后端模板语言, 比如FreeMarker,Thymeleaf等等, 各大MVVM框架如Vue.js.Angular JS, EJS等也都有自己用来构建用户界面的内置模板语言。
(2)Model
Model是指数据模型
, 泛指后端进行的各种业务逻辑处理和数据操控, 主要围绕数据库系统展开。这里的难点主要在于需要和前端约定统一的接口规则
(3)ViewModel
ViewModel是由前端开发人员组织生成和维护的视图数据层。在这一层, 前端开发者对从后端获取的Model数据进行转换处理, 做二次封装
, 以生成符合View层使用预期的视图数据模型。
需要注意的是View Model所封装出来的数据模型包括视图的状态和行为两部分, 而Model层的数据模型是只包含状态的。
-
比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示)
-
页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互)
视图状态和行为都封装在了View Model里。这样的封装使得View Model可以完整地去描述View层。由于实现了双向绑定, View Model的内容会实时展现在View层, 这是激动人心的, 因为前端开发者再也不必低效又麻烦地通过操纵DOM去更新视图。
MVVM框架已经把最脏最累的一块做好了, 我们开发者只需要处理和维护View Model, 更新数据视图就会自动得到相应更新,真正实现事件驱动编程
。
View层展现的不是Model层的数据, 而是ViewModel的数据, 由ViewModel负责与Model层交互, 这就完全解耦了View层和Model层, 这个解耦是至关重要的, 它是前后端分离方案实施的重要一环。
3.3第一个Vue程序
(1)下载地址
开发版本
包含完整的警告和调试模式:https://yuejs.org/js/vue.js
删除了警告, 30.96KBmin+gzip:https://vuejs.org/js/vue.min.js
CDN
<script src=“https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js”></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
(2)代码编写
1、创建一个HTML文件
2、引入Vue.js
3、创建一个Vue实例
{{message}}
结果:
说明:
(1)el
: ‘#vue’:绑定元素的ID
(2)data
:{message:‘Hello Vue!’}:数据对象中有一个名为message的属性
,并设置了初始值 Hello Vue
!
4.1v-bind
我们已经成功创建了第一个Vue应用!看起来这跟渲染一个字符串模板非常类似, 但是Vue在背后做了大量工作。现在数据和DOM已经被建立了关联, 所有东西都是响应式的。我们在控制台操作对象属性,界面可以实时更新!
我们还可以使用v-bind来绑定元素特性!
结果:
你看到的v-bind等被称为指令
。指令带有前缀v
以表示它们是Vue提供的特殊特性。可能你已经猜到了, 它们会在渲染的DOM上应用特殊的响应式行为在这里,该指令的意思是:“将这个元素节点的title特性和Vue实例的message属性保持一致
”。
如果你再次打开浏览器的JavaScript控制台, 输入app, message=‘新消息’,就会再一次看到这个绑定了title特性的HTML已经进行了更新。
4.2 v-if
, v-else
什么是条件判断语句,就不需要我说明了吧,以下两个属性!
-
v-if
-
v-else
Yes
No
4.3 v-if-else
-
v-if
-
v-else-if
-
v-else
注:===三个等号
在JS中表示绝对等于
(就是数据
与类型
都要相等)
A
B
CA
D
E
4.4 v-for
格式
{{item.message}}—{{index}}
注:
items是数组
,item
是数组元素迭代的别名
。
Document {{item.message}}-{{index}}
5.1v-on监听事件
事件有Vue的事件、和前端页面本身的一些事件!我们这里的click是vue的事件,
可以绑定到Vue中的methods中的方法事件
!Document 绑定
6.1什么是双向数据绑定
Vue.js是一个MV VM框架, 即
数据双向绑定
, 即当数据发生变化的时候, 视图也就发生变化, 当视图发生变化的时候,数据也会跟着同步变化
。这也算是Vue.js的精髓之处了。值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用vuex那么数据流也是单项的,这时就会和双向数据绑定有冲突。
6.2为什么要实现数据的双向绑定
在Vue.js中,如果使用vuex, 实际上数据还是单向的, 之所以说是数据双向绑定,这是用的UI控件来说, 对于我们处理表单, Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。
6.3在表单中使用双向数据绑定
你可以用
v-model
指令在表单
、及元素
上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇, 但v-model本质上不过是语法糖。它负责监听用户的输入事件以更新数据
,并对一些极端场景进行一些特殊处理。注意:
v-model
会忽略所有表单元素的value
、checked
、selected
特性的初始值而总是将Vue实例的数据作为数据来源。你应该通过JavaScript在组件的data选项中声明初始值!(1)单行数据
Document 输入的文本:{{message}}
(2)多行数据
Document 输入的文本:
{{message}}
(3) 单选
Document 男
女
选中了谁:{{xy}}
(4) 复选
Title 多复选框:
选中的值:{{checkedNames}}
(5)下拉选择
Title 下拉框:
---请选择--- A B C Dvalue:{{pan}}
注意:
v-model
表达式的初始值未能匹配任何选项,元系将被渲染为“未选中
”状态。 在iOS
中, 这会使用户无法选择第一个选项,因为这样的情况下,iOS不会触发change事件。因此,更推荐像上面这样提供一个值为空的禁用选项
。
7.1什么是组件
组件是
可复用的Vue实例
, 说白了就是一组可以重复使用的模板
, 跟JSTL的自定义标签、Thymeleal的th:fragment等框架有着异曲同工之妙,通常一个应用会以一棵嵌套的组件树的形式来组织:例如,你可能会有
页头
、侧边栏
、内容区
等组件,每个组件又包含了其它的像导航链接
、博文之类的组件。
(1)第一个Vue组件
注意:在实际开发中,我们并不会用以下方式开发组件,而是采用
vue-cli创建
,vue模板文件的方式开发,以下方法只是为了让大家理解什么是组件。使用
Vue.component()方法注册组件
,格式如下:说明:
-
Vue.
component
():注册
组件 -
pan
:自定义组件的名字
-
template
:组件的模板
(2)使用props属性传递参数
像上面那样用组件没有任何意义,所以我们是
需要传递参数到组件
的,此时就需要使用props
属性了!注意:默认规则下
props属性里的值不能为大写
;Title 结果:
说明:
v-for
=“item
initems
”:遍历Vue实例中定义的名为items的数组
,并创建同等数量的组件v-bind
:panh=“item
”:将遍历的item项绑定到组件中props
定义名为item属性上
;= 号左边的panh为props定义的属性名
,右边的为item in items 中遍历的item项的值
8.1什么是Axios
Axios是一个开源的可以用在
浏览器端和Node JS的异步通信框架
, 她的主要作用就是实现AJAX异步通信,其功能特点如下:-
从浏览器中创建XMLHttpRequests
-
从node.js创建http请求
-
支持Promise API[JS中链式编程]
-
拦截请求和响应
-
转换请求数据和响应数据
-
取消请求
-
自动转换JSON数据
-
客户端支持防御XSRF(跨站请求伪造)
GitHub:
https://github.com/axios/axios
中文文档:
http://www.axios-js.com/
8.2为什么要使用Axios
由于
Vue.js
是一个视图层框架
并且作者(尤雨溪) 严格准守SoC(关注度分离原则)
所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架
。少用jQuery, 因为它操作Dom太频繁!
8.3第一个Axios应用程序
咱们开发的接口大部分都是采用
JSON格式
, 可以先在项目里模拟一段JSON数据, 数据内容如下:创建一个名为data.json的文件并填入上面的内容, 放在项目的根目录下{
“name”: “闲言博客”,
“url”: “https://blog.csdn.net/qq_42025798”,
“page”: 1,
“isNonProfit”: true,
“address”: {
“street”: “含光门”,
“city”: “陕西西安”,
“country”: “中国”
},
“links”: [
{
“name”: “bilibili”,
“url”: “https://space.bilibili.com/95256449”
},
{
“name”: “闲言杂货簿”,
“url”: “https://blog.csdn.net/qq_42025798”
},
{
“name”: “闲言小店”,
“url”: “https://blog.csdn.net/qq_42025798”
}
]
}
测试代码
Title {{info.name}}{{info.address.street}}点我
结果:
说明:
-
在这里使用了v-bind将a:href的属性值与Vue实例中的数据进行绑定
-
使用axios框架的get方法请求AJAX并自动将数据封装进了Vue实例的数据对象中
-
我们在data中的数据结构必须和Ajax响应回来的数据格式匹配!
8.3Vue的生命周期
官方文档:
https://cn.vuejs.org/v2/guide/instance.html
Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。
9.1什么是计算属性
计算属性的重点突出在
属性
两个字上(属性是名词),首先它是个属性其次这个属性有计算的能力(计算是动词)
,这里的计算就是个函数:简单点说,它就是一个能够将计算结果缓存起来的属性
(将行为转化成了静态的属性),仅此而已;可以想象为缓存
!代码:
Title currentTime1:{{currentTime1()}}
currentTime2:{{currentTime2}}
注意:
methods
和computed
里的东西不能重名
说明:
-
methods
:定义方法, 调用方法使用currentTime1(), 需要带括号 -
computed
:定义计算属性, 调用属性使用currentTime2, 不需要带括号:this.message是为了能够让currentTime2观察到数据变化而变化 -
如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.message=”x in yan", 改变下数据的值,再次测试观察效果!
结论:
调用
方法
时,每次都需要讲行计算
,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这点,计算属性
的主要特性就是为了将不经常变化的计算结果进行缓存
,以节约我们的系统开销;
9.2内容分发
在Vue.js中我们使用
<slot>元素
作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中;测试
比如准备制作一个待办事项组件(todo) , 该组件由待办标题(todo-title) 和待办内容(todo-items)组成,但这三个组件又是相互独立的,该如何操作呢?
第一步定义一个待办事项的组件
Title
第二步 我们需要让,代办事项的标题和值实现动态绑定,怎么做呢?我们可以留一个插槽!
1-将上面的代码留出一个插槽,即slot
Vue.component(‘todo’,{
template:'
\\
- \
\
\ '});
Vue.component(‘todo-title’,{
props:[‘title’],
template:‘
{{title}}’});
Vue.component(“todo-items”,{
props:[“item”],
template:“
-
- {{item}}
- ”
});
3-实例化Vue并初始化数据
var vm = new Vue({
el:“#app”,
data:{
title:“闲言”,
todoItems:[‘Java’,‘Php’,‘C#’]
}
});
说明:我们的
todo-title
和todo-items
组件分别被分发到了todo组件的todo-title和todo-items插槽中
Title
9.3自定义事件
通以上代码不难发现,数据项在Vue的实例中, 但删除操作要在组件中完成, 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到
参数传递
与事件分发
了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 使用this.$emit(‘自定义事件名’, 参数)
, 操作过程如下:1-在vue的实例中增加了methods对象并定义了一个名为removeItems的方法
var vm = new Vue({
el:“#app”,
data:{
title:“闲言”,
todoItems:[‘Java’,‘Php’,‘C#’]
},
methods:{
removeItems: function(index){
this.todoItems.splice(index,1);
}
}
});
2-修改todo-items待办内容组件的代码,增加一个删除按钮,并且
绑定事件
!Vue.component(“todo-items”,{
props:[‘item’,‘index’],
//只能绑定绑定当前组件的方法
template:‘
- {{index}}–{{item}}<button @click=“remove”>删除
- ’,
methods:{
remove: function(index){
//this.$emit()自定义事件分发
this.$emit(‘remove’,index);
}
}
});
3-修改todo-items待办内容组件的
HTML代码
,增加一个自定义事件
,比如叫remove,可以和组件的方法绑定,然后绑定到vue的方法
!<todo-items slot=“todo-items” v-for=“(item,index) in todoItems”
:item=“item” v-bind:index=“index” v-on:remove=“removeItems(index)”>
对上一个代码进行修改,实现删除功能
Title <todo-items slot=“todo-items” v-for=“(item,index) in todoItems”
:item=“item” v-bind:index=“index” v-on:remove=“removeItems(index)”>
效果:
逻辑
9.4Vue 入门小结
核心:数据驱动,
组件化
优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;
常用的属性:
-
v-
if
-
v-
else-if
-
v-
else
-
v-
for
-
v-
on
绑定事件,简写@
-
v-
model
数据双向绑定 -
v-
bind
给巨剑绑定参数,简写:
组件化:
-
组合组件
slot插槽
-
组件内部绑定事件需要使用到
this.$emit("事件名",参数);
-
计算属性的特色,
缓存计算数据
遵循SoC关注度分离原则
,Vue
是纯粹的视图框架
,并不包含,比如Ajax之类的通信功能
,为了解决通信问题,我们需要使用Axios框架做异步通信;
说明
Vue的开发都是要基于NodeJS,实际开发采用
Vue-cli脚手架
开发,vue-router
路由,vuex做状态管理
;Vue UI,界面我们一般使用ElementUI(饿了么出品)
,或者ICE(阿里巴巴出品)来快速搭建前端项目~~官网:
https://element.eleme.cn/#/zh-CN
https://ice.work/
10.1什么是vue-cli
vue-cli官方提供的一个
脚手架
,用于快速生成一个vue的项目模板
;预先定义好的
目录结构及基础代码
,就好比咱们在创建Maven项目时可以选择创建一个骨架
项目,这个估计项目就是脚手架,我们的开发更加的快速;项目的功能
-
统一的
目录结构
-
本地调试
-
热部署
-
单元测试
-
集成打包上线
10.2需要的环境
Node.js:
http://nodejs.cn/download/
安装就是无脑的下一步就好,安装在自己的环境目录下
Git:
https://git-scm.com/doenloads
镜像:
https://npm.taobao.org/mirrors/git-for-windows/
确认nodejs安装成功:
cmd下输入
node -v
,查看是否能够正确打印出版本号即可!cmd下输入
npm -v
,查看是否能够正确打印出版本号即可!这个npm,就是一个
软件包管理工具
,就和linux下的apt软件安装差不多!安装Node.js淘宝镜像加速器(cnpm)
这样的话,下载会快很多~
-g 就是全局安装
npm install cnpm -g
或使用如下语句解决npm速度慢的问题
npm install --registry=https://registry.npm.taobao.org
安装的过程可能有点慢~,耐心等待!虽然安装了cnpm,但是尽量少用!
安装的
位置
:C:\Users\administrator\AppData\Roaming\npm
安装vue-cli
npm install vue-cli -g
#测试是否安装成功#查看可以基于哪些模板创建vue应用程序,通常我们选择webpack
vue list
10.3第一个vue-cli应用程序
1.创建一个Vue项目,我们随便建立一个空的文件夹在电脑上,我这里在G盘下新建一个目录
G:\狂\VueStudy
2.创建一个基于webpack模板的vue应用程序
#这里的myvue是顶日名称,可以根据自己的需求起名
vue init webpack myvue
一路都选择
no即可
;说明:
-
Project name
:项目名称,默认回车即可 -
Project description
:项目描述,默认回车即可 -
Author
:项目作者,默认回车即可 -
Vue build
(Use arrow keys):选择第一个即可 -
Install vue-router
:是否安装vue-router,选择n不安装(后期需要再手动添加) -
Use ESLint to lint your code
:是否使用ESLint做代码检查,选择n不安装(后期需要再手动添加) -
Set up unit tests
:单元测试相关,选择n不安装(后期需要再手动添加) -
Setupe2etests with Nightwatch
:单元测试相关,选择n不安装(后期需要再手动添加) -
Should we run npm install for you after the,project has been created:创建完成后直接初始化,选择n,我们手动执行;运行结果!
初始化并运行
cd myvue
npm install
安装完毕
完整完成后多了很多依赖
运行
npm run dev
访问
http://localhost:8080/
这就是 Node.js的服务,跟tomcat 差不多。
Node.js它是一个服务,它可以运行一些东西。
11.1什么是Webpack
本质上, webpack是一个
现代JavaScript应用程序的静态模块打包器
(module bundler) 。当webpack处理应用程序时, 它会递归地构建一个依赖关系图(dependency graph) , 其中包含应用程序需要的每个模块, 然后将所有这些模块打包成一个或多个bundle.
Webpack是当下最热门的
前端资源模块化管理
和打包工具
, 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离,等到实际需要时再异步加载。通过loader转换, 任何形式的资源都可以当做模块, 比如Commons JS、AMD、ES 6、CSS、JSON、Coffee Script、LESS等;伴随着移动互联网的大潮, 当今越来越多的网站已经从网页模式进化到了WebApp模式。它们运行在现代浏览器里, 使用HTML 5、CSS 3、ES 6等新的技术来开发丰富的功能, 网页已经不仅仅是完成浏览器的基本需求; WebApp通常是一个SPA(单页面应用) , 每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的JS代码,这给前端的开发流程和资源组织带来了巨大挑战。
前端开发和其他开发工作的主要区别,首先是前端基于多语言、多层次的编码和组织工作,其次前端产品的交付是基于浏览器的,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统,这个理想中的模块化系统是前端工程师多年来一直探索的难题。
11.2模块化的演进
Script标签
这是
最原始的JavaScript文件加载方式
,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在window对象中,不同模块的调用都是一个作用域。这种原始的加载方式暴露了一些显而易见的弊端:
-
全局作用域下容易造成
变量冲突
-
文件只能按照
<script>
的书写顺序进行加载 -
开发人员必须主观解决模块和代码库的
依赖关系
-
在大型项目中各种资源难以管理,长期积累的问题导致
代码库混乱不堪
11.3CommonsJS
服务器端的NodeJS遵循CommonsJS规范,该规范核心思想是允许模块通过
require
方法来同步加载
所需依赖的其它模块,然后通过exports
或module.exports来导出
需要暴露的接口。require(“module”);
require(“…/module.js”);
export.doStuff = function(){};
module.exports = someValue;
优点:
-
服务器端模块便于重用
-
NPM中已经有超过
45万
个可以使用的模块包 -
简单易用
缺点:
同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的不能非阻塞的并行加载多个模块
实现:
-
服务端的NodeJS
-
Browserify,浏览器端的CommonsJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大
-
modules-webmake,类似Browserify,但不如Browserify灵活
-
wreq,Browserify的前身
11.4AMD
Asynchronous Module Definition规范其实主要一个主要接口define(id?,dependencies?,factory);它要在声明模块的时候指定所有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行。
define(“module”,[“dep1”,“dep2”],functian(d1,d2){
return someExportedValue;
});
require([“module”,“…/file.js”],function(module,file){});
优点
-
适合在浏览器环境中异步加载模块
-
可以并行加载多个模块
缺点
-
提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不畅
-
不符合通用的模块化思维方式,是一种妥协的实现
实现
-
RequireJS
-
curl
11.5CMD
Commons Module Definition规范和AMD很相似,尽保持简单,并与CommonsJS和NodeJS的Modules规范保持了很大的兼容性。
define(function(require,exports,module){
var $=require(“jquery”);
var Spinning = require(“./spinning”);
exports.doSomething = …;
module.exports=…;
});
优点:
-
依赖就近,延迟执行
-
可以很容易在NodeJS中运行
缺点
- 依赖
SPM
打包,模块的加载逻辑偏重
实现
-
Sea.js
-
coolie
11.6ES6模块
EcmaScript 6标准增加了JavaScript语言层面的模块体系定义。ES 6模块的设计思想, 是尽量静态化, 使编译时就能确定模块的依赖关系, 以及输入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。
import “jquery”
export function doStuff(){}
module “localModule”{}
优点
-
容易进行静态分析
-
面向未来的Ecma Script标准
缺点
-
原生浏览器端还没有实现该标准
-
全新的命令,新版的Node JS才支持
实现
- Babel
大家期望的模块
系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。
11.7安装Webpack
WebPack
是一款模块加载器兼打包工具
, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。安装:
npm install webpack -g
npm install webpack-cli -g
测试安装成功
webpack -v
webpack-cli -v
配置
创建
webpack.config.js
配置文件-
entry:
入口文件
, 指定Web Pack用哪个文件作为项目的入口 -
output:
输出
, 指定WebPack把处理完成的文件放置到指定路径 -
module:
模块
, 用于处理各种类型的文件 -
plugins:
插件
, 如:热更新、代码重用等 -
resolve:设置
路径指向
-
watch:监听, 用于设置文件改动后直接打包
module.exports = {
entry:“”,
output:{
path:“”,
filename:“”
},
module:{
loaders:[
{test:/.js$/,;\loade:“”}
]
},
plugins:{},
resolve:{},
watch:true
}
直接运行
webpack
命令打包11.8使用webpack
1.创建项目
2.创建一个名为
modules的目录
,用于放置JS模块等资源文件3.在modules下创建模块文件,如
hello.js
,用于编写JS模块相关代码//暴露一个方法:sayHi
//暴露一个方法
exports.sayHi = function(){
document.write(‘
ES6规范
’);}
4.在modules下创建一个名为
main.js
的入口文件,用于打包时设置entry属性require 导入一个模块
,就可以调用这个模块中的方法了var hello = require(“./hello”);
hello.sayHi();
5.在项目目录下创建
webpack.config.js
配置文件,使用webpack
命令打包
module.exports = {
entry:“./modules/main.js”,
output:{
filename:“./js/bundle.js”
}
}
6.在项目目录下创建HTML页面,如
index.html
,导入webpack打包后的JS文件自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
ES6
-
列举常用的ES6特性:
-
箭头函数需要注意哪些地方?
-
let、const、var
-
拓展:var方式定义的变量有什么样的bug?
-
Set数据结构
-
拓展:数组去重的方法
-
箭头函数this的指向。
-
手写ES6 class继承。
微信小程序
-
简单描述一下微信小程序的相关文件类型?
-
你是怎么封装微信小程序的数据请求?
-
有哪些参数传值的方法?
-
你使用过哪些方法,来提高微信小程序的应用速度?
-
小程序和原生App哪个好?
-
简述微信小程序原理?
-
分析微信小程序的优劣势
-
怎么解决小程序的异步请求问题?
其他知识点面试
-
webpack的原理
-
webpack的loader和plugin的区别?
-
怎么使用webpack对项目进行优化?
-
防抖、节流
-
浏览器的缓存机制
-
描述一下二叉树, 并说明二叉树的几种遍历方式?
-
项目类问题
-
笔试编程题:
最后
入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。
import “jquery”
export function doStuff(){}
module “localModule”{}
优点
-
容易进行静态分析
-
面向未来的Ecma Script标准
缺点
-
原生浏览器端还没有实现该标准
-
全新的命令,新版的Node JS才支持
实现
- Babel
大家期望的模块
系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。
11.7安装Webpack
WebPack
是一款模块加载器兼打包工具
, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。安装:
npm install webpack -g
npm install webpack-cli -g
测试安装成功
webpack -v
webpack-cli -v
配置
创建
webpack.config.js
配置文件-
entry:
入口文件
, 指定Web Pack用哪个文件作为项目的入口 -
output:
输出
, 指定WebPack把处理完成的文件放置到指定路径 -
module:
模块
, 用于处理各种类型的文件 -
plugins:
插件
, 如:热更新、代码重用等 -
resolve:设置
路径指向
-
watch:监听, 用于设置文件改动后直接打包
module.exports = {
entry:“”,
output:{
path:“”,
filename:“”
},
module:{
loaders:[
{test:/.js$/,;\loade:“”}
]
},
plugins:{},
resolve:{},
watch:true
}
直接运行
webpack
命令打包11.8使用webpack
1.创建项目
2.创建一个名为
modules的目录
,用于放置JS模块等资源文件3.在modules下创建模块文件,如
hello.js
,用于编写JS模块相关代码//暴露一个方法:sayHi
//暴露一个方法
exports.sayHi = function(){
document.write(‘
ES6规范
’);}
4.在modules下创建一个名为
main.js
的入口文件,用于打包时设置entry属性require 导入一个模块
,就可以调用这个模块中的方法了var hello = require(“./hello”);
hello.sayHi();
5.在项目目录下创建
webpack.config.js
配置文件,使用webpack
命令打包
module.exports = {
entry:“./modules/main.js”,
output:{
filename:“./js/bundle.js”
}
}
6.在项目目录下创建HTML页面,如
index.html
,导入webpack打包后的JS文件自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-hHehLm7Y-1711996298737)]
[外链图片转存中…(img-2HsorE9H-1711996298738)]
[外链图片转存中…(img-1R8Kv1oO-1711996298738)]
[外链图片转存中…(img-ABJaeFTz-1711996298739)]
[外链图片转存中…(img-qzHffBpT-1711996298739)]
[外链图片转存中…(img-sblmM8Dl-1711996298739)]既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-Bdwnk4MJ-1711996298740)]ES6
-
列举常用的ES6特性:
-
箭头函数需要注意哪些地方?
-
let、const、var
-
拓展:var方式定义的变量有什么样的bug?
-
Set数据结构
-
拓展:数组去重的方法
-
箭头函数this的指向。
-
手写ES6 class继承。
微信小程序
-
简单描述一下微信小程序的相关文件类型?
-
你是怎么封装微信小程序的数据请求?
-
有哪些参数传值的方法?
-
你使用过哪些方法,来提高微信小程序的应用速度?
-
小程序和原生App哪个好?
-
简述微信小程序原理?
-
分析微信小程序的优劣势
-
怎么解决小程序的异步请求问题?
其他知识点面试
-
webpack的原理
-
webpack的loader和plugin的区别?
-
怎么使用webpack对项目进行优化?
-
防抖、节流
-
浏览器的缓存机制
-
描述一下二叉树, 并说明二叉树的几种遍历方式?
-
项目类问题
-
笔试编程题:
最后
技术栈比较搭,基本用过的东西都是一模一样的。快手终面喜欢问智力题,校招也是终面问智力题,大家要准备一下一些经典智力题。如果排列组合、概率论这些基础忘了,建议回去补一下。
-