前端发展历程与技术应用概述

前端发展历程与技术应用概述

前言

随着web2.0时代的到来,前端在web开发中所占的比重越来越大,专注于内容呈现和网站交互的前端开发人员也逐渐展现出其不可替代性。前端所涉及的领域甚至不限于web应用,如HTML5技术允许我们开发原生的移动应用;React Native、Flutter等跨平台框架可以用于开发跨平台的移动应用;还有近些年相当流行的微信/支付宝小程序等。此外,随着微软的新项目React Native for Windows的发布,使用前端技术开发Windows桌面应用也成为了可能。

那么前端如此繁荣的生态是如何一步步形成的呢?本文将带领大家回顾从web1.0到web2.0时代前端的主要发展历程和代表性的技术,希望帮助大家对前端有一个整体的认识(不懂前端的可以作为科普文章哦)。

前端发展简述

web 1.0时代 - 静态内容呈现

随着1994年美国的Netscape公司推出第一款浏览器NCSAMosaic(后改名Navigator),web1.0时代正式到来(web的概念可追溯到更早)。安装了该浏览器的用户,可以浏览来自于其他网站的信息(主要是文字和图片),当时的浏览器长这样(图片来自网络):
前端发展历程与技术应用概述_第1张图片
web诞生后的相当长的一段时间内,“前端”的工作完全是由后端开发人员来完成的。那时候的网站更偏向于静态内容展示。用户在浏览网站时,几乎不会与网页产生交互行为(如果你浏览的网页全是文字和图片,只能提交个表单,那可能就是上世纪穿越来的网页…),这时候开发一个网站的成本是比较低的,这个时代我们称为web1.0时代。

这个时代前端的代表技术主要是HTML 4.01,CSS 2.0,ECMA 4.0(JavaScript语言核心规范,两者的关系后面会有介绍)。三者的关系可以描述为:HTML告诉浏览器网页上有什么,CSS告诉浏览器他们长什么样,JavaScript描述他们有什么行为。直至今日,这三者仍是前端开发的三大核心(以JavaScript为重中之重)。

这个时代最具代表性的事件莫过于被前端开发人员津津乐道的Netscape与IE的浏览器之争(毫无疑问那是前端开发者的噩梦),后文会详细介绍。

这时候的前端专注于静态内容的呈现,但由于技术的限制,前端的呈现能力显得非常不足。

web 2.0时代 - 交互时代

web 2.0的概念正式诞生于 2004 年 3 月 O’Reilly Media 公司和 MediaLive 国际公司的一次头脑风暴会议中,在“What Is Web2.0”一文中首次被提及。

简单来说,web2.0更强调网页的交互性,它不再将用户局限在对网页的浏览上,而是根据用户的操作,来展现不同的网页内容。用户可以在不刷新页面的情况下,通过简单的点击、按键输入等获取不同的内容。除此之外,得益于JavaScript的发展,前端可以执行少量的数据处理甚至数据存储(如浏览器端数据库indexeddb),而这种能力,也是前后端发展逐渐走向平衡的一种表现。一个典型的web2.0网页如下(图片来自截图):
前端发展历程与技术应用概述_第2张图片
在web2.0时代,网页具备了展示更多媒体应用的能力,如播放音频,视频,查看PDF文档等。同时技术的标准化使前端开发人员逐渐从浏览器之争的创伤之中走出来,也大大推动了互联网技术的进步。

web2.0时代最具代表性的前端技术莫过于HTML5 + CSS3和ES5 / ES6了,其中HTML5为网页提供了诸多能力,包括播放音视频,canvas,svg,多线程,本地存储,离线应用,websocket,web worker等等;CSS3则大大增强了网页的渲染能力,包括阴影,渐变,新的布局模型,2D/3D变形和动画等等;ES5和ES6对网页的增强则是整个web2.0发展的核心,它赋予了网页越来越强的交互能力。其中ES5诞生于web2.0的早期,目前正在逐渐被ES6及其后续版本所取代。

除了在web中的应用,前端开发还触及到了其他相当多的领域,包括原生移动应用(主要借助HTML5相关技术),跨平台移动开发(React Native和Flutter),微信小程序,以及后续的Windows桌面应用开发等,此外,在一些新兴领域,如智能设备,智能医疗,计算机视觉,大数据等,前端技术都占有一席之地。因为前端最重要的工作,就是负责内容的呈现和与用户的交互。

这时候的前端把更多注意力放在了用户交互上,并大大增强了内容呈现的能力,致力于带给用户更好的浏览体验。

web 3.0时代(参考自百度百科,不做详述)

实际上web3.0时代并未真正到来,它只是业内一种概念性的描述,并且本质上不是技术的革新,而是web理念的一种革新。我们先来看一下web2.0时代遇到的一些问题。

随着web2.0时代的蓬勃发展,大量的网站涌现出来,web中的数据量呈指数级增长。对于普通浏览器用户来说,web技术不止带来了大量的免费信息,也带来了筛选信息的烦恼。如今的互联网上充斥着大量的数据,如何找到准确、可靠、最新的信息,即使对专业的计算机开发人员来说,也是个不小的问题。此外,各个网站之间相对独立,信息只有通过同时浏览过这些网站的人才能发生交互。我们知道,数据的整合会创造更大的价值,而目前这种整合几乎完全依赖于每个web参与者,这显然无法完全发挥这些数据的价值。

web3.0则会通过第三方平台来整合数据,为用户筛选和提炼更有价值的信息,这可能需要借助其他领域的技术来实现,如人工智能、大数据等等。另外web3.0的实践者希望所有的应用都完全基于web,即使用web技术实现需要复杂的系统应用才能实现的功能,例如微软的基于web的在线office应用等。

web3.0背景下,前端需要具备呈现更加复杂的数据的能力,并提供不亚于复杂的系统应用的交互能力和业务逻辑处理能力。

前端发展史及代表性技术

web1.0的诞生与发展

这里我们以Netscape推出第一款浏览器作为前端发展的开始。

HTML规范

1994年,HTML2.0版本发布(1990年诞生的最初的HTML版本没有官方规范,因此HTML是从2.0版本开始发布的),同年Netscape推出第一款浏览器Mosaic,以HTML作为通用的标记语言。

HTML本身是一种标记语言,用类似于<>的标签来标识一段内容,如…表示标签内的部分是HTML文档,而

表示中间的内容是一个段落。一段简单的HTML代码可能长这样:

<!DOCTYPE html>
<html>
<head>
	<title>一个网页</title>
	<meta charset="utf-8">
</head>
<body>
	<p>这里是一个段落</p>
</body>
</html>

如果你想制作自己的第一个网页,可以按以下步骤执行:

  1. 新建一个文本文档(如test.txt)
  2. 将上述内容粘贴进去
  3. 将文件的后缀改为html(如test.html)

现在你就完成了一个网页的制作,你只需要双击该文档(或在打开方式中选择任意一个浏览器),就可以在浏览器中打开该HTML文档,然后你就可以看到如下内容:
前端发展历程与技术应用概述_第3张图片
没错,这就是一个标准的网页(尽管它几乎不能再简单了)。

第一行告诉浏览器,这是个html文档(也就是网页)。

…里面的内容将被浏览器认为是整个文档的所有内容(里面的所有内容都会被浏览器解析)。

…中的内容是对这个网页的描述,…<title>中的内容是文档的名字,将显示在顶部标签栏中(浏览器最顶部的一个个标签页),meta标签定义了文档的编码格式(主要防止中文乱码)。</p> <p><body>…</body>中的内容就是页面上需要显示的内容,<p>…</p>定义了一个段落,本文当中网页上的内容只有一个段落,而段落里显示的内容就是“这里是一个段落”(如图所见)。</p> <p>现在你已经不是对前端一无所知了,不是吗?</p> <h5>JavaScript的诞生</h5> <p>1995年,Netscape公司的Brendan Eich开发出了决定web前端发展的一门编程语言–JavaScript(此处应有掌声~~)。</p> <p>设计JavaScript的最初目的,是为了进行网页上的表单验证。在那个年代,人们的上网速度极慢。设想,假如你正在填写一个表单,需要你输入用户名和密码,但是你还没填用户名就手残地点了提交,过了30秒,你收到一条服务器返回来的数据,告诉你用户名没填,你会作何感想?</p> <p>为了在数据发给服务器之前,就提前对数据进行一定的验证(如数据是否为空,邮箱格式是否正确等),JavaScript被设计出来了。现在我们可以在前端拦截要发送的表单,验证里面的数据,验证通过后再发动给服务器,多好!(实际上正是因为JavaScript最初的功能如此简单,它在相当长一段时间内都被认为是一门玩具语言,完全没有人想到它能像现在这样统治web前端!)</p> <p><em><strong>关于JavaScript的小科普</strong></em><br> JavaScript最初名叫LiveScript,因为那时的Java刚好受到媒体的热捧,借着这个浪潮,Netscape将LiveScript更名为JavaScript。</p> <p>JavaScript与ECMAScript的关系:<br> ECMAScript,通常简写为es,是JavaScript语言的核心规范,它定义了这门语言本身的语法规范和编程特性等,由ECMA国际组织(前身为欧洲计算机制造协会)定义。</p> <p>es1.0实际上是基于已有的JavaScript定义的,于1997年发布。目前广泛使用的是es5版本,并逐渐被es6及其后续版本所取代。JavaScript以ECMAScript为语言核心,并进行了必要的扩展。为了在HTML中使用JavaScript,它提供了文档对象模型(DOM,Document Object Model),而为了访问浏览器提供的接口,它提供了浏览器对象模型(BOM,Browser Object Model)。因此JavaScript由ECMAScript、DOM、BOM三部分构成。而ECMAScript同时也是某些其他脚本语言的核心规范,如JScript、VBScript等。</p> <h5>CSS规范</h5> <p>通过上面短短的十行代码,我们已经可以写出自己的第一个网页了,但是网页长成这样,怎么拿出去给别人看?</p> <p>于是在1996年,CSS1.0规范发布,目的就是解决网页的样式问题。下面我们给body中的p段落加一点小小的改动:</p> <pre><code class="prism language-javascript"> <span class="token operator"><</span>p style<span class="token operator">=</span><span class="token string">"color: red;"</span><span class="token operator">></span>这里是一个段落<span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span> </code></pre> <p>这里的style表示后面的字符串是为了描述这个段落的样式的,color: red表示我想让这个段落显示为红色,将这个p标签放回到我们的html文件里,网页就变成了这样:<br> <a href="http://img.e-com-net.com/image/info8/6f34c0967b0c45a6a88f5ee79897f3db.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/6f34c0967b0c45a6a88f5ee79897f3db.jpg" alt="前端发展历程与技术应用概述_第4张图片" width="496" height="359" style="border:1px solid black;"></a><br> 看到了吗,现在我们的段落变成了红色,你还可以继续写style=“color: red;text-indent: 2em;”,这样段落的开始就会缩进两格:<br> <a href="http://img.e-com-net.com/image/info8/bcebef1a2e0c44dca54418cf5574c155.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/bcebef1a2e0c44dca54418cf5574c155.jpg" alt="前端发展历程与技术应用概述_第5张图片" width="496" height="382" style="border:1px solid black;"></a><br> 简单却很酷,不是吗?</p> <p>CSS赋予了我们美化页面的能力(随着CSS3的发布,这种能力变得越发的强大和不可思议!),它描述了HTML页面上的每一部分内容长什么样,这是那些绚丽多彩的网站实现的基础,你甚至可以直接使用CSS来定义一个动画效果(现在的网站通常都会这么做)。比如下面这种效果(实际点击照片会动态切换,这里只是截图):<br> <br> 这才是前端该有的样子吧!</p> <h3>web1.0的落幕</h3> <h5>浏览器之争 - 前端开发者的噩梦</h5> <p>浏览器之争的两大对立方,分别是Netscape公司和操作系统巨头微软,而这场争端则是从微软1996年推出其第一款浏览器Internet Explore 3(简称IE3)开始的。</p> <p>由于Netscape更早地入驻web领域,它一度将自己视为web发展的领头羊。而微软作为操作系统领域的巨头,自然也不想放过web领域这块肥肉。仅仅两年之后,微软就推出了自己的浏览器IE3,使用的脚本语言是JScript(如此命名是为了避免与Netscape的版权冲突)。随后两者的发展几乎是各自独立的,两者都在为浏览器提供新的功能扩展,但是由于当时没有一个标准化组织可以对技术进行统一,因此两者对同一功能的实现往往大相径庭。鉴于当时两者都具有很高的市场份额,网站开发者不得不开发出能同时在两个浏览器上运行的代码(这种痛苦即使到了今天也依然存在),这样开发者的工作量成倍地增加,还需要忍受浏览器中存在的大量bug。<br> <a href="http://img.e-com-net.com/image/info8/6806c3a74b034e6ebd249a6699addc1c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/6806c3a74b034e6ebd249a6699addc1c.jpg" alt="前端发展历程与技术应用概述_第6张图片" width="450" height="325" style="border:1px solid black;"></a></p> <p>当然浏览器之争对前端发展的好处也是有目共睹的。由于没有受到任何约束,浏览器厂商可以随心所欲地向浏览器添加有用的功能,用户几乎能切身地感受到web技术的迅猛发展。就在这样的客观背景下,前端技术向前迈进了一大步。</p> <p>但是到了20世纪末,随着微软将IE浏览器捆绑到操作系统,免费提供给用户使用,几乎完全靠浏览器来盈利的Netscape公司迅速败下阵来,并最终在1998年被收购,浏览器之争到此落下了帷幕(此举至今仍备受指责,并一度被认为是一种垄断行为)。浏览器之争结束后,web领域涌现出了一大批优秀的浏览器,如谷歌的Chrome浏览器,继承了Netscape衣钵的Firefox(火狐)浏览器,苹果的Safari浏览器等,IE因为遗留下来的大量技术问题,市场份额逐渐减少,趋于被web领域所抛弃。</p> <h5>技术标准化 - 前端发展的根基</h5> <p>为了应对浏览器之争带来的种种弊端,各大标准化组织开始对已有的技术进行大规模标准化。将web1.0带向成熟的规范包括HTML4.01,CSS2.0,ES3.0,在这三者的推动下,web领域的技术趋于稳定。但此时的前端开发者可谓寥寥无几,因为这时的网站通常是一堆的静态页面,主要功能是向用户展示来自服务器的数据,页面复杂度相对较低,因此前端的工作通常是由有经验的后端开发人员来承担,使用诸如基于java的jsp技术,以及基于C#的asp技术等,将后台代码嵌入模板,生成页面,发送给浏览器。</p> <p>但是随着页面复杂度的不断增加,使用模板生成页面的成本也不断增加,后端开发人员逐渐变得力不从心。此外,后端开发人员开发的页面,通常对页面美化不够重视,网站风格也偏于古板,无法满足用户的审美需求。</p> <p>前后端分离成为了一种必然趋势!</p> <h3>web2.0时代的兴起</h3> <h5>AJAX技术 - 异步加载数据</h5> <p>当技术发展到一定程度,人们就会对它产生更多的期待,web技术同样如此。1.0时代的静态页面虽然足够承载大量的信息,但却无法满足人们与网页进行交互的需求(这种需求也正是推动技术进步的最大动力)。</p> <p>以前如果你需要从服务器获取数据,无论多么少量的数据,网页都必须全部刷新一次,这带来了很不好的用户体验。用户希望页面更加“智能”,不要每次请求数据都刷新页面。</p> <p>随着这种需求的日益强烈,AJAX技术诞生了!这项技术最初用在谷歌2004-2005年推出的两款革命性产品Gmail(邮件服务)和Google Map(谷歌地图)中,用户可以在不刷新页面的情况下,直接从服务器获取数据。这在当时是史无前例的,而这两款产品也迅速占领了市场!<br> <a href="http://img.e-com-net.com/image/info8/8cd74cc022464b98a657b921d10049e9.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8cd74cc022464b98a657b921d10049e9.jpg" alt="前端发展历程与技术应用概述_第7张图片" width="416" height="302" style="border:1px solid black;"></a></p> <p>AJAX技术现在已经成为当前web发展的基础技术之一,对web技术的发展起到了极大的推动作用。</p> <h5>兼容性框架的出现</h5> <p>作为浏览器之争的受害者,一直到web1.0时代结束,前端开发者都不得不为了兼容主流浏览器,而开发大量的兼容性代码,这给前端开发工作带来了极大的障碍。这个时期,前端中涌现了许多可以处理浏览器兼容问题的库,而这其中最优秀的当属jQuery了。<br> <a href="http://img.e-com-net.com/image/info8/966e1d91c675452f9ed030d1f0e7edc7.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/966e1d91c675452f9ed030d1f0e7edc7.jpg" alt="前端发展历程与技术应用概述_第8张图片" width="500" height="260" style="border:1px solid black;"></a><br> 2006年,John Resig正式发布了jQuery,随后其便迅速成为各大网站的标配(直至今日,jQuery的市场份额仍然不可低估)。它为各大主流浏览器提供了统一的接口,也就是说,如果你想实现一个功能,那么可以直接使用jQuery提供的功能,然后jQuery会根据用户使用的浏览器自动进行兼容性处理。这样开发者只需要写一份符合jQuery规范的代码,即可保证在各大浏览器上正常运行,这在当时是多么了不起的一件事啊!比如我们只需要下面一行代码就可以产生让div元素向上收起的动画效果:</p> <pre><code class="prism language-javascript"> <span class="token operator">...</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"div"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">slideUp</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">...</span> </code></pre> <p>除了进行浏览器兼容,jQuery还对JavaScript本身提供了很多的扩展,提供了诸如DOM操作、css选择器、异步队列、数据缓存、动画、属性操作、事件封装、ajax请求封装等一系列的功能,使前端开发进入了一个崭新的时代。此外,jQuery的生态系统极其丰富,它具有很强的可扩展性,吸引了大量的插件开发者开发高质量的jQuery插件来扩展其功能(这些高质量的插件可能是jQuery仍然占据大量市场份额的一个原因)。</p> <h5>HTML5标准的问世</h5> <p>这里的HTML5标准不单指HTML自身,还包括了CSS3和ES5 / ES6相关的规范。<br> HTML5规范极大地扩展了浏览器所能呈现内容的范围。在HTML5规范下,我们可以很容易地嵌入一段音频、一个视频等等,也可以使用canvas画布或者svg,在网页上随心所欲地绘制一幅图片,拖拽、动画、2D/3D变换等操作都成为了可能,这要归功于HTML5+CSS3规范所提供的强大能力。<br> <a href="http://img.e-com-net.com/image/info8/b23f75d500084e4fb3ba937afd2fcf1b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b23f75d500084e4fb3ba937afd2fcf1b.jpg" alt="前端发展历程与技术应用概述_第9张图片" width="343" height="214" style="border:1px solid black;"></a><br> ES5规范的提出,使JavaScript进一步成熟,在编程语言市场占有了一席之地。紧接着,ECMA标准组织又推出了ES6规范,为这门语言提供了相当多的现代语言特性,大大增强了其对前端环境的适应力。同时也为JavaScript进入后端开发奠定了基础。</p> <h3>当前的前端生态</h3> <h5>nodejs的兴起</h5> <p>由于JavaScript单线程的语言特性以及不具备如java般严谨的面向对象特征,它一度被认为只能用于前端开发,不能适应后端复杂业务逻辑的开发,这主要基于三点:</p> <ol> <li>单线程特性,无法充分利用多核CPU强大的计算能力,不利于开发分布式应用</li> <li>不够安全,一旦主线程出错,整个执行过程就会崩溃</li> <li>没有严谨的面向对象特性,封装程度不够,无法处理复杂的业务逻辑</li> </ol> <p>但同时作为面向前端浏览器环境所设计的一门语言,JavaScript也具有一些其他大部分语言没有的特性,最典型的包括其事件循环机制,同时单线程的特点也可以说是有利有弊。</p> <p>利用JavaScript的这些语言特点,Ryan Dahl于2009年发布了JavaScript的服务器端运行环境nodejs。它基于谷歌浏览器广受好评的JavaScript引擎–V8引擎,是一个事件驱动的非阻塞I/O模型。它将所有的客户端请求都交给事件循环机制来处理,从而将I/O代价降到极低。由于单线程的语言机制,它不需要处理复杂的线程同步问题,更不会发生死锁等线程问题。随着ES6规范中web worker的出现,nodejs也具备了利用多核CPU的能力(当然仍然无法与java相提并论)。<br> <a href="http://img.e-com-net.com/image/info8/9e04c2f1d172488a8f1dbca1b7142494.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/9e04c2f1d172488a8f1dbca1b7142494.jpg" alt="前端发展历程与技术应用概述_第10张图片" width="650" height="398" style="border:1px solid black;"></a><br> 总的来说,JavaScript和nodejs的发展仍有不足,使用nodejs开发完整后端应用的网站仍然微乎其微,但是有相当多的网站使用nodejs来开发中间件,利用其优秀的I/O性能,处理大量的I/O请求。</p> <p>nodejs的发展仍然值得期待。</p> <h5>组件化开发和MVVM的兴起</h5> <p>英雄终有落幕,尽管jQuery红极一时,但是终究无法应对越来越复杂的前端开发工作。一方面,jQuery大量的优秀特性已经被吸纳为JavaScript标准。另一方面,占有其60%代码量的DOM操作已经被公认为网页的性能杀手,因为DOM操作需要反复地操作文档,并触发网页的重绘和重排,这会严重影响网页的性能,最严重的可能导致页面卡死。此外,使用jQuery开发的网站,会因为大量的DOM操作,需要书写大量的代码,从而变得难以维护。</p> <p>我们需要有一种更优雅的方式来操作页面,以获得更优秀的用户体验。</p> <p>为了解决这些问题,前端兴起了组件化开发和MVVM开发模型。</p> <p>目前对国内影响比较大的当属React和Vue了(Angular没有接触过,所以就不讨论了)。2013年,Facebook的前端团队设计了一个崭新的前端框架,它将网页的各个部分拆分成一个个的组件,使用虚拟DOM将页面上的节点存储在内存中,将视图和数据进行绑定。视图的显示完全由数据和模板来驱动,这样当数据发生变化时,开发者不需要考虑如何去进行DOM操作,框架会自动以高效的方式去更新虚拟DOM,然后更新网页内容。开发者只需要专注于数据的操作即可。这样就实现了视图与业务逻辑的分离。<br> <a href="http://img.e-com-net.com/image/info8/5055a8d0f9b54fc99e1c19d667cbaad8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/5055a8d0f9b54fc99e1c19d667cbaad8.jpg" alt="前端发展历程与技术应用概述_第11张图片" width="578" height="270" style="border:1px solid black;"></a></p> <p>作为国内的一款优秀的前端框架,Vue在前端开发中的地位毋庸置疑。以我个人看来,Vue的设计更加符合人们的思维方式,所以上手更快,学习成本更低。但Vue本身并不是严格基于MVVM模型的框架,只是借鉴了MVVM的设计原理。这里就不详述了。<br> <a href="http://img.e-com-net.com/image/info8/b6ddb8cca49a4c178efecd7cbc112730.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b6ddb8cca49a4c178efecd7cbc112730.jpg" alt="前端发展历程与技术应用概述_第12张图片" width="533" height="300" style="border:1px solid black;"></a></p> <h5>前端技术在其他领域的应用</h5> <p>HTML5的出现赋予了JavaScript开发原生移动应用的能力,但是性能与java、kotlin等开发的移动应用相比稍差一些。</p> <p>同样是Facebook推出的前端框架React Native,可以用于开发跨安卓和iOS平台的移动应用。</p> <p>此外,备受瞩目的Google开发框架Flutter(基于Dart语言)同样提供了这种能力,目前两者均占有一定的市场份额。</p> <p>近些年流行的小程序,如微信小程序、支付宝小程序等,也是前端技术的应用之一。</p> <p>此外,微软推出了基于React Native的项目React Native for Windows,可以使用JavaScript来编写Windows桌面应用,该项目目前处于发展初期。</p> <p>另外,人工智能领域,大数据领域等也都可以看到JavaScript的身影,主要用于内容的呈现,数据的展示,与用户的交互等。在很多应用场景中,前端的形式已经发生了巨大的变化,但是本质还是用于内容的呈现和与用户的交互。</p> <h2>总结</h2> <p>前端的发展经历了上古的混乱时期,到后来的规范化、标准化时期,再到近些年的快速发展时期,现在已经成为了web领域中不可缺少的一环。作为前端开发者,我们致力于以更好的方式为用户呈现内容,以及向用户提供更好的交互体验。作为初涉前端的开发人员,我对前端的认识尚浅,另外由于篇幅有限,本文有大量的前端知识点没有涉及,如有兴趣可自行查阅。本文的目的主要是向对前端了解较少,但对前端充满兴趣的开发者分享一些个人对前端的理解和认识,也是对我这一年前端开发经历的小总结,如有错误,还望指正。</p> <h2>参考资料</h2> <p>前端开发进化史,你经历过哪几个时期?<br> 前端发展简史<br> web 百度百科<br> web3.0 百度百科</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1274468829853925376"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(前端杂说)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950191208873652224.htm" title="vue element 封装表单" target="_blank">vue element 封装表单</a> <span class="text-muted">影子信息</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进</div> </li> <li><a href="/article/1950191165710069760.htm" title="前端面试每日 3+1 —— 第39天" target="_blank">前端面试每日 3+1 —— 第39天</a> <span class="text-muted">浪子神剑</span> <div>今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss</div> </li> <li><a href="/article/1950178477592342528.htm" title="前端数据库:IndexedDB从基础到高级使用指南" target="_blank">前端数据库:IndexedDB从基础到高级使用指南</a> <span class="text-muted"></span> <div>文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950169526440095744.htm" title="从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战" target="_blank">从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战</a> <span class="text-muted"></span> <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是</div> </li> <li><a href="/article/1950164483057971200.htm" title="14.tornado操作之应用Websocket协议实现聊天室功能" target="_blank">14.tornado操作之应用Websocket协议实现聊天室功能</a> <span class="text-muted">孤寒者</span> <a class="tag" taget="_blank" href="/search/Tornado%E6%A1%86%E6%9E%B6%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98/1.htm">Tornado框架从入门到实战</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/tornado/1.htm">tornado</a><a class="tag" taget="_blank" href="/search/%E8%81%8A%E5%A4%A9%E5%AE%A4%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0/1.htm">聊天室功能实现</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二</div> </li> <li><a href="/article/1950144218282389504.htm" title="为什么学习Web前端一定要掌握JavaScript?" target="_blank">为什么学习Web前端一定要掌握JavaScript?</a> <span class="text-muted">web前端学习指南</span> <div>为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。</div> </li> <li><a href="/article/1950143305194991616.htm" title="小架构step系列25:错误码" target="_blank">小架构step系列25:错误码</a> <span class="text-muted">秋千码途</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有</div> </li> <li><a href="/article/1950140903616212992.htm" title="Java朴实无华按天计划从入门到实战(强化速战版-66天)" target="_blank">Java朴实无华按天计划从入门到实战(强化速战版-66天)</a> <span class="text-muted">岫珩</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%AE%89%E6%8E%92/1.htm">时间安排</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/1.htm">学习计划</a> <div>致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录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</div> </li> <li><a href="/article/1950132204336115712.htm" title="《跨域资源共享CORS的深层逻辑与前端实践精要》" target="_blank">《跨域资源共享CORS的深层逻辑与前端实践精要》</a> <span class="text-muted"></span> <div>不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了</div> </li> <li><a href="/article/1950131321980383232.htm" title="深入了解 Kubernetes(k8s):从概念到实践" target="_blank">深入了解 Kubernetes(k8s):从概念到实践</a> <span class="text-muted"></span> <div>目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带</div> </li> <li><a href="/article/1950119224630374400.htm" title="大厂都在用的前端缓存策略,你掌握了吗?" target="_blank">大厂都在用的前端缓存策略,你掌握了吗?</a> <span class="text-muted">AI架构全栈开发实战笔记</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文</div> </li> <li><a href="/article/1950115062781898752.htm" title="26. 什么是雪碧图,作用和原理了解吗" target="_blank">26. 什么是雪碧图,作用和原理了解吗</a> <span class="text-muted">yqcoder</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95-CSS/1.htm">前端面试-CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不</div> </li> <li><a href="/article/1950112039502409728.htm" title="H5UI微信小程序前端框架实战指南" target="_blank">H5UI微信小程序前端框架实战指南</a> <span class="text-muted">ai</span> <div>本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下</div> </li> <li><a href="/article/1950104854819041280.htm" title="Ubuntu安装LAMP" target="_blank">Ubuntu安装LAMP</a> <span class="text-muted">L_h1</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>在安装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</div> </li> <li><a href="/article/1950104727928762368.htm" title="震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!" target="_blank">震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!</a> <span class="text-muted">coding随想</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入</div> </li> <li><a href="/article/1950094764498022400.htm" title="Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析" target="_blank">Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析</a> <span class="text-muted">代码简单说</span> <a class="tag" taget="_blank" href="/search/2025%E5%BC%80%E5%8F%91%E5%BF%85%E5%A4%87%28%E9%99%90%E6%97%B6%E7%89%B9%E6%83%A0%29/1.htm">2025开发必备(限时特惠)</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/Coze/1.htm">Coze</a><a class="tag" taget="_blank" href="/search/Studio/1.htm">Studio</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0/1.htm">开发平台</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88/1.htm">全栈</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">工程化</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%A7%A3%E6%9E%B6%E6%9E%84/1.htm">图解架构</a> <div>CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于</div> </li> <li><a href="/article/1950075480849838080.htm" title="关于前端的性能优化" target="_blank">关于前端的性能优化</a> <span class="text-muted"></span> <div>性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C</div> </li> <li><a href="/article/1950059723604684800.htm" title="linux网卡显示未知未托管,linux有线网络显示设备未托管" target="_blank">linux网卡显示未知未托管,linux有线网络显示设备未托管</a> <span class="text-muted"></span> <div>NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理</div> </li> <li><a href="/article/1950053798433058816.htm" title="页面开发样式和布局入门:Vite + Vue 3 + Less" target="_blank">页面开发样式和布局入门:Vite + Vue 3 + Less</a> <span class="text-muted"></span> <div>页面开发样式和布局入门:Vite+Vue3+Less引言在现代前端开发中,样式和布局是页面开发的核心部分。随着技术的不断发展,Vite、Vue3和Less等工具和框架的出现,使得前端开发变得更加高效和灵活。然而,尽管这些工具和框架提供了强大的功能,但在实际开发中仍然会遇到各种样式和布局的问题。本文将结合Vite、Vue3和Less,详细介绍在页面开发中常见的样式和布局问题,并提供解决方案和最佳实践</div> </li> <li><a href="/article/1950046229840850944.htm" title="推客系统小程序机构版开发上线全攻略(2025年最新版)" target="_blank">推客系统小程序机构版开发上线全攻略(2025年最新版)</a> <span class="text-muted">vx_qutudy</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">推客小程序</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">推客系统开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">推客系统源码</a> <div>一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W</div> </li> <li><a href="/article/1950042324155297792.htm" title="网络安全第14集" target="_blank">网络安全第14集</a> <span class="text-muted">不灭锦鲤</span> <a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>前言:小迪安全14集,这集重点内容:0、什么是js渗透测试?在javascript中也存在变量和函数,存在可控变量和函数就有可能存在在漏洞,js开发的web应用和php、java开发的区别是,js能看得到的源代码,php看不到,但是风险就是未授权访问、配置信息泄露(加密算法、key秘钥等),源代码看得到,存在更多的url泄露,从而可能会出现未授权访问,从url,前提:web应用可以采用前端语言或后</div> </li> <li><a href="/article/1950037152830124032.htm" title="怎么判断一个DAPP是否真正去中心化" target="_blank">怎么判断一个DAPP是否真正去中心化</a> <span class="text-muted"></span> <div>判断一个DAPP(去中心化应用)是否真正去中心化,需要从多个维度进行考察。以下是关键评估标准:1.区块链依赖程度✅真正去中心化:核心逻辑和数据处理完全依赖智能合约,运行在区块链上(如以太坊、Solana等)。❌伪去中心化:依赖中心化服务器处理关键数据或业务逻辑,仅前端去中心化。2.智能合约控制权✅去中心化:合约代码开源,无管理员密钥(adminkey)或可升级后门,治理由DAO(去中心化自治组织)</div> </li> <li><a href="/article/1950020001654173696.htm" title="Web前端交互利用Python跟大模型操作" target="_blank">Web前端交互利用Python跟大模型操作</a> <span class="text-muted">哥本哈士奇</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E4%BA%92/1.htm">交互</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Web前端交互利用Python跟大模型操作一个简单的演示,如何把大模型应用集成到自己的应用场景当中。这里的场景我们模拟的是在吃鸡游戏中,一个作战计划,是否符合老六的行为规范。吃鸡游戏已经风靡很多年,游戏里每个人的游戏风格都不一样,有喜欢钢枪的,有喜欢随机应变的,也有喜欢当老六苟分的。每种风格的游戏方式以及游戏里的行为都不同,所以这里将演示如何应用大模型,去判断一个人的游戏方式,是否符合一个老六的行</div> </li> <li><a href="/article/1950009162180128768.htm" title="尚硅谷微服务尚医通前端npm报错" target="_blank">尚硅谷微服务尚医通前端npm报错</a> <span class="text-muted"></span> <div>尚硅谷微服务尚医通前端npm报错血泪史我的版本的8.0.0,弹幕里说降级npm到6.多就能安装,经过许久挣扎还是各种报错,最后通过一下办法解决解决办法:不需要降低npm版本,办法如下这里需要使用到cnpm:1.导入下载好到的项目2.安装cnpm:npminstallcnpm-g3.安装node-sass:cnpminstallnode-sass4.继续安装:cnpminode-sass-D5.删除</div> </li> <li><a href="/article/1950005000038051840.htm" title="Layui核心语法快速入门指南" target="_blank">Layui核心语法快速入门指南</a> <span class="text-muted">bemyrunningdog</span> <a class="tag" taget="_blank" href="/search/layui/1.htm">layui</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Layui基本语法学习指南Layui是一个经典的模块化前端框架,以其轻量易用、组件丰富著称。以下是Layui的核心语法结构和使用方法:一、模块加载机制(核心基础)//标准模块加载语法layui.use(['module1','module2'],function(){//回调函数中获取模块varmod1=layui.module1;varmod2=layui.module2;//模块功能调用mod</div> </li> <li><a href="/article/1950002983613820928.htm" title="前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)" target="_blank">前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)</a> <span class="text-muted"></span> <div>开始之前CompositionAPI可以说是Vue3的最大特点,那么为什么要推出CompositionApi,解决了什么问题?通常使用Vue2开发的项目,普遍会存在以下问题:代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺点TypeScript支持有限以上通过使用CompositionApi都能迎刃而解正文一、OptionsApiOptionsAPI,即大家常说的选项API,即以vue</div> </li> <li><a href="/article/1949984445817745408.htm" title="Vue 工程化开发入门" target="_blank">Vue 工程化开发入门</a> <span class="text-muted">dawn191228</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0/1.htm">前端学习</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>文章目录一、Vue工程化开发概述二、Vue脚手架三、项目运行流程四、组件化开发五、组件注册六、总结在当今的前端开发领域,Vue.js以其简洁、高效的特性受到了广泛的欢迎。Vue的工程化开发能够帮助我们更好地组织和管理项目,提高开发效率和代码质量。本文将带你了解Vue工程化开发入门知识,包括脚手架、项目运行流程、组件化以及组件注册。一、Vue工程化开发概述工程化开发是一种将软件开发过程规范化、标准化</div> </li> <li><a href="/article/1949963001104756736.htm" title="Python,C++,go语言开发社会犯罪人群回归社会跟踪与辅助管理APP" target="_blank">Python,C++,go语言开发社会犯罪人群回归社会跟踪与辅助管理APP</a> <span class="text-muted">Geeker-2025</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a> <div>开发一款用于**社会犯罪人群回归社会跟踪与辅助管理**的App,结合Python、C++和Go语言的优势,可以实现高效的数据处理、实时的跟踪监控以及用户友好的前端界面。以下是一个详细的开发方案,涵盖技术选型、功能模块、开发步骤等内容。##技术选型###后端(Python+Go)-**编程语言**:-**Python**:用于数据处理、机器学习(如风险评估、行为预测)、脚本编写等。-**Go**:用</div> </li> <li><a href="/article/89.htm" title="java责任链模式" target="_blank">java责任链模式</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F/1.htm">责任链模式</a><a class="tag" taget="_blank" href="/search/%E6%9D%91%E6%B0%91%E5%91%8A%E5%8E%BF%E9%95%BF/1.htm">村民告县长</a> <div>责任链模式,通常就是一个请求从最低级开始往上层层的请求,当在某一层满足条件时,请求将被处理,当请求到最高层仍未满足时,则请求不会被处理。 就是一个请求在这个链条的责任范围内,会被相应的处理,如果超出链条的责任范围外,请求不会被相应的处理。 下面代码模拟这样的效果: 创建一个政府抽象类,方便所有的具体政府部门继承它。 package 责任链模式; /** * </div> </li> <li><a href="/article/216.htm" title="linux、mysql、nginx、tomcat 性能参数优化" target="_blank">linux、mysql、nginx、tomcat 性能参数优化</a> <span class="text-muted">ronin47</span> <div>一、linux 系统内核参数 /etc/sysctl.conf文件常用参数 net.core.netdev_max_backlog = 32768 #允许送到队列的数据包的最大数目 net.core.rmem_max = 8388608 #SOCKET读缓存区大小 net.core.wmem_max = 8388608 #SOCKET写缓存区大</div> </li> <li><a href="/article/343.htm" title="php命令行界面" target="_blank">php命令行界面</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/cli/1.htm">cli</a> <div>常用选项 php -v php -i PHP安装的有关信息 php -h 访问帮助文件 php -m 列出编译到当前PHP安装的所有模块 执行一段代码 php -r 'echo "hello, world!";' php -r 'echo "Hello, World!\n";' php -r '$ts = filemtime("</div> </li> <li><a href="/article/470.htm" title="Filter&Session" target="_blank">Filter&Session</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/session/1.htm">session</a> <div>Filter HttpServletRequest requ = (HttpServletRequest) req; HttpSession session = requ.getSession(); if (session.getAttribute("admin") == null) { PrintWriter out = res.ge</div> </li> <li><a href="/article/597.htm" title="连接池与Spring,Hibernate结合" target="_blank">连接池与Spring,Hibernate结合</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>        前几篇关于Java连接池的介绍都是基于Java应用的,而我们常用的场景是与Spring和ORM框架结合,下面就利用实例学习一下这方面的配置。         1.下载相关内容:     &nb</div> </li> <li><a href="/article/724.htm" title="[简单]mybatis判断数字类型" target="_blank">[简单]mybatis判断数字类型</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>       昨天同事反馈mybatis保存不了int类型的属性,一直报错,错误信息如下:       Caused by: java.lang.NumberFormatException: For input string: "null" at sun.mis</div> </li> <li><a href="/article/851.htm" title="项目启动时或者启动后ava.lang.OutOfMemoryError: PermGen space" target="_blank">项目启动时或者启动后ava.lang.OutOfMemoryError: PermGen space</a> <span class="text-muted">程序员是怎么炼成的</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/catalina.sh/1.htm">catalina.sh</a><a class="tag" taget="_blank" href="/search/eclipse.ini/1.htm">eclipse.ini</a> <div>   在启动比较大的项目时,因为存在大量的jsp页面,所以在编译的时候会生成很多的.class文件,.class文件是都会被加载到jvm的方法区中,如果要加载的class文件很多,就会出现方法区溢出异常 java.lang.OutOfMemoryError: PermGen space.     解决办法是点击eclipse里的tomcat,在</div> </li> <li><a href="/article/978.htm" title="我的crm小结" target="_blank">我的crm小结</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/crm/1.htm">crm</a> <div>各种原因吧,crm今天才完了。主要是接触了几个新技术: Struts2、poi、ibatis这几个都是以前的项目中用过的。 Jsf、tapestry是这次新接触的,都是界面层的框架,用起来也不难。思路和struts不太一样,传说比较简单方便。不过个人感觉还是struts用着顺手啊,当然springmvc也很顺手,不知道是因为习惯还是什么。jsf和tapestry应用的时候需要知道他们的标签、主</div> </li> <li><a href="/article/1105.htm" title="spring里配置使用hibernate的二级缓存几步" target="_blank">spring里配置使用hibernate的二级缓存几步</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>.在spring的配置文件中 applicationContent.xml,hibernate部分加入 xml 代码 <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hi</div> </li> <li><a href="/article/1232.htm" title="JAVA基础面试题" target="_blank">JAVA基础面试题</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E6%8A%BD%E8%B1%A1%E5%AE%9E%E7%8E%B0%E6%8E%A5%E5%8F%A3/1.htm">抽象实现接口</a><a class="tag" taget="_blank" href="/search/String%E7%B1%BB/1.htm">String类</a><a class="tag" taget="_blank" href="/search/%E6%8E%A5%E5%8F%A3%E7%BB%A7%E6%89%BF/1.htm">接口继承</a><a class="tag" taget="_blank" href="/search/%E6%8A%BD%E8%B1%A1%E7%B1%BB%E7%BB%A7%E6%89%BF%E5%AE%9E%E4%BD%93%E7%B1%BB/1.htm">抽象类继承实体类</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BC%82%E5%B8%B8/1.htm">自定义异常</a> <div>/*   * 栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、   *int、long、 float、double、boolean)和对象的引用,数据可以共享,速度仅次于   * 寄存器(register),快于堆。堆(heap):用于存储对象。   */  &</div> </li> <li><a href="/article/1359.htm" title="让sqlmap文件 "继承" 起来" target="_blank">让sqlmap文件 "继承" 起来</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a><a class="tag" taget="_blank" href="/search/sqlmap/1.htm">sqlmap</a> <div>        多个项目中使用ibatis , 和数据库表对应的 sqlmap文件(增删改查等基本语句),dao, pojo 都是由工具自动生成的, 现在将这些自动生成的文件放在一个单独的工程中,其它项目工程中通过jar包来引用 ,并通过"继承"为基础的sqlmap文件,dao,pojo 添加新的方法来满足项</div> </li> <li><a href="/article/1486.htm" title="精通Oracle10编程SQL(13)开发触发器" target="_blank">精通Oracle10编程SQL(13)开发触发器</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *开发触发器 */ --得到日期是周几 select to_char(sysdate+4,'DY','nls_date_language=AMERICAN') from dual; select to_char(sysdate,'DY','nls_date_language=AMERICAN') from dual; --建立BEFORE语句触发器 CREATE O</div> </li> <li><a href="/article/1613.htm" title="【EhCache三】EhCache查询" target="_blank">【EhCache三】EhCache查询</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a> <div>本文介绍EhCache查询缓存中数据,EhCache提供了类似Hibernate的查询API,可以按照给定的条件进行查询。   要对EhCache进行查询,需要在ehcache.xml中设定要查询的属性   数据准备 @Before public void setUp() { //加载EhCache配置文件 Inpu</div> </li> <li><a href="/article/1740.htm" title="CXF框架入门实例" target="_blank">CXF框架入门实例</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>CXF是apache旗下的开源框架,由Celtix + XFire这两门经典的框架合成,是一套非常流行的web service框架。 它提供了JAX-WS的全面支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用,同时它能与spring进行完美结合。 在apache cxf官网提供</div> </li> <li><a href="/article/1867.htm" title="angular.equals" target="_blank">angular.equals</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/AnguarJS+%E4%B8%AD%E6%96%87API/1.htm">AnguarJS 中文API</a><a class="tag" taget="_blank" href="/search/angular.equals/1.htm">angular.equals</a> <div>angular.equals   描述: 比较两个值或者两个对象是不是 相等。还支持值的类型,正则表达式和数组的比较。   两个值或对象被认为是 相等的前提条件是以下的情况至少能满足一项: 两个值或者对象能通过=== (恒等) 的比较 两个值或者对象是同样类型,并且他们的属性都能通过angular</div> </li> <li><a href="/article/1994.htm" title="java-腾讯暑期实习生-输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]" target="_blank">java-腾讯暑期实习生-输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>这道题的具体思路请参看 何海涛的微博:http://weibo.com/zhedahht import java.math.BigInteger; import java.util.Arrays; public class CreateBFromATencent { /** * 题目:输入一个数组A[1,2,...n],求输入B,使得数组B中的第i个数字B[i]=A</div> </li> <li><a href="/article/2121.htm" title="FastDFS 的安装和配置 修订版" target="_blank">FastDFS 的安装和配置 修订版</a> <span class="text-muted">Chen.H</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/fastDFS/1.htm">fastDFS</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/1.htm">分布式文件系统</a> <div>FastDFS Home:http://code.google.com/p/fastdfs/ 1. 安装 http://code.google.com/p/fastdfs/wiki/Setup http://hi.baidu.com/leolance/blog/item/3c273327978ae55f93580703.html 安装libevent (对libevent的版本要求为1.4.</div> </li> <li><a href="/article/2248.htm" title="[强人工智能]拓扑扫描与自适应构造器" target="_blank">[强人工智能]拓扑扫描与自适应构造器</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>       当我们面对一个有限拓扑网络的时候,在对已知的拓扑结构进行分析之后,发现在连通点之后,还存在若干个子网络,且这些网络的结构是未知的,数据库中并未存在这些网络的拓扑结构数据....这个时候,我们该怎么办呢?       那么,现在我们必须设计新的模块和代码包来处理上面的问题</div> </li> <li><a href="/article/2375.htm" title="oracle merge into的用法" target="_blank">oracle merge into的用法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/merget+into/1.htm">merget into</a> <div>Oracle中merge into的使用 http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5980965 该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSE</div> </li> <li><a href="/article/2502.htm" title="不适合使用Hadoop的场景" target="_blank">不适合使用Hadoop的场景</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>转自:http://dev.yesky.com/296/35381296.shtml。   Hadoop通常被认定是能够帮助你解决所有问题的唯一方案。 当人们提到“大数据”或是“数据分析”等相关问题的时候,会听到脱口而出的回答:Hadoop!  实际上Hadoop被设计和建造出来,是用来解决一系列特定问题的。对某些问题来说,Hadoop至多算是一个不好的选择,对另一些问题来说,选择Ha</div> </li> <li><a href="/article/2629.htm" title="YII findAll的用法" target="_blank">YII findAll的用法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>看文档比较糊涂,其实挺简单的: $predictions=Prediction::model()->findAll("uid=:uid",array(":uid"=>10));   第一个参数是选择条件:”uid=10″。其中:uid是一个占位符,在后面的array(“:uid”=>10)对齐进行了赋值; 更完善的查询需要</div> </li> <li><a href="/article/2756.htm" title="vim 常用 NERDTree 快捷键" target="_blank">vim 常用 NERDTree 快捷键</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>下面给大家整理了一些vim NERDTree的常用快捷键了,这里几乎包括了所有的快捷键了,希望文章对各位会带来帮助。 切换工作台和目录 ctrl + w + h 光标 focus 左侧树形目录ctrl + w + l 光标 focus 右侧文件显示窗口ctrl + w + w 光标自动在左右侧窗口切换ctrl + w + r 移动当前窗口的布局位置 o 在已有窗口中打开文件、目录或书签,并跳</div> </li> <li><a href="/article/2883.htm" title="Java把目录下的文件打印出来" target="_blank">Java把目录下的文件打印出来</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6/1.htm">列出目录下的文件</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E9%9D%A2%E7%9A%84%E6%96%87%E4%BB%B6/1.htm">文件夹下面的文件</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6/1.htm">目录下的文件</a> <div>Java把目录下的文件打印出来 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年7月11日 11:02:</div> </li> <li><a href="/article/3010.htm" title="linux远程桌面----VNCServer与rdesktop" target="_blank">linux远程桌面----VNCServer与rdesktop</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/Desktop/1.htm">Desktop</a> <div>windows远程桌面到linux,需要在linux上安装vncserver,并开启vnc服务,同时需要在windows下使用vnc-viewer访问Linux。vncserver同时支持linux远程桌面到linux。   linux远程桌面到windows,需要在linux上安装rdesktop,同时开启windows的远程桌面访问。   下面分别介绍,以windo</div> </li> <li><a href="/article/3137.htm" title="guava中的join和split功能" target="_blank">guava中的join和split功能</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>guava库中,包含了很好的join和split的功能,例子如下: 1) 将LIST转换为使用字符串连接的字符串    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); </div> </li> <li><a href="/article/3264.htm" title="Web开发技术十年发展历程" target="_blank">Web开发技术十年发展历程</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>回顾web开发技术这十年发展历程: Ajax 03年的时候我上六年级,那时候网吧刚在小县城的角落萌生。传奇,大话西游第一代网游一时风靡。我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一个小时我一直在,注,册,账,号。 彼时网吧用的512k的带宽,注册的时候,填了一堆信息,提交,页面跳转,嘣,”您填写的信息有误,请重填”。然后跳转回注册页面,以此循环。我现在时常想,如果当时a</div> </li> <li><a href="/article/3391.htm" title="架构师之mima-----------------mina的非NIO控制IOBuffer(说得比较好)" target="_blank">架构师之mima-----------------mina的非NIO控制IOBuffer(说得比较好)</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/buffer/1.htm">buffer</a> <div>1.前言。   如题。 2.代码。   IoService IoService是一个接口,有两种实现:IoAcceptor和IoConnector;其中IoAcceptor是针对Server端的实现,IoConnector是针对Client端的实现;IoService的职责包括: 1、监听器管理 2、IoHandler 3、IoSession</div> </li> <li><a href="/article/3518.htm" title="ORA-00054:resource busy and acquire with NOWAIT specified" target="_blank">ORA-00054:resource busy and acquire with NOWAIT specified</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/Lock/1.htm">Lock</a> <div>[Oracle] 今天对一个数据量很大的表进行操作时,出现如题所示的异常。此时表明数据库的事务处于“忙”的状态,而且被lock了,所以必须先关闭占用的session。   step1,查看被lock的session:   select t2.username, t2.sid, t2.serial#, t2.logon_time from v$locked_obj</div> </li> <li><a href="/article/3645.htm" title="javascript学习笔记" target="_blank">javascript学习笔记</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>  javascript里面有6种基本类型的值:number、string、boolean、object、function和undefined。number:就是数字值,包括整数、小数、NaN、正负无穷。string:字符串类型、单双引号引起来的内容。boolean:true、false object:表示所有的javascript对象,不用多说function:我们熟悉的方法,也就是</div> </li> <li><a href="/article/3772.htm" title="Java enum的用法详解" target="_blank">Java enum的用法详解</a> <span class="text-muted">xieke90</span> <a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/%E6%9E%9A%E4%B8%BE/1.htm">枚举</a> <div>Java中枚举实现的分析:     示例:  public static enum SEVERITY{ INFO,WARN,ERROR }     enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类      (java.l</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>