HTML(页面的结构)、CSS(表现层)、JavaScript(行为)
就不说了。
CSS层叠样式是一门标记语言,并不是编程语言,因此不可以自定义变量,不可以引用等,换句话说就是不具
任何语法支持,它主要缺陷如下:
这就导致了我们在工作中无端增加了许多工作量。为了解决这个问题,前端开发人员会使用一种称之为【CSS预处理器】的工具,提供 CSS 缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性。大大提高了以前在样式上的开发效率。
什么是 CSS 预处理器
CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行 CSS 的编码工作。转化成通俗易懂的话来说就是一种专门的编程语言,进行 Web 页面样式设计,再通过编译器转化为正常的CSS 文件,以供项目使用”
常用的 CSS 预处理器有哪些
Javascript 一门弱类型脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给刘览器由浏览器解释运行。
Native 原生JS开发
原生JS 开发,也就是让我们按照【ECMAScript】标准的开发方式,简称是 ES,特点是所有浏览器都支持。截止到目前,ES 标准已发布如下版本:
区别就是逐步增加新特性。
Typescript 微软的标准
Typescript 是一种由微软开发的自由和开源的编程语言。它是JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。由安德斯-海尔斯伯格(C#、Delphi、 TypeScript 之父、.NET 创立者)主导。
该语言的特点就是除了具备 ES 的特性之外还纳入了许多不在标准范国内的新特性,所以会导致很多浏览器不能直接支持 TypeScript 语法,需要编译后(编译成JS) 才能被浏览器正确执行。
JavaScript框架
UI框架
JavaScript构建工具
为了降低开发的复杂度,以后端为出发点,比如:Struts、SpringMVC等框架的使用,就是后端的MVC时代,以SpringMVC的为例:
优点
MVC是一个非常好的协作模式,能够有效降低代码的男合度,从架构上能够让开发者明白代码应该写在哪里。为了让View 更纯粹,还可以使用 Thymeleaf、Freemarker 等模板 !擎,使模板里无法写入Java 代码,让前后端分工更加清晰。
缺点
前端开发重度依赖开发环境,开发效率低,这种架构下,前后端协作有两种模式:
前后端职责纠缠不清:模板引擎功能强大,依旧可以通过拿到的上下文变量来实现各种业务逻辑。这样,只要前端弱势一点,往往就会被后端要求在模板层写出不少业务代码,还有一个很大的灰色地带是 controller。页面路由等功能本应该是前端最关注的,但却是由后端来实现。
controller 本身与Mode 往往也会纠缠不清,看了让人咬牙的业务代码经常会出现在 controller 层。这些问题不能全归结于程序员的养,否则JSP就够了。
对前端发挥的局限性:性能优化如果只在前端做空间非常有限,于是我们经常需要后端合作,但由于后端框架限制,我们很难使用 【Comet】、【Bigpipe】 等技术方案来优化性能。
时间回到 2005年 AJAx (Asynchronous Javascript And XML, 异步javaScript 和XML,老技术新用法) 被正式提出并开始使用 CDN 作为静态资源存储,于是出现了JavaScript 王者归来(在这之前JS都是用来在网页上贴狗皮育药广告的)的SPA (Single Page Application) 单页面应用时代。
优点:
这种模式下,前后端分离非常清晰,前后端的协作点就是AJAX接口。看起来是如此美妙,但回过来看看的话,这与jsp时代的区别不大。复杂度从服务端的jsp里移到了浏览器的JavaScript,浏览器端 变得很复杂,类似,SpringMVC,这个时代开始出现浏览器端的分层结构:
缺点
此处的MV* 模式如下:
为了降低前端开发复杂度,涌现了大量的前端框架,比如:AngularJs、React、vue. js、EmberJs 等,这些框架总的原则是先按类型分层
比如 Templates、Controllers、Models,然后再在层内做切分,如下图:
优点:
缺点:
前端为主的MV*模式解决了很多的问题,但如上所述,依旧存在不少的不足之处,随着NodeJS的兴起。JavaScript开始有能力运行在服务器。这意味可以有一种新的开发模式:
在这种研发模式下,前后端的职责很清晰。对前端来说,两个UI 层各司其职:
通过 Node, Web Server 层也是javaScript 代码,这意味着部分代码可前后复用,需要 SEO 的场景可以在服务端同步淔染,由于异步请求大多导致的性能问题也可以通过服名端来續餵,前一种模式的不足,通过这种模式几乎都能完美解决掉。
与JSP 模式相比,全栈模式看起来是一种回归,也的确是一种向原始开发模式的回1归,不过是一种螺旋上升式的回
归。
基于 NodeJS 的全栈模式,依旧面临很多挑战:
MVVM (Model-View-ViewModel)是一种软件架构设计模式,由微软 WPF(用于替代 WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于Java Applet,简单点说就是在浏览器上运行的WPF) 的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。由John Gossman(同样也是WPF 和 Silverlight 的架构师) 于2005年在他的博客上发表。
MWVM源自于经典的 MVC (Model-View-Controller)模式(期间还演化出了 MVP (Model-View-Presenter)模式)。MVVM 的核心是 ViewModel 层,负责转换 Model 中的数据对象来让数据变得更容易管理和使用,其作用如下:
MVVM现在已经相当成熟了,主要运用但不仅仅运用在网络应用程序开发中。当下流行的MVVM框架有vue.js、Angular JS等。
MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model),有几大好处:
View
View 是视图层,也就是用户界面。前端主要由 HTML 和 CSS 来构建,为了更方便地展现 ViewModel 或者 Model 层的数据,已经产生了各种各样的前后端模板语言,比如 FreeMarker、Marko、Pug、Jinja2等等,各大 MVVM 框架如 KnockoutJS,Vue,Angular 等也都有自己用来构建用户界面的内置模板语言。
ViewModel
ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型。需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模型是只包含状态的,比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示),而页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互),视图状态和行为都封装在了 ViewModel 里。
这样的封装使得 ViewModel 可以完整地去描述 View 层。由于实现了双向绑定,ViewModel 的内容会实时展现在 View 层,这是激动人心的,因为前端开发者再也不必低效又麻烦地通过操纵 DOM 去更新视图,MVVM 框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护 ViewModel,更新数据视图就会自动得到相应更新,真正实现数据驱动开发。
看到了吧,View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的重要一环。
ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的Model数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型。
需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而Model 层的数据模型是只包含状态的
View 层展现的不是Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与Model 层交互,这就完全解耦了 View 层和Model 层,这个解耦是至关重要的,它是前后端分离分离实施的重要一环。
Model
Model 是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开。后端的处理通常会非常复杂:
前后端对比
后端:我们这里的业务逻辑和数据处理会非常复杂!
前端:关我屁事!
后端业务处理再复杂跟我们前端也没有半毛钱关系,只要后端保证对外接口足够简单就行了,我请求API,你把数据返出来,咱俩就这点关系,其他都扯淡。
介绍 — Vue.js (vuejs.org)
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
如果你想在深入学习 Vue 之前对它有更多了解,我们制作了一个视频,带您了解其核心概念和一个示例工程。
我们知道MVVM的表示如下:
在MVVM的架构中,是不允许数据和视图层直接通信的,只能通过ViewModel来通信。而ViewModel就是定义了一个observer观察者。
至此,我们就明白了,一个vue.js就是MVVM的实现者,他的核心就是适当了DOM的监听和数据绑定。
数据驱动
Vue.js在实例化的过程中,会对实例化对象选项中的 data 选项进行遍历,遍历其所有属性并使用Object.defineProperty 把这些属性全部转为 getter/setter。
同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。
当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染这样就实现了所谓的数据对于视图的驱动。
通俗地讲,它意味着我们在普通 HTML 模板中使用特殊的语法将 DOM “绑定”到底层数据。
一旦创建了绑定,DOM 将与数据保持同步。每当修改了数据,DOM 便相应地更新。这样我们应用中的逻辑就几乎都是直接修改数据了,不必与 DOM 更新搅在一起。这让我们的代码更容易撰写、理解与维护。
Object.defineProperty 是 ES5 中一个无法shim 的特性,这也就是为什么Vue 不支持 IE8 以及更低版本浏览器。
这些 getter/setter对用户来说是不可见的,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
这里需要注意的问题是流览器控制台在打印数据对象时 getter/setter 的格式化并不同,所以你可能需要安装 vue-devtools 来获取更加友好的检查接口。
每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter 被调用时,会通知watcher 重新计算,从而致使它关联的组件得以更新。
组件化
介绍 — Vue.js (vuejs.org)
GitHub - bearbrick0/Vue-demo: Vue入门的demo
05-Vue入门系列之Vue实例详解与生命周期 - FlyDragon - 博客园
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。
通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
在Vue的整个生命周期中,它提供了一系列的事件,可以让我们注册js方法,可以让我们达到控制整个过程的目的地,哇赛,如果你搞过Asp.Net WebForm的话,你会发现整个就是WebForm的翻版嘛哈哈。
值得注意的是,在这些事件响应方法中的this直接指向的是vue的实例。
首先看看下面官网的一张生命周期的图,我做一下标注,看看整体的流程,后面我们上代码做一下效果。
beforeCreate和created,就很想我们Spring中的Aop的环绕通知。还是有很多的AOP的思想。
Vue语法
Vue is awesome
Oh no
Title
Paragraph 1
Paragraph 2
Now you see me
Now you don't
A
B
C
Not A/B/C
Title
-
{{ item.message }}
Title
Axios 中文文档 | Axios 中文网 | Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js (axios-http.cn)
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http
模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
使用 npm:
$ npm install axios
由于 vuejs 是一个视图层框架 并且作者(尤雨溪)严格准守 SoC(关注分离原则),所以vue.js 并不包含AJAX 的通信功能,为了解决通信问题,作者单独开发了一个名为 vue-resource 的插件,不过在进入2.0 版本以后停止了对该插件的维护并推荐了 Axios 框架
Data.json
{
"name": "百度",
"url": "http://www.baicu.com",
"page": 66,
"isNonProfit": true,
"address": {
"street": "海定区",
"city": "北京市",
"country": "中国"
},
"links": [
{
"name": "Google",
"ur": "http://www.google.com"
},
{
"name": "Baidu",
"ur]": "http://www.baidu.com"
},
{
"name": "Sougou",
"url": "http://www.sougou.com"
}
]
}
Title
name:{{info.name}}
url: {{info.url}}
-
{{item.name}}---->{item.url}}
vue.js 是一个MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是 vue js 的精髓之处了。值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用 vuex,那么数据流也是单项的,这时就会和双向数据绑定有冲突。
在vuejs 中,如果使用vuex,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,vuejs 的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。
你可以用 v-model 指令在表单 input、textarea及 select元素上创建双向数据绑定。它会根据控件类到自动选取正确的方法来更新元素,尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
Vue.js 教程
你可以用 v-model
指令在表单 、
及
元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但
v-model
本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
Title
下拉框:
value:{{selected}}
组件是可复用的Vue实例,说白了就是一组可以重复使用的模版,跟 JSTL 的自定义标签、Thymeleaf的 th:fragment 以及 Sitmesh3 框架都有异曲同工之妙。
通常一个应用会以一颗嵌套的组件树的形式来组织:
例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。
Title
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:
{{ message.split('').reverse().join('') }}
在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message
的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。
所以,对于任何复杂逻辑,你都应当使用计算属性。
计算属性是用来声明式的描述一个值依赖了其它的值。
当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改交时更新DOM。这个功能非常强大,它可以让你的代码更加声明式、数据驱动并且易于维护。
简单点来说,他就是一个能够将计算结果缓存起来的属性(将行为属性转化成了静态属性),仅此而已。
Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将
元素作为承载分发内容的出口。
它允许你像这样合成组件:
Your Profile
然后你在
的模板中可能会写为:
当组件渲染的时候,
将会被替换为“Your Profile”。插槽内可以包含任何模板代码,包括 HTML:
Your Profile
甚至其它的组件:
Your Profile
如果
的 template
中没有包含一个
元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。
Title
介绍 | Vue CLI (vuejs.org)
创建一个项目 | Vue CLI (vuejs.org)
vue create hello-world
本质上,webpack 是一个现代JavaScript 应用程序静态模块打包品(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle
伴随着移动互联网的大潮,当今越来越多的网站已经从网页模式进化到了 WebApp 模式。它们运行在现代刘览器里,使用 HTML5、CSS3、ES6 等新的技术来开发丰富的功能,网页已经不仅仅是完成浏览器的基本需求;
WebApp通常是一个SPA(单页面应用),每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的JS代码,这给前端的开发流程和资源组织带来了巨大挑战。
前端开发和其他开发工作的主要区别,首先是前端基于多语言、多层次的编码和组织工作,其次前端产品的交付是基于浏览器的,这些资源是通过增量加载的方式运行到刘览器端,如何在开发环境組织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统,这个理想中的模块化系统是前端工程师多年来一直探索的难颢
Script标签