第四章 现代前端交互框架
(需要进行理解,再完善笔记)
数据的处理和操作的核心就是DOM的处理和操作,即便是今天,所有前端JavaScript框架最终要解决的仍然是如何实现高效,高性能DOM交互操作的问题。
DOM API类型分为以下几种类型:节点查询型,节点创建型,节点修改型,节点关系型,节点属性型和内容加载型。
JQuery主要实现了选择器,DOM操作方法,事件绑定封装,AJAX,Deferred这五个方面的封装和常见的兼容性问题的处理,我们还可以基于jQuery扩展更多的方法功能来提高业务开发效率。
SPA的思路是将整个应用的内容都在一个页面中实现并完全通过异步交互来根据用户操作加载不同的内容。
通过DOM交互框架已经可以比较高效地处理DOM操作和事件绑定等问题。这种高效的方式带来了效率上的提升,但随着页面结构和交互复杂性的提升,仅靠这种方式会增加管理的难度。随着AJAX技术的盛行,SPA应用开始被广泛使用,而直接操作DOM的方式进行SPA的开发和维护是比较麻烦的。为解决这个问题,通常将页面上与DOM相关的内容抽象成数据模型,视图,事件控制函数三部分,这就有了前端MVC设计思路。
MVC 可以认为是一种开发设计模式,其基本思路是将DOM交互的内容分为数据模型,视图和事件控制函数三个部分,并对他们进行统一管理。Model用来存放数据结果和数据对象,View用于页面DOM的更新与修改,Controller则用于根据前端路由条件来调用不同的Model给View渲染不同的数据内容。
前端框架从直接的DOM操作到MVC设计模式,然后到MVP,再到MVVM框架,前端设计模式改进原则一直向着高效,易实现,易维护,易扩展的基本方向发展。虽然目前前端各类框架也已经成熟并开始向高版本迭代。但是还没有结束,我们现在的编程对象依然没有脱离DOM编程的基本套路,一次次框架的改进大大提高了开发效率,但是DOM元素运行的效率仍然没有变。
4.3 Virtual DOM 交互模式
4.3.1 Virtual DOM 设计理念
MVVM的前端交互模式大大提高了编程效率,自动双向数据绑定让我们可以将页面逻辑实现的核心转移到数据层的修改操作上,而不再是在页面中直接操作DOM。但实际上,尽管MVVM改变了前端开发的逻辑方式,但是最终数据层反应到页面上View层的渲染和改变仍是通过对应的指令进行DOM操作来完成的。而且通常一次ViewModel的变化可能会触发页面上多个指令操作DOM的变化,带来大量的页面结构层DOM操作来渲染。
Virtual DOM是一个能够直接描述一段HTML DOM结构的JavaScript对象,浏览器可以根据它的结构按照一定规则创建出确定唯一的HTML DOM结构。
整体来看,Virtual DOM的交互模式减少了MVVM或其他框架中对DOM的扫描和操作次数,并且在数据发生改变后只在合适的地方根据JavaScript对象来进行最小化的页面DOM操作,避免大量重新渲染。
4.3.2 Virtual DOM的核心实现
Virtual DOM模式来控制页面DOM结构更新的过程:创建原始页面或组件的Virtual DOM结构,用户操作后需要进行DOM更新时,生成用户操作后页面或组件的Virtual DOM结构并与之前的结构进行比对,找到最小变化Virtual DOM的差异化描述对象,最后把差异化的Virtual DOM根据特定的规则渲染到页面上。
所以核心操作 可以抽象成三个步骤:
创建Virtual DOM
对比两个Virtual DOM生成差异化Virtual DOM
将差异化Virtual DOM渲染到页面上
其中 :
创建Virtual DOM:创建Virtual DOM即把一段HTML字符串文本解析成一个能够描述它的JavaScript对象。
根据HTML字符串解析创建Virtual DOM的过程相当于实现一个HTML文本解析器,但是没有生成DOM对象树,只是生成一个操作效率更高的JavaScript对象,因此通常不会直接将HTML交给浏览器去解析,因为浏览器的DOM解析很慢,这也是Virtual DOM交互模式和普通DOM编程最本质的区别。
当用户进行了页面操作需要进行页面视图改变时,通常会生成一个新的Virtual DOM结构来表示改变后的状态,而且不会将这个改变后的Virtual DOM内容立即重新渲染到页面中,而是通过对比找出两个Virtual DOM的差异性,得到一个差异树对象。对于Virtual DOM的对比算法实际上是对于多叉树结构的遍历算法。对多叉树遍历就有广度优先算法和深度优先算法。
经过Virtual DOM的差异性对比,我们获得了用户操作后的差异性Virtual DOM,差异性类型和差异性的位置,那么剩下的操作就是根据对比返回的结构将差异化内容经过DOM操作渲染到页面上,整个交互过程就完成了。
Virtual DOM交互模式的优势 与以前交互模式相比,Virtual DOM最本质的区别在于减少了对DOM对象的操作,通过JavaScript 对象来代替DOM对象树,并且在页面结构改变进行最小代价的DOM渲染操作,提高了交互的性能和效率。这也是提高前端交互性能的根本原因。
4.4 前端MNV*时代
尽管Virtual DOM的交互模式能在页面数据的渲染和变更时尽可能地减少DOM操作,但仍无法完成脱离DOM交互的模式,我们知道DOM的操作效率不高,在移动设备的Hybrid WebView上表现会更慢,所以为了进一步改进Hybrid应用中DOM性能,希望完全脱离DOM的编程模式来进行结构层的操作。
为什么可以这样子实现:首先,目前,主要主流Hybrid App的Web内容通常是在原生应用中嵌入WebView来实现的,而原生应用的界面数据渲染可以通过调用原生控件来实现,它不仅没有HTML DOM的性能缺陷,而且还可以调用Native系统底层的API;其次,Hybrid App可以通过统一的JavaScript交互协议来调用原生的方法和控件,所以使用JavaScript直接调用和产生原生控件进行界面数据渲染的方式是可以实现的。
4.4.1 MNV*模式简介
我们把这种使用JavaScript调用原生控件或事件绑定生成应用程序的交互模式称为前端MNV*开发模式。这种模式目前仅使用于移动端Hybrid应用,因为需要依赖原生控件的调用支持,而只有这种特殊的应用场景才满足条件。
4.4.2 MNV* 模式的实现原理
主要是将JSBridge和DOM编程的方式进行结合,让前端能够快速构建开发原生界面的应用,从而脱离DOM的交互模式。
第五章 前端项目与技术实践
现代前端技术飞速发展,最终形成了以效率和质量为核心的两大趋势。
5.1 前端开发规范
开发规范可以认为软件开发工程师之间的另一种语言,它在一定程度上决定了团队协作过程中开发的程序代码是否具有一致性和易维护性,统一的开发规范可以降低代码的出错率和团队开发的协作成本。
5.1.1 前端通用规范
三层结构分离
前端页面开发应做到结构层(HTML),表现层(CSS),行为层(JavaScript)分离,保证它们之间的最小耦合,这对前端开发和后期维护都是至关重要。推荐相关样式和JavaScript逻辑在外部引入的CSS和JavaScript文件中。
缩进
统一使用tab(或4个进行缩进)来进行缩进,可以在开发编辑器或IDE里进行设置。
内容编码
在HTML文档中使用
来指定编码,一避免出现页面乱码问题。
小写
所有的HTML标签,HTML标签属性,样式名及规则建议使用小写,我们一般习惯使用小写英文字符。
HTML属性的id
属性可以使用驼峰大小写组合的命名方式,因为id
属性常常只用于JavaScript的DOM查询引用,而JavaScript语言标准推荐使用驼峰大小写组合的命名方式,因此HTML页面上的id属性也尽量使用这种标准来写。
代码单行长度限制
代码单行长度不要超过120字符(或80字符,根据团队习惯决定),长字符串并接通常使用加号来连接换行的内容
注释
尽可能为代码写上注释,HTML,CSS 还是JavaScript,必要的注释是不能少的。
行尾空格与符号
删除行尾空格与多余的符号,这些内容是没有必要存在的。
5.1.2 前端HTML规范
文档类型定义
统一使用HTML5 的标准文档类型
来定义,这样更简洁,而且向后兼容。不使用HTML4.01的DTD定义。
head内容
head中必须定义title
,keyword
,description
,保证基本的SEO页面关键字和内容描述。移动端页面head
要添加viewport
控制页面缩放,有利于提高页面渲染性能。
省略type属性
在引用CSS或JavaScript时,可以省略type属性不写,因为HTML5在引入CSS时默认type
值为text/css
,在引入JavaScript时默认type
为text/javaScritp
使用双引号包裹属性值
所有的标签属性值必须要用双引号包裹,不推荐单引号,不允许有的双引号,有的单引号。
属性值省略
非必要的属性值可以省略,例如输入框里的readonly
,disabled
,required
等属性值是非必要的,可以省略不写。如
嵌套
所有元素必须正确嵌套,尽量使用语义化标签,不允许交叉,也不允许在inline
元素中包含block
元素。
标签闭合
非自闭合标签必须添加标识,自闭合标签无须关闭。
使用img
的alt
属性
为img
加上alt
属性
使用lable
的for
属性
为表单内部元素
加上for
属性或者将对应的控件放在
标签内部。这样在点击
标签时,会关联到对应的input
或textarea
上选中,可以增加输入的响应区域。
按模块添加注释
在每个大的模块的开始和结束的地方添加起始注释标记,便于开发者识别,维护。
标签元素格式
块级元素一般另起一行写,行内元素可以根据情况换行,尽量保证行内元素代码长度不超过一行,否则要考虑另起一行。HTML的子元素要尽量相对父级进行缩进,这样更有层次。
语义化标签
在合适的地方选择合适的标签。不要使用被HTML废弃用于样式表现的无语义标签。
5.1.3 前端CSS规范
CSS引用规范
使用link的方式调用外部样式文件,外部样式文件可以复用并能用浏览器缓存提高加载速度。禁止在标签内使用内联样式,否则后期很不容易管理,强烈不建议使用。
样式的命名
CSS类名命名一般由单词,中画线,当然也有BEM方案,这里推荐一种规范-----所有命名都使用小写,加上ui-
等前缀,表示这个类名只用于控制元素的样式展示,不推荐使用拼音作为样式名,尤其是使用缩写的拼音和英文混合的方式,很让人费解。尽量不以info
,current
,news
等单个单词类名直接作为类名称,单独一级命名很容易造成冲突覆盖,并且很难理解。
CSS高效实现规范
标签名,与id
或class
组合的选择器会造成冗余,而且降低CSS的解析速度,应避免。
使用预处理脚本编码开发
使用预处理嵌套的方式描述元素之间的层次关系,尽可能使用预处理器的高效语法来提高开发效率,如嵌套,变量,嵌套属性,注释,继承等,避免直接使用CSS开发。使用SASS来编写CSS就高效很多。
简写方式
单位0的缩写。如果属性值为0,则不需要为0加单位,如果以0为个数为的小数,前面的0可以省略不写。尽量带上分号。如 opacity:.6
去掉url中引用资源的引号,这是没必要的。如background-image:url(sprites.png)
颜色值写法,所有的颜色值要使用小写并尽量缩写至3位 如#FF0000
可写成#f00
属性书写顺序
CSS属性书写顺序遵循先布局后内容,即先写元素的布局属性,再写元素的内容属性。常用布局属性有:position
, display
, float
, overflow
等
hack写法
尽可能减少对CSS hack的使用和依赖,可以使用其他的解决方案替代hack思路。如果必须要使用浏览器hack,尽量选择稳定,常用并易于理解的书写方式。
5.1.4 ECMAScript5 常用规范
分号
JavaScript语句后面统一加上分号
空格
在所有运算符,符号与英文单词之间添加必要的空格,利于开发者阅读。
空行
一般推荐在代码块后面保留一行空行,显得块内容层次更加分明
引号
推荐JavaScript字符串最外层统一使用单引号
变量命名
标准变量采用驼峰式命名。常量使用全大写形式命名,并采用下画线连接。构造函数首字母大写,jQuery对象推荐以"$"
为开头命名,便于分辨JQuery对象和普通对象。
对象
对象属性名不需要加引号。对象属性键值以缩进的形式书写,不要写在同一行。数组,对象属性后不能有逗号,否则部分浏览器可能会解析出错。
大括号 程序中的代码块推荐使用大括号包裹,要注意换行,这样更加清晰,而且方便后面扩展增加内容。
条件判断 尽量不要直接使用undefined
进行变量判断,使用typeof和字符串“undefined”对变量类型进行判断。分别用===
,!==
代替==
,!=
更加严谨
不要在条件语句或循环语句中声明函数
5.1.5 ECMAScript 6+ 参考规范
正确使用ECMAScript 6 的变量声明关键字
字符串拼接使用字符串模板完成
解析赋值尽量使用一层结构,否则声明变量嵌套太深难以理解
数组拷贝推荐使用…实现,更加简洁高效
数组循环遍历使用for...of
非必须情况下不推荐使用forEach
,map
,简单循环
使用ECMAScript6 的类来代替之前的实现方式,尽量使用constructor
进行属性成员变量赋值
模块化多变量导出时尽量使用对象解构,不使用全局导出。尽量不要把import
和export
写在一行
导出类名时,保持模块名称和文件名相同,类名首字母需要大写
生成器中yield进行异步操作时需要使用try...catch
包裹,方便对异常进行处理。
推荐使用promise
,避免使用第三方库或直接回调,原生的异步处理性能更好而且符合语言规范。
如果不是必须,避免使用迭代器
不要使用统一码,中文的正则匹配和计算较消耗时间,而且容易出问题
合理使用Generator
,推荐使用ascyn/await
,更加简洁
5.1.6 前端防御性编程规范
防御性编程是指通过检测任何可能存在的逻辑异常问题的代码实现,提高脚本执行过程的健壮性的一种编程手段。防御性编程要求我们对程序的实现进行更加全面,严谨的考虑。
对外部数据的安全检测判断
规范化的错误处理 对于常用的AJAX请求或长时间文件读写等可能失败的异步操作,需要进行错误情况的处理或异常捕获处理,而不应该被静默,否则一旦出错,用户得不到正常的提示,对用户体验影响极大。
5.2 前端组件规范
什么是组件规范? 为什么需要组件规范? 组件规范和开发规范有什么区别和联系呢? 组件通常是指采用代码管理中的分治思想,将复杂的项目代码结构拆分成多个独立、简单、解耦合的结构或文件的形式进行分开管理,达到让项目代码和模块更加清晰的目的。 组件规范则是我们进行拆分、组织、管理项目代码方法的一种约定。 所以,和开发规范相似,组件规范也是一种约定。不同的是,开发规范关注文件内部代码级别的一致性, 组件规范则更关注项目中业务功能模块内容组织的一致性。 一定程度上,组件规范包含了开发规范,因为若开发规范不统一,开发出来的组件风格便不一致,组件规范便也无从说起了。组件规范能够帮助我们对功能模块进行统一的约定管理, 通过这一约定, 任何一个独立的功能模块之间都应该是无耦合并能和其他模块很好对接和组合的。 目前前端主流的一些组件相关规范: UI (User Interface, 用户界面)组件规范、模块化规范、项目组件化设计规范。注意这三者的区别和联系,UI规范一般指UI层设计和实现的规范及统一性, 而模块化主要指的是JavaScript 模块化开发的文件模块封装方式,项目组件规范则指的是实际开发中整个项目业务代码之间的组织形式。
5.2.1 UI组件规范
简单来说,UI 组件规范强调了一个网站中所有网页结构层和表现层实现的一致性。 多个地方出现的相同按钮样式可以通过公共定义的样式规范类来描述,而不用每个地方都重复书写样式,避免使用不同的代码实现同一个效果。试想如果没有规范的存在,相同作用的按钮有时是红色,有时是绿色,开发维护时就比较难统一处理了。 从Web前端的角度来看,UI层的规范能带来一些明显的好处。
UI层风格统一化。UI层风格统一化避免了不同页面的差异化设计风格,能让用户使 用Web站点的不同网页外观风格是一致的。
增加UI层复用性。使用UI规范的情况下,UI层代码复用性增强,可以提高开发效率, 相同功能的结构和样式不用重复实现。
更符合用户的体验习惯。例如红色按钮统一 用来表示警告,绿色按钮统一 表示安全或 成功操作等。
增加了 开发规范的统一-性。 遵循统一的规范, 避免重复开发,避免产生多种风格的代码。
在实际团队开发中,UI组件规范的完成可能需要以下几个方面的协作:
UI设计一致2.
开发实现一致。这就涉及开始说的编码开发规范,尽可能让所有UI层实现使用同样的开发规范和方式。例如样式定义,图片引用,命名规范等,就图片引用来说,图标使用base64实现还是使用小图片实现,又或者使用iconfont实现,都需要统一,不能多种方法混合,否则增加UI组件的使用复杂度。
从开发实现上,如果想设计一个具有通用组件规范的UI库,必须考虑以下几个方面的问题。
统一的页面布局方案。页面布局使用网格布局还是REM方案,是否需要支持响应式, 如果是移动端应该怎样适配,这些是需要优先考虑的。
基础UI结构和样式实现。样式reset、 按钮、图片、菜单、表单等基础结构与样式的统一化设计实现,可以极大提高页面内容的复用性和开发效率。
组件化UI结构和样式实现。例如按钮组、字体图标、下拉菜单、输入框组、导航组、面包屑、分页、标签、轮播、弹出框、列表、多媒体、警告框等常用组件的实现。当然网站可能不会一次性用到这么 多,但是如果要考虑设计一个通用的UI组件库,这些仍然是要考虑的。
响应式布局。如果需要支持页面响应式,布局、结构、样式、媒体、javascript响应式。
5.2.2 模块化规范
模块化规范是JavaScript文件之间相互依赖引用的一种通用语法约定,就是按照一定的规范来写JavaScript文件,让它可以方便地被其他JavaScript文件引用。 就规范种类来说,主要包括AMD(异步模块定义),CMD(通用模块定义),CommonJS,import/export等。
AMD AMD是运行在浏览器端的模块异步加载规范,主要以requireJS为代表。基本原理是定义define
和require
方法异步请求对应的JavaScript模块文件到浏览器端运行。模块执行导出时可以使用函数中的return返回结果。
CMD CMD是seajs提出的一种模块化规范,在浏览器端调用类似CommonJs的书写方式进行模块引用,但却不是完全的CommonJs规范,CMD遵循按需执行依赖的原则,只有在用到某个模块的时候才会执行模块内部的require
语句,同时加载完某个依赖模块文件后并不会立即执行,在所有依赖模块加载完成后进入主模块逻辑,遇到模块运行语句的时候才执行对应的模块,这和AMD是有区别的。
CommonJs CommonJs是Node端使用的JavaScript模块化规范,使用require
进行模块引入,并使用modules.exports
来定义模块导出。与前面两种方法来比,它的写法更加清晰简洁。
import/export import/export
是ECMAScript6定义的JavaScript模块引用方式,是唯一一个遵循JavaScript语言标准的模块化规范,使用import
引入其他模块,export来进行模块导出。
5.2.3 项目组件化设计规范
目前组件化的方案已经越来越多,Web Component组件化,MVVM框架组件化,基于Virtual DOM框架组件化,直接基于目录管理的组件化等 高效组件化规范应该解决哪些问题:
组件之间独立、松耦合。组件之间的HTML、JavaScript、 CSS之间相互独立,尽量不重复,相同部分通过父级或基础组件来实现,最大限度减少重复代码
组件间嵌套使用。组件可以嵌套使用,但嵌套后仍然是独立、松耦合的。
组件间通信。主要指组件之间的函数调用或通信,例如A组件完成某个操作后希望B组件执行某个行为,这种情况就可以使用监听或观察者模式在B组件中注册该行为的事件监听或加入观察者,然后选择合适的时机在A组件中触发这个事件监听或通知观察者来触发B组件中的行为操作,而不是在A组件中直接拿到B组件的引用并直接进行操作,因为这样组件之间的行为就会产生耦合。
组件公用部分设计。组件的公用部分应该被抽离出来形成基础库,用来增加代码的复用性。
组件的构建打包。构建工具能够自动解析和打包组件内容。
异步组件的加载模式。在移动端,通常考虑到页面首屏,异步的场景应用非常广泛,所有异步组件不能和同步组件一起处理。这时可以将异步组件区别于普通组件的目录存放,并在打包构建时进行异步打包处理。
组件继承与复用性。对于类似的组件要做到基础组件复用来减少重复编码。
私有组件的统一管理。为了提高协作效率,可以通过搭建私有源的方式来统- - 管理组件库,例如使用包管理工具等。但这点即使在大的团队里面也很难实施,因为业务组件的实现常常需要定制化而且经常变更,这样维护组件库成本反而更大,目前可以做的是将公用的组件模块使用私有源管理起来。
根据特定场景进行扩展或自定义。如果当前的组件框架不能满足需求,我们应该能够很便捷地拓展新的框架和样式,这样就能适应更多的场景需求。比如在通过目录管理组件的方案下,既可以使用MVVM框架进行开发,也可以使用Virtual DOM框架进行开发,但要保持基本的规范结构不变。
5.3 自动化构建
5.3.1 自动化构建的目的
前端构建工具的作用可以认为是对源项目文件或资源进行文件级处理,将文件或资源处理成需要的最佳输出结构和形式。在处理过程中,我们可以对文件进行模块化引入、依赖分析,资源合并、压缩优化、文件嵌入、路径替换、生成资源包等多种操作,这样就能完成很多原本需要手动完成的事情,极大地提高开发效率。
5.3.2 自动化构建的原理
构建的流程主要分为7个基本步骤(不同构建工具各有差异,但基本原理是类似的):
读取入口文件 -> 分析模块引用 -> 按照引用加载模块 -> 模块文件编译处理 -> 模块文件合并 -> 文件优化处理 -> 写入生成目录
5.4 前端性能优化
前端优化的最终目的都是 提升用户体验,改善页面性能。
前端性能可以认为是用户获取所需要页面数据或执行某个页面动作的一个实时性指标,一般以用户希望获取的数据操作到用户实际获得数据的时间间隔来衡量。
例如用户希望获得数据的操作时打开某个页面,那么这个操作的前端性能就可以用用户操作开始到屏幕展示页面内容给用户的这段时间间隔来评判。
用户的等待延时可以分为两部分:可控等待延时和不可控等待延时。可控等待延时可以理解为能通过技术手段和优化来改进缩短的部分,例如减少图片大小让请求加载更快,减少HTTP请求数等。不可控等待延时则是不能或很难通过前后端技术手段来改进优化的,例如CPU计算时间延时,ISP网络传输延时等。
前端中,所有优化大师针对可控等待延时这部分来进行的。
5.4.1 前端性能测试
获取和衡量一个页面的性能,主要可以通过以下几个方面:Performance Timing API,Profile工具,页面埋点计时,资源加载时序图分析。
5.4.2 桌面浏览器前端优化策略
网络加载类
减少HTTP资源请求次数
在前端页面中,通常建议尽可能合并静态资源图片、JavaScript 或CSS代码,减少页面请求数和资源请求消耗,这样可以缩短页面首次访问的用户等待时间。通过构建工具合并雪碧图、CSS、JavaScript 文件等都是为了减少HTTP资源请求次数。另外也要尽量避免重复的资源,防止增加多余请求。
减小HTTP请求大小. 除了减少HTTP资源请求次数,也要尽量减小每个HTTP请求的大小。如减少没必要的图片、JavaScript、 CSS及HTML代码,对文件进行压缩优化,或者使用gzip压缩传输内容等都可以用来减小文件大小,缩短网络传输等待时延。前面我们使用构建工具来压缩静态图片资源以及移除代码中的注释并压缩,目 的都是为了减小HTTP请求的大小。
将CSS或JavaScript放到外部文件中,避免使用
或
标签直接引入
避免页面中空的href
和src
为HTML指定Cache-Control或Expires
为HTML内容设置Cache-Control或Expires可以将HTML内容缓存起来,避免频繁向服务器端发送请求。前面讲到,在页面Cache-Control或Expires 头部有效时,浏览器将直接从缓存中读取内容,不向服务器端发送请求。
合理设置Etag和Last-Modified
合理设置Etag和Last-Modified使用浏览器缓存,对于未修改的文件,静态资源服务器会向浏览器端返回304,让浏览器从缓存中读取文件,减少Web资源下载的带宽消耗并降低服务器负载。
减少页面重定向
页面每次重定向都会延长页面内容返回的等待延时,一次重定向大约需要600毫秒的时间开销,为了保证用户尽快看到页面内容,要尽量避免页面重定向。
使用静态资源分域存放来增加下载并行数
浏览器在同一时刻向同一个域名请求文件的并行下载数是有限的,因此可以利用多个域名的主机来存放不同的静态资源,增大页面加载时资源的并行下载数,缩短页面资源加载的时间。通常根据多个域名来分别存储JavaScript、CSS和图片文件。
使用静态资源CDN来存储文件
使用CDN Combo下载传输内容
使用可缓存的AJAX
使用GET来完成AJAX请求
使用XMLHttpRequest
时,浏览器中的POST方法发送请求首先发送文件头,然后发送HTTP正文数据。而使用GET时只发送头部,所以在拉取服务端数据时使用GET请求效率更高。
减少Cookie的大小并进行Cookie隔离
HTTP请求通常默认带上浏览器端的Cookie一起发送给服务器,所以在非必要的情况下,要尽量减少Cookie来减小HTTP请求的大小。对于静态资源,尽量使用不同的域名来存放,因为Cookie默认是不能跨域的,这样就做到了不同域名下静态资源请求的Cookie隔离。
缩小favicon.ico
并缓存
推荐使用异步JavaScript资源
异步的JavaScript 资源不会阻塞文档解析,所以允许在浏览器中优先渲染页面,延后加载脚本执行。例如JavaScript的引用可以如下设置,也可以使用模块化加载机制来实现。
消除阻塞渲染的CSS及JavaScript
对于页面中加载时间过长的CSS或JavaScript文件,需要进行合理拆分或延后加载,保证关键路径的资源能快速加载完成。
避免使用CSS import引用加载CSS
CSS中的@import
可以从另一个样式文件中引入样式,但应该避免这种用法,因为这样会增加CSS资源加载的关键路径长度,带有@import
的CSS样式需要在CSS文件串行解析到@import
时才会加载另外的CSS文件,大大延后CSS渲染完成的时间。
页面渲染类
把CSS资源引用放在HTML文件顶部
一般推荐将所有CSS资源尽早指定在HTML文档
中,这样浏览器可以优先下载CSS并尽早完成页面渲染。
JavaScript资源引用放到HTML文件底部
JavaScript资源放到HTML文档底部可以防止JavaScript的加载和解析执行对页面渲染造成阻塞。由于JavaScript资源默认是解析阻塞的,除非被标记为异步或者通过其他的异步方式加载,否则会阻塞HTMLDOM解析和CSS渲染的过程。
不要在HTML中直接缩放图片
减少DOM元素数量和深度
HTML中标签元素越多,标签的层级越深,浏览器解析DOM并绘制到浏览器中所花的时间就越长,所以应尽可能保持DOM元素简洁和层级较少。
尽量避免使用、
等慢元素
内容的渲染是将table
的DOM渲染树全部生成完并–次性绘制到页面上的,所以在长表格渲染时很耗性能,应该尽量避免使用它,可以考虑使用列表元素
代替。尽量使用异步的方式动态添加iframe
,因为iframe
内资源的下载进程会阻塞父页面静态资源的下载与CSS及HTML DOM的解析。
避免运行耗时的JavaScript
长时间运行的JavaScript会阻塞浏览器构建DOM树、DOM渲染树、渲染页面。所以,任何与页面初次渲染无关的逻辑功能都应该延迟加载执行,这和JavaScript资源的异步加载思路是一致的。
避免使用CSS表达式或CSS滤镜
5.6 前端搜索引擎优化基础
搜索引擎优化简称SEO
5.6.1 title, keywords, description的优化
title
、keywords
、description
是可以在HTML的
标签内定义的,有助于搜索引擎抓取到网页的内容。要注意的是,一般title的权重是最高的,也是最重要的,因此我们应该好好利用title
来提高页面的权重。keywords
相对权重较低,可以作为页面的辅助关键词搜索。description
的描述一般会直接显示在搜索结果的介绍中,可以使用户快速了解页面内容的描述文字,所以要尽量让这段文字能够描述整个页面的内容,增加用户进入页面的概率。
title
的优化
一般title
的设置要尽量能够概括页面的内容,可以使用多个title
关键字组合的形式,并用分隔符连接起来。分隔符一般有“_
”, “-
”, “
”, “,
”等,其中 “_
” 分隔符比较容易被百度搜索引擎检索到,“-
”分隔符则容易被谷歌搜索引擎检索到,“,
”则在英文站点中使用比较多,可以使用空格。title
的长度在桌面浏览器端一般建 议控制在30个字以内,在移动端控制在20个字以内,若长度超出时浏览器会默认截断并显示省略号。
关于title
格式的优化设置可以遵循以下规则:
每个网页都应该有独一无二的标题,切忌所有的页面都使用同样的默认标题
标题主题明确, 应该包含网页中最重要的信息
简明精练, 不应该罗列与网页内容不相关的信息
用户浏览通常从左到右的, 建议将重要的内容放到title
靠前的位置
使用用户所熟知的语言描述,如果有中、英文两种网站名称,尽量使用用户熟知的语 言作为标题描述
对于网站不同页面title
的定义可以设置如下:
首页:网站名称_提供服务介绍或产品介绍
列表页: 列表名称_网站名称
文章页:文章标题_文章分类_网站名称
5.6.2 语义化标签的优化
使用具有语义化的HTML5标签结构
唯一的H1标题
添加alt
属性
你可能感兴趣的:(前端技术知识归纳,前端)
Long类型前后端数据不一致
igotyback
前端
响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
【加密社】Solidity 中的事件机制及其应用
加密社
闲侃 区块链 智能合约 区块链
加密社引言在Solidity合约开发过程中,事件(Events)是一种非常重要的机制。它们不仅能够让开发者记录智能合约的重要状态变更,还能够让外部系统(如前端应用)监听这些状态的变化。本文将详细介绍Solidity中的事件机制以及如何利用不同的手段来触发、监听和获取这些事件。事件存储的地方当我们在Solidity合约中使用emit关键字触发事件时,该事件会被记录在区块链的交易收据中。具体而言,事件
关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript
二挡起步
web前端期末大作业 javascript html css 旅游 风景
⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip
HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动
二挡起步
web前端期末大作业 web设计网页规划与设计 html css javascript dreamweaver 前端
Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线
springboot+vue项目实战一-创建SpringBoot简单项目
苹果酱0567
面试题汇总与解析 spring boot 后端 java 中间件 开发语言
这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一
博客网站制作教程
2401_85194651
java maven
首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java
最简单将静态网页挂载到服务器上(不用nginx)
全能全知者
服务器 nginx 运维 前端 html 笔记
最简单将静态网页挂载到服务器上(不用nginx)如果随便弄个静态网页挂在服务器都要用nignx就太麻烦了,所以直接使用Apache来搭建一些简单前端静态网页会相对方便很多检查Web服务器服务状态:sudosystemctlstatushttpd#ApacheWeb服务器如果发现没有安装web服务器:安装Apache:sudoyuminstallhttpd启动Apache:sudosystemctl
补充元象二面
Redstone Monstrosity
前端 面试
1.请尽可能详细地说明,防抖和节流的区别,应用场景?你的回答中不要写出示例代码。防抖(Debounce)和节流(Throttle)是两种常用的前端性能优化技术,它们的主要区别在于如何处理高频事件的触发。以下是防抖和节流的区别和应用场景的详细说明:防抖和节流的定义防抖:在一段时间内,多次执行变为只执行最后一次。防抖的原理是,当事件被触发后,设置一个延迟定时器。如果在这个延迟时间内事件再次被触发,则重
微信小程序开发注意事项
jun778895
微信小程序 小程序
微信小程序开发是一个融合了前端开发、用户体验设计、后端服务(可选)以及微信小程序平台特性的综合性项目。这里,我将详细介绍一个典型的小程序开发项目的全过程,包括项目规划、设计、开发、测试及部署上线等各个环节,并尽量使内容达到或超过2000字的要求。一、项目规划1.1项目背景与目标假设我们要开发一个名为“智慧校园助手”的微信小程序,旨在为学生提供一站式校园生活服务,包括课程表查询、图书馆座位预约、食堂
字节二面
Redstone Monstrosity
前端 面试
1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文
2021.11.18
星初呀
2021.11.18#小狗钱钱金金先生和吉亚的对话,金先生说,我总感觉你和大多数小孩很不一样。吉雅说我思考的问题不一样。很惊讶于一个小孩这样的归纳能力。我们思考问题方式是怎样的?自从跟着小狗群练习,思考问题方式也在跟着转变,关注自己做到的,写成功日记,关注微小事情,思考问题消耗我们的注意力。注意力放在哪里,哪里就会开花结果。所以我们琢磨的东西会塑造我们的大脑,建立稳固的价值观。今天听了定投课堂一节
前端代码上传文件
余生逆风飞翔
前端 javascript 开发语言
点击上传文件import{ElNotification}from'element-plus'import{API_CONFIG}from'../config/index.js'import{UploadFilled}from'@element-plus/icons-vue'import{reactive}from'vue'import{BASE_URL}from'../config/index'i
uniapp实现动态标记效果详细步骤【前端开发】
2401_85123349
uni-app
第二个点在于实现将已经被用户标记的内容在下一次获取后刷新它的状态为已标记。这是什么意思呢?比如说上面gif图中的这些人物对象,有一些已被该用户添加为关心,那么当用户下一次进入该页面时,这些已经被添加关心的对象需要以“红心”状态显现出来。这个点的难度还不算大,只需要在每一次获取后端的内容后对标记对象进行状态更新即可。II.动态标记效果实现思路和步骤首先,整体的思路是利用动态类名对不同的元素进行选择。
go基础知识归纳总结
悟空丶123
golang 开发语言 后端
无缓冲的channel和有缓冲的channel的区别?在Go语言中,channel是用来在goroutines之间传递数据的主要机制。它们有两种类型:无缓冲的channel和有缓冲的channel。无缓冲的channel行为:无缓冲的channel是一种同步的通信方式,发送和接收必须同时发生。如果一个goroutine试图通过无缓冲channel发送数据,它会阻塞,直到另一个goroutine从该
360前端星计划-动画可以这么玩
马小蜗
动画的基本原理定时器改变对象的属性根据新的属性重新渲染动画functionupdate(context){//更新属性}constticker=newTicker();ticker.tick(update,context);动画的种类1、JavaScript动画操作DOMCanvas2、CSS动画transitionanimation3、SVG动画SMILJS动画的优缺点优点:灵活度、可控性、性能
Vue + Express实现一个表单提交
九旬大爷的梦
最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo
前端知识点
ZhangTao_zata
前端 javascript css
下面是一个最基本的html代码body{font-family:Arial,sans-serif;margin:20px;}//JavaScriptfunctionthatdisplaysanalertwhencalledfunctionshowMessage(){alert("Hello!Youclickedthebutton.");}MyFirstHTMLPageWelcometoMyPage
第三十一节:Vue路由:前端路由vs后端路由的了解
曹老师
1.认识前端路由和后端路由前端路由相对于后端路由而言的,在理解前端路由之前先对于路由有一个基本的了解路由:简而言之,就是把信息从原地址传输到目的地的活动对于我们来说路由就是:根据不同的url地址展示不同的页面内容1.1后端路由以前咱们接触比较多的后端路由,当改变url地址时,浏览器会向服务器发送请求,服务器根据这个url,返回不同的资源内容后端路由的特点就是前端每次跳转到不同url地址,都会重新访
华雁智科前端面试题
因为奋斗超太帅啦
前端笔试面试问题整理 javascript 开发语言 ecmascript
1.var变量的提升题目:vara=1functionfun(){console.log(b)varb=2}fun()console.log(a)正确输出结果:undefined、1答错了,给一个大嘴巴子,错误答案输出结果为:2,1此题主要考察var定义的变量,作用域提升的问题,相当于varaa=1functionfun(){varbconsole.log(b)b=2}fun()console.l
如何建设数据中台(五)——数据汇集—打破企业数据孤岛
weixin_47088026
学习记录和总结 中台 数据中台 程序人生 经验分享
数据汇集——打破企业数据孤岛要构建企业级数据中台,第一步就是将企业内部各个业务系统的数据实现互通互联,打破数据孤岛,主要通过数据汇聚和交换来实现。企业采集的数据可以是线上采集、线下数据采集、互联网数据采集、内部数据采集等。线上数据采集主要载体分为互联网和移动互联网两种,对应有系统平台、网页、H5、小程序、App等,可以采用前端或后端埋点方式采集数据。线下数据采集主要是通过硬件来采集,例如:WiFi
分布式锁和spring事务管理
暴躁的鱼
锁及事务 分布式 spring java
最近开发一个小程序遇到一个需求需要实现分布式事务管理业务需求用户在使用小程序的过程中可以查看景点,对景点地区或者城市标记是否想去,那么需要统计一个地点被标记的人数,以及记录某个用户对某个地点是否标记为想去,用两个表存储数据,一个地点表记录改地点被标记的次数,一个用户意向表记录某个用户对某个地点是否标记为想去。由于可能有多个用户同时标记一个地点,每个用户在前端点击想去按钮之后,后台接收到请求,从数据
前端CSS面试常见题
剑亦未配妥
前端面试 前端 css 面试
边界塌陷盒模型有两种:W3C盒模型和IE盒模型,区别在于宽度是否包含边框定义:同时给兄弟/父子盒模型设置上下边距,理论上边距值是两者之和,实际上不是注意:浮动和定位不会产生边界塌陷;只有块级元素垂直方向才会产生margin合并margin计算方案margin同为正负:取绝对值大的值一正一负:求和父子元素边界塌陷解决父元素可以通过调整padding处理;设置overflowhidden,触发BFC子
计算机视觉中,Pooling的作用
Wils0nEdwards
计算机视觉 人工智能
在计算机视觉中,Pooling(池化)是一种常见的操作,主要用于卷积神经网络(CNN)中。它通过对特征图进行下采样,减少数据的空间维度,同时保留重要的特征信息。Pooling的作用可以归纳为以下几个方面:1.降低计算复杂度与内存需求Pooling操作通过对特征图进行下采样,减少了特征图的空间分辨率(例如,高度和宽度)。这意味着网络需要处理的数据量会减少,从而降低了计算量和内存需求。这对大型神经网络
【JS】前端文件读取FileReader操作总结
程序员-张师傅
前端 前端 javascript 开发语言
前端文件读取FileReader操作总结FileReader是JavaScript中的一个WebAPI,它允许web应用程序异步读取用户计算机上的文件(或原始数据缓冲区)的内容,例如读取文件以获取其内容,并在不将文件发送到服务器的情况下在客户端使用它。这对于处理图片、文本文件等非常有用,尤其是当你想要在用户界面中即时显示文件内容或进行文件预览时。创建FileReader对象首先,你需要创建一个Fi
【前端】vue 报错:The template root requires exactly one element
程序员-张师傅
前端 前端 vue.js javascript
【前端】vue报错:Thetemplaterootrequiresexactlyoneelement在Vue.js中,当你遇到错误“Thetemplaterootrequiresexactlyoneelement”时,这通常意味着你的Vue组件的模板(template)根节点不是单一的元素。Vue要求每个组件的模板必须有一个根元素来包裹所有的子元素。这个错误通常出现在以下几种情况:模板中有多个并行
音视频知识图谱 2022.04
关键帧Keyframe
前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看《音视频面试题集锦2022.04》。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱。下面是2022.04月知识图谱新增的内容节选:1)图谱路径:**采集/音频采集/声音三要素/响度******主观计量响
财富自由之路读书笔记2
Elaine_a963
继续财富自由读书笔记,今天就第十-二十三章进行归纳总结思考。这本书可以说是边学边练的武功秘籍。秘籍一:注意力。先从认知上刷新,先前谈到价值的重要性及单位价值提升的必要性。这里就引出了:“注意力”是在任何地方“挖掘”价值的最基本工具。那么,要自如运用注意力,就得练习。这里李老师给的无他,就是基本功训练扎实-坐享。秘籍二:活在未来。再一次颠覆认知,大众的思维是活在当下,而这里指引我们要活在未来。用正确
从单体到微服务:FastAPI ‘挂载’子应用程序的转变
黑金IT
fastapi 微服务 fastapi 架构
在现代Web应用开发中,模块化架构是一种常见的设计模式,它有助于将大型应用程序分解为更小、更易于管理的部分。FastAPI,作为一个高性能的PythonWeb框架,提供了强大的支持来实现这种模块化设计。通过“挂载”子应用程序,我们可以为不同的功能区域(如前端接口、管理员接口和用户中心)创建独立的应用程序,并将它们整合到一个主应用程序中。本文将详细介绍如何在FastAPI中使用“挂载”子应用程序的方
创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几
uthRaman
前端 ui 服务器
前端(HTML/CSS/JavaScript)grsyzp.cnHTML页面结构(index.html)html购物商城欢迎来到购物商城JavaScript(Ajax请求商品数据,app.js)javascriptdocument.addEventListener('DOMContentLoaded',function(){fetch('/api/products').then(response=
Enum用法
不懂事的小屁孩
enum
以前的时候知道enum,但是真心不怎么用,在实际开发中,经常会用到以下代码:
protected final static String XJ = "XJ";
protected final static String YHK = "YHK";
protected final static String PQ = "PQ";
【Spark九十七】RDD API之aggregateByKey
bit1129
spark
1. aggregateByKey的运行机制
/**
* Aggregate the values of each key, using given combine functions and a neutral "zero value".
* This function can return a different result type
hive创建表是报错: Specified key was too long; max key length is 767 bytes
daizj
hive
今天在hive客户端创建表时报错,具体操作如下
hive> create table test2(id string);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:javax.jdo.JDODataSto
Map 与 JavaBean之间的转换
周凡杨
java 自省 转换 反射
最近项目里需要一个工具类,它的功能是传入一个Map后可以返回一个JavaBean对象。很喜欢写这样的Java服务,首先我想到的是要通过Java 的反射去实现匿名类的方法调用,这样才可以把Map里的值set 到JavaBean里。其实这里用Java的自省会更方便,下面两个方法就是一个通过反射,一个通过自省来实现本功能。
1:JavaBean类
1 &nb
java连接ftp下载
g21121
java
有的时候需要用到java连接ftp服务器下载,上传一些操作,下面写了一个小例子。
/** ftp服务器地址 */
private String ftpHost;
/** ftp服务器用户名 */
private String ftpName;
/** ftp服务器密码 */
private String ftpPass;
/** ftp根目录 */
private String f
web报表工具FineReport使用中遇到的常见报错及解决办法(二)
老A不折腾
finereport web报表 java报表 总结
抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己。
出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有。有报错要看日志。下面简单罗列下常见的问题,大多文档上都有提到的。
1、没有返回数据集:
在存储过程中的操作语句之前加上set nocount on 或者在数据集exec调用存储过程的前面加上这句。当S
linux 系统cpu 内存等信息查看
墙头上一根草
cpu 内存 liunx
1 查看CPU
1.1 查看CPU个数
# cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
2
**uniq命令:删除重复行;wc –l命令:统计行数**
1.2 查看CPU核数
# cat /proc/cpuinfo | grep "cpu cores" | u
Spring中的AOP
aijuans
spring AOP
Spring中的AOP
Written by Tony Jiang @ 2012-1-18 (转)何为AOP
AOP,面向切面编程。
在不改动代码的前提下,灵活的在现有代码的执行顺序前后,添加进新规机能。
来一个简单的Sample:
目标类:
[java]
view plain
copy
print
?
package&nb
placeholder(HTML 5) IE 兼容插件
alxw4616
JavaScript jquery jQuery插件
placeholder 这个属性被越来越频繁的使用.
但为做HTML 5 特性IE没能实现这东西.
以下的jQuery插件就是用来在IE上实现该属性的.
/**
* [placeholder(HTML 5) IE 实现.IE9以下通过测试.]
* v 1.0 by oTwo 2014年7月31日 11:45:29
*/
$.fn.placeholder = function
Object类,值域,泛型等总结(适合有基础的人看)
百合不是茶
泛型的继承和通配符 变量的值域 Object类转换
java的作用域在编程的时候经常会遇到,而我经常会搞不清楚这个
问题,所以在家的这几天回忆一下过去不知道的每个小知识点
变量的值域;
package 基础;
/**
* 作用域的范围
*
* @author Administrator
*
*/
public class zuoyongyu {
public static vo
JDK1.5 Condition接口
bijian1013
java thread Condition java多线程
Condition 将 Object 监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
条件(也称为条件队列或条件变量)为线程提供了一
开源中国OSC源创会记录
bijian1013
hadoop spark MemSQL
一.Strata+Hadoop World(SHW)大会
是全世界最大的大数据大会之一。SHW大会为各种技术提供了深度交流的机会,还会看到最领先的大数据技术、最广泛的应用场景、最有趣的用例教学以及最全面的大数据行业和趋势探讨。
二.Hadoop
&nbs
【Java范型七】范型消除
bit1129
java
范型是Java1.5引入的语言特性,它是编译时的一个语法现象,也就是说,对于一个类,不管是范型类还是非范型类,编译得到的字节码是一样的,差别仅在于通过范型这种语法来进行编译时的类型检查,在运行时是没有范型或者类型参数这个说法的。
范型跟反射刚好相反,反射是一种运行时行为,所以编译时不能访问的变量或者方法(比如private),在运行时通过反射是可以访问的,也就是说,可见性也是一种编译时的行为,在
【Spark九十四】spark-sql工具的使用
bit1129
spark
spark-sql是Spark bin目录下的一个可执行脚本,它的目的是通过这个脚本执行Hive的命令,即原来通过
hive>输入的指令可以通过spark-sql>输入的指令来完成。
spark-sql可以使用内置的Hive metadata-store,也可以使用已经独立安装的Hive的metadata store
关于Hive build into Spark
js做的各种倒计时
ronin47
js 倒计时
第一种:精确到秒的javascript倒计时代码
HTML代码:
<form name="form1">
<div align="center" align="middle"
java-37.有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接
bylijinnan
java
public class MaxCatenate {
/*
* Q.37 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,
* 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
*/
public static void main(String[] args){
mongoDB安装
开窍的石头
mongodb安装 基本操作
mongoDB的安装
1:mongoDB下载 https://www.mongodb.org/downloads
2:下载mongoDB下载后解压
 
[开源项目]引擎的关键意义
comsci
开源项目
一个系统,最核心的东西就是引擎。。。。。
而要设计和制造出引擎,最关键的是要坚持。。。。。。
现在最先进的引擎技术,也是从莱特兄弟那里出现的,但是中间一直没有断过研发的
 
软件度量的一些方法
cuiyadll
方法
软件度量的一些方法http://cuiyingfeng.blog.51cto.com/43841/6775/在前面我们已介绍了组成软件度量的几个方面。在这里我们将先给出关于这几个方面的一个纲要介绍。在后面我们还会作进一步具体的阐述。当我们不从高层次的概念级来看软件度量及其目标的时候,我们很容易把这些活动看成是不同而且毫不相干的。我们现在希望表明他们是怎样恰如其分地嵌入我们的框架的。也就是我们度量的
XSD中的targetNameSpace解释
darrenzhu
xml namespace xsd targetnamespace
参考链接:
http://blog.csdn.net/colin1014/article/details/357694
xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找:
例如:以下xsd文件,就出现了该错误,即便是在一
什么是RAID0、RAID1、RAID0+1、RAID5,等磁盘阵列模式?
dcj3sjt126com
raid
RAID 1又称为Mirror或Mirroring,它的宗旨是最大限度的保证用户数据的可用性和可修复性。 RAID 1的操作方式是把用户写入硬盘的数据百分之百地自动复制到另外一个硬盘上。由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而,Mirror的磁盘空间利用率低,存储成本高。
Mir
yii2 restful web服务快速入门
dcj3sjt126com
PHP yii2
快速入门
Yii 提供了一整套用来简化实现 RESTful 风格的 Web Service 服务的 API。 特别是,Yii 支持以下关于 RESTful 风格的 API:
支持 Active Record 类的通用API的快速原型
涉及的响应格式(在默认情况下支持 JSON 和 XML)
支持可选输出字段的定制对象序列化
适当的格式的数据采集和验证错误
MongoDB查询(3)——内嵌文档查询(七)
eksliang
MongoDB查询内嵌文档 MongoDB查询内嵌数组
MongoDB查询内嵌文档
转载请出自出处:http://eksliang.iteye.com/blog/2177301 一、概述
有两种方法可以查询内嵌文档:查询整个文档;针对键值对进行查询。这两种方式是不同的,下面我通过例子进行分别说明。
二、查询整个文档
例如:有如下文档
db.emp.insert({
&qu
android4.4从系统图库无法加载图片的问题
gundumw100
android
典型的使用场景就是要设置一个头像,头像需要从系统图库或者拍照获得,在android4.4之前,我用的代码没问题,但是今天使用android4.4的时候突然发现不灵了。baidu了一圈,终于解决了。
下面是解决方案:
private String[] items = new String[] { "图库","拍照" };
/* 头像名称 */
网页特效大全 jQuery等
ini
JavaScript jquery css html5 ini
HTML5和CSS3知识和特效
asp.net ajax jquery实例
分享一个下雪的特效
jQuery倾斜的动画导航菜单
选美大赛示例 你会选谁
jQuery实现HTML5时钟
功能强大的滚动播放插件JQ-Slide
万圣节快乐!!!
向上弹出菜单jQuery插件
htm5视差动画
jquery将列表倒转顺序
推荐一个jQuery分页插件
jquery animate
swift objc_setAssociatedObject block(version1.2 xcode6.4)
啸笑天
version
import UIKit
class LSObjectWrapper: NSObject {
let value: ((barButton: UIButton?) -> Void)?
init(value: (barButton: UIButton?) -> Void) {
self.value = value
Aegis 默认的 Xfire 绑定方式,将 XML 映射为 POJO
MagicMa_007
java POJO xml Aegis xfire
Aegis 是一个默认的 Xfire 绑定方式,它将 XML 映射为 POJO, 支持代码先行的开发.你开发服 务类与 POJO,它为你生成 XML schema/wsdl
XML 和 注解映射概览
默认情况下,你的 POJO 类被是基于他们的名字与命名空间被序列化。如果
js get max value in (json) Array
qiaolevip
每天进步一点点 学习永无止境 max 纵观千象
// Max value in Array
var arr = [1,2,3,5,3,2];Math.max.apply(null, arr); // 5
// Max value in Jaon Array
var arr = [{"x":"8/11/2009","y":0.026572007},{"x"
XMLhttpRequest 请求 XML,JSON ,POJO 数据
Luob.
POJO json Ajax xml XMLhttpREquest
在使用XMlhttpRequest对象发送请求和响应之前,必须首先使用javaScript对象创建一个XMLHttpRquest对象。
var xmlhttp;
function getXMLHttpRequest(){
if(window.ActiveXObject){
xmlhttp:new ActiveXObject("Microsoft.XMLHTTP
jquery
wuai
jquery
以下防止文档在完全加载之前运行Jquery代码,否则会出现试图隐藏一个不存在的元素、获得未完全加载的图像的大小 等等
$(document).ready(function(){
jquery代码;
});
<script type="text/javascript" src="c:/scripts/jquery-1.4.2.min.js&quo