第四章 现代前端交互框架
(需要进行理解,再完善笔记)
数据的处理和操作的核心就是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
属性
你可能感兴趣的:(前端技术知识归纳,前端)
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
vue element 封装表单
影子信息
vue vue.js javascript 前端
背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进
前端面试每日 3+1 —— 第39天
浪子神剑
今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss
前端数据库:IndexedDB从基础到高级使用指南
文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.
【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)
笙囧同学
java 前端 状态模式
核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认
从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战
作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是
14.tornado操作之应用Websocket协议实现聊天室功能
孤寒者
Tornado框架从入门到实战 websocket tornado 聊天室功能实现 python
目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二
为什么学习Web前端一定要掌握JavaScript?
web前端学习指南
为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。
小架构step系列25:错误码
秋千码途
架构 java
1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
《跨域资源共享CORS的深层逻辑与前端实践精要》
不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了
深入了解 Kubernetes(k8s):从概念到实践
目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带
春秋战国局势对老子思想有那些影响?
禹音
百家争鸣是指春秋(前770年—前476年)战国(前475年—前221年)时期知识分子中不同学派的涌现及各流派争芳斗艳的局面。汉族在古代创造了灿烂的文化艺术,具有鲜明的特色,文化典籍极其丰富。据《汉书·艺文志》的记载,数得上名字的一共有189家,4324篇著作。其后的《隋书·经籍志》、《四库全书总目》等书则记载“诸子百家”实有上千家。但流传较广、影响较大、较为著名的不过几十家而已。归纳而言只有10家
大厂都在用的前端缓存策略,你掌握了吗?
AI架构全栈开发实战笔记
前端 缓存 ai
大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文
26. 什么是雪碧图,作用和原理了解吗
yqcoder
前端面试-CSS css 前端 html
总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不
H5UI微信小程序前端框架实战指南
ai
本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下
Ubuntu安装LAMP
L_h1
测试 ubuntu linux
在安装vim时遇到了一个问题:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)E:无法获取dpkg前端锁(/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?解决办法:强制解锁sudorm/var/lib/dpkg/lock-frontendsudorm/var/cache/apt/archives/locksud
震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!
coding随想
JavaScript 前端 javascript html5
一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入
Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析
代码简单说
2025开发必备(限时特惠) 架构 人工智能 Coze Studio 架构 AI Agent 开发平台 全栈 AI 工程化 图解架构
CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于
关于前端的性能优化
性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C
linux网卡显示未知未托管,linux有线网络显示设备未托管
NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理
页面开发样式和布局入门:Vite + Vue 3 + Less
页面开发样式和布局入门:Vite+Vue3+Less引言在现代前端开发中,样式和布局是页面开发的核心部分。随着技术的不断发展,Vite、Vue3和Less等工具和框架的出现,使得前端开发变得更加高效和灵活。然而,尽管这些工具和框架提供了强大的功能,但在实际开发中仍然会遇到各种样式和布局的问题。本文将结合Vite、Vue3和Less,详细介绍在页面开发中常见的样式和布局问题,并提供解决方案和最佳实践
推客系统小程序机构版开发上线全攻略(2025年最新版)
vx_qutudy
推客小程序 推客系统开发 推客系统源码
一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W
网络安全第14集
不灭锦鲤
web安全 安全
前言:小迪安全14集,这集重点内容:0、什么是js渗透测试?在javascript中也存在变量和函数,存在可控变量和函数就有可能存在在漏洞,js开发的web应用和php、java开发的区别是,js能看得到的源代码,php看不到,但是风险就是未授权访问、配置信息泄露(加密算法、key秘钥等),源代码看得到,存在更多的url泄露,从而可能会出现未授权访问,从url,前提:web应用可以采用前端语言或后
怎么判断一个DAPP是否真正去中心化
判断一个DAPP(去中心化应用)是否真正去中心化,需要从多个维度进行考察。以下是关键评估标准:1.区块链依赖程度✅真正去中心化:核心逻辑和数据处理完全依赖智能合约,运行在区块链上(如以太坊、Solana等)。❌伪去中心化:依赖中心化服务器处理关键数据或业务逻辑,仅前端去中心化。2.智能合约控制权✅去中心化:合约代码开源,无管理员密钥(adminkey)或可升级后门,治理由DAO(去中心化自治组织)
Web前端交互利用Python跟大模型操作
哥本哈士奇
前端 交互 python
Web前端交互利用Python跟大模型操作一个简单的演示,如何把大模型应用集成到自己的应用场景当中。这里的场景我们模拟的是在吃鸡游戏中,一个作战计划,是否符合老六的行为规范。吃鸡游戏已经风靡很多年,游戏里每个人的游戏风格都不一样,有喜欢钢枪的,有喜欢随机应变的,也有喜欢当老六苟分的。每种风格的游戏方式以及游戏里的行为都不同,所以这里将演示如何应用大模型,去判断一个人的游戏方式,是否符合一个老六的行
尚硅谷微服务尚医通前端npm报错
尚硅谷微服务尚医通前端npm报错血泪史我的版本的8.0.0,弹幕里说降级npm到6.多就能安装,经过许久挣扎还是各种报错,最后通过一下办法解决解决办法:不需要降低npm版本,办法如下这里需要使用到cnpm:1.导入下载好到的项目2.安装cnpm:npminstallcnpm-g3.安装node-sass:cnpminstallnode-sass4.继续安装:cnpminode-sass-D5.删除
Layui核心语法快速入门指南
bemyrunningdog
layui 前端 javascript 开发语言
Layui基本语法学习指南Layui是一个经典的模块化前端框架,以其轻量易用、组件丰富著称。以下是Layui的核心语法结构和使用方法:一、模块加载机制(核心基础)//标准模块加载语法layui.use(['module1','module2'],function(){//回调函数中获取模块varmod1=layui.module1;varmod2=layui.module2;//模块功能调用mod
前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)
开始之前CompositionAPI可以说是Vue3的最大特点,那么为什么要推出CompositionApi,解决了什么问题?通常使用Vue2开发的项目,普遍会存在以下问题:代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺点TypeScript支持有限以上通过使用CompositionApi都能迎刃而解正文一、OptionsApiOptionsAPI,即大家常说的选项API,即以vue
Vue 工程化开发入门
dawn191228
前端学习 vue.js 前端 javascript 前端框架
文章目录一、Vue工程化开发概述二、Vue脚手架三、项目运行流程四、组件化开发五、组件注册六、总结在当今的前端开发领域,Vue.js以其简洁、高效的特性受到了广泛的欢迎。Vue的工程化开发能够帮助我们更好地组织和管理项目,提高开发效率和代码质量。本文将带你了解Vue工程化开发入门知识,包括脚手架、项目运行流程、组件化以及组件注册。一、Vue工程化开发概述工程化开发是一种将软件开发过程规范化、标准化
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