翻译自下面文章。还没有完成翻译,因为最近没有精力做这个事情,又看到很多朋友遇到这方面的问题,先发上来。
http://www.eclipse.org/articles/Article-WorkbenchSelections/article.html
By Marc R. Hoffmann, Mountainminds GmbH & Co. KG, hoffmann@mountainminds.com
April 14, 2006
摘要:
工作台提供的选择服务(Selection Service)允许工作台窗口中的不同部件(parts)之间进行有效的沟通。了解和使用现存的选择机制可以让你的插件有清楚的设计,有机地使他们和工作台结合,并向将来可能的扩展开放。
简介
Eclipse工作台对于IDE和其他应用程序都是一个强大的UI框架。它为一个高度完整和可扩展的用户界面提供了很多服务。一个典型的综合应用就是那些在工作台窗口中,显示特定对象的额外信息,并且当选择的对象发生变化的时候自动更新相关信息的视图。例如,属性视图这样工作:无论在工作台窗口的哪个部件,一个元素被选中的时候,属性视图会自动显示这个元素的属性。
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter" />
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0" />
<v:f eqn="sum @0 1 0" />
<v:f eqn="sum 0 0 @1" />
<v:f eqn="prod @2 1 2" />
<v:f eqn="prod @3 21600 pixelWidth" />
<v:f eqn="prod @3 21600 pixelHeight" />
<v:f eqn="sum @0 0 1" />
<v:f eqn="prod @6 1 2" />
<v:f eqn="prod @7 21600 pixelWidth" />
<v:f eqn="sum @8 21600 0" />
<v:f eqn="prod @7 21600 pixelHeight" />
<v:f eqn="sum @10 21600 0" />
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
<o:lock v:ext="edit" aspectratio="t" />
</v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1031" type="#_x0000_t75"
style='width:415.5pt;height:144.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
其他应用,比如全局操作的“enable”状态的转换也依赖于当前的选择。
插件可以使用所说的“选择服务”而不必实现一个紧耦合的通信机制。它可以减少有可以选中的条目的部件和其他对选择变化起作用的部件之间的耦合。
本文概述了选择服务的机制和用法。
蓝图
每个工作台窗口有它自己的选择服务的实例。这个服务追踪当前活动部件,并且向所有的注册的监听者传播选择改变事件。这种事件在当前布局中的选择改变或者当另外一个部件被激活的时候发生。这两种情况都可以由用户界面或者程序来触发。
<!--[if gte vml 1]><v:shape
id="图片_x0020_4" o:spid="_x0000_i1030" type="#_x0000_t75" style='width:415.5pt;
height:211.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image003.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
元素或者文本被选中的视图不需要知道谁在关心这个选择。于是我们可以创建一个依赖于已经存在的视图中的选择的新视图而不必更改原视图中的任何一行代码。
下一节我们将介绍谁(who)为谁(whom)提供什么样(what)的选择。
什么可以被选择?
从用户视图角度来讲,一个选择是指在表或者树控件中,高亮的实体的一个集合。一个选择还可以指在文本编辑器中的一段文本。在表象的背后,每个可视元素在工作台中都由一个Java对象描述。JFace的MVC实现映射了领域模型和直观表示。
在内部,一个选择是一个保留了对应于工作台中选择的图形化的元素的模型对象的数据结构。前面已经指出,共有两种基本的选择类型:
<!--[if !supportLists]-->u <!--[endif]-->一个对象列表
<!--[if !supportLists]-->u <!--[endif]-->一段文本
每个选择都允许为空,比如一个空列表或者长度为0的字符串。在Eclispe体系中,这些数据结构由下列接口定义:
<!--[if gte vml 1]><v:shape
id="图片_x0020_7" o:spid="_x0000_i1029" type="#_x0000_t75" style='width:333.75pt;
height:154.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image005.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
IStructuredSelection 代表了一个对象集合;ITextSelection 和 IMarkSelection描述了一段被选中的文本。
为方便使用,这些接口都有着默认的实现:
<!--[if !supportLists]-->u <!--[endif]-->org.eclipse.jface.viewers.StructuredSelection
<!--[if !supportLists]-->u <!--[endif]-->org.eclipse.jface.text.TextSelection
<!--[if !supportLists]-->u <!--[endif]-->org.eclipse.jface.text.MarkSelection
这些实现被用在查看器(viewer)内部实现来吧底层的SWT事件转换为ISelection对象。这些实现在当元素需要以程序的方式被选中的使用也非常有用:
ISelection sel = new StructuredSelection(presetElement);
treeviewer.setSelection(sel);
将选择告知工作台窗口
所有的JFace查看器都是所谓的 选择提供者。选择提供者实现ISelectionProvider接口:<!--[if gte vml 1]><v:shape id="图片_x0020_10" o:spid="_x0000_i1028"
type="#_x0000_t75" style='width:258.75pt;height:81pt;visibility:visible;
mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image007.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
不同的JFace查看器使用和传播不同类型的选择:
Viewer Selection Type
ComboViewer IStructuredSelection
ListViewer IStructuredSelection
TreeViewer IStructuredSelection
+- CheckboxTreeViewer IStructuredSelection
ableViewer IStructuredSelection
+- CheckboxTableViewer IStructuredSelection
extViewer ITextSelection, IMarkSelection
+- SourceViewer ITextSelection, IMarkSelection
+- ProjectionViewer ITextSelection, IMarkSelection
自定义的查看器也可以作为选择提供者并且实现ISelectionProvider接口。
任何一个包含了查看器的工作台部件都应该把这个查看器注册为各自的view site的选择提供者:
getSite().setSelectionProvider(tableviewer);
即使你暂时没有需要马上传播你的选择,但这让你的插件向你或者其他人的插件实现开放。如果你的视图定义了一个依赖于当前选择的操作,那么这些操作的动态改变enable状态也需要你设置一个选择提供者。
追踪当前的选择
工作台窗口典型地是由很多部件组成的,每个部件至少有一个查看器(这点ms不太对)。工作台保持追踪工作台窗口中当前选中的部件以及部件中的选择。这样,插件实现就可以访问这些信息或者注册选择变化的通知。
每个工作台窗口都有一个ISelectionService的实现,用来追踪当前的选择。一个视图部件可以通过他的site来获取这个对象的引用:
getSite().getWorkbenchWindow().getSelectionService()
选择服务知道当前活动部件或者指定ID的部件的当前选择:
ISelection getSelection()
ISelection getSelection(String partId)
典型的情况是视图作用于工作台窗口中的选择变化。这种情况下,最好注册一个ISelectionListener以在窗口的选择变化的时候获得通知:
void addSelectionListener(ISelectionListener listener)
void removeSelectionListener(ISelectionListener listener)
通过这种途径注册的监听者会在当前活动的部件的选择发生变化或者不同的部件被激活的时候获得通知。如果程序只对某个特定的部件的选择(并且不依赖于其真实的活动状态)感兴趣,那么可以只向特定id的部件注册监听者:
void addSelectionListener(String partId, ISelectionListener listener)
void removeSelectionListener(String partId, ISelectionListener listener)
即使当前没有给定id的部件,这种方式依然有效。一旦这个id的部件被创建,它的初始选择就会被传播给注册了的监听者。如果监听者实现了INullSelectionListener接口的话,监听者会在被监听的部件dispose的时候收到一个null选择。
实现一个选择监听者(监听器)
ISelectionListener是一个只有一个方法的简单接口。一个典型的实现是向这样的:
private ISelectionListener mylistener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
<!--[if gte vml 1]><v:shape
id="图片_x0020_28" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://www.eclipse.org/articles/Article-WorkbenchSelections/images/tag_1.gif"
style='width:18pt;height:9.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image009.gif"
o:title="tag_1" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--> if (sourcepart != MyView.this &&
<!--[if gte vml 1]><v:shape
id="图片_x0020_29" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://www.eclipse.org/articles/Article-WorkbenchSelections/images/tag_2.gif"
style='width:18pt;height:9.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.gif"
o:title="tag_2" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--> selection instanceof IStructuredSelection) {
<!--[if gte vml 1]><v:shape
id="图片_x0020_30" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://www.eclipse.org/articles/Article-WorkbenchSelections/images/tag_3.gif"
style='width:18pt;height:9.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/DOCUME~1/sundl/LOCALS~1/Temp/msohtmlclip1/01/clip_image011.gif"
o:title="tag_3" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--> doSomething(((IStructuredSelection) selection).toList());
}
}
};
根据你的需求,你的监听器实现也许需要处理上面代码片段中的几个问题:
<!--[if !supportLists]-->1. <!--[endif]-->如果我们还需要提供选择服务,那么我们应该把我们自己的选择事件排除在外,不加处理。这避免了当用户在我们的部件中选择了元素的时候的不可预料的结果。
<!--[if !supportLists]-->2. <!--[endif]-->检查我们是否可以处理这种选择
<!--[if !supportLists]-->3. <!--[endif]-->取得选择内容并且进行处理
注意:不要弄混ISelectionListener接口和JFace查看器用来通知选择更改的ISelectionChangedListener。
移除监听器
当你不能再处理事件的时候(例如当你的视图被关闭),不要忘记删除你的选择监听器。dispose()方法是一个删除监听器的好地方:
public void dispose() {
ISelectionService s = getSite().getWorkbenchWindow().getSelectionService();
s.removeSelectionListener(mylistener);
super.dispose();
}
其他选择相关的问题
到现在为止,我们关注了选择服务的核心机制,覆盖了大多数用例。但在实际的实现当中,还有其他更多的问题会出现。
后选择
当浏览视图的时候,选择会频繁变化——尤其当使用键盘来滚动一个很长的列表或者使用鼠标拖动选择一段文本的时候。这会导致很多不必要的被注册为监听器的视图的更新,也可能导致你的程序响应很慢。
所谓的后选择事件会在一个较短短的延时以后再被发出。在这段延时时间内发生的选择会被忽略;仅仅最终的那个选择会被传播。ISelectionService有另外的方法来向延时选择事件注册监听器:
void addPostSelectionListener(ISelectionListener listener)
void removePostSelectionListener(ISelectionListener listener)
void addPostSelectionListener(String partId, ISelectionListener listener)
void removePostSelectionListener(String partId, ISelectionListener listener)
为避免性能问题,查看器一般应该用这种方式注册监听器。
选择提供者负责发送延时选择事件,它必须实现IPostSelectionProvider这个接口来支持延时选择事件,所有的JFace查看器都支持延时的选择事件。
ISelectionListener中定义的selectionChanged()这个回调方法可以像源部件(originating part)传入一个参数一样得到新的选择项:
public void selectionChanged(IWorkbenchPart part, ISelection selection);
接口INullSelectionListener
扩展了ISelectionListener
,但是没有声明另外的方法。这是一个纯粹的标记接口,仅仅是为了标识那些即使是在选择为ISelection参数为null的情况下也想被通知的selectionChanged()方法的实现者。这个在当你想知道因为当前没有人提供一个选择项所以没有当前选择项的情况下非常有用。在下面情况下你会进入到这里面:
<!--[if !supportLists]-->Ø <!--[endif]-->当前活动部件没有设置选择提供者。
<!--[if !supportLists]-->Ø <!--[endif]-->我们为指定部件注册了监听器,但这个部件没有提供选择提供者。
<!--[if !supportLists]-->Ø <!--[endif]-->工作台窗口没有活动部件,所有的部件都关闭了。
<!--[if !supportLists]-->Ø <!--[endif]-->我们为指定部件注册了监听器,但这个部件被关闭了。
哪个选择服务:页面或者窗口
如果你仔细研究工作台API你会发现有两个选择服务:IWorkbenchPage
是一个ISelectionService
。另外,IWorkbenchWindow
也有一个方法getSelectionService()。所以举例来说,有两种方法可以在一个部件中注册一个监听器:
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(l);
或者
getSite().getPage().addSelectionListener(l);
实际上这两种方式是完全等价的,以为在Eclipse2.0以后,一个工作台窗口限制只有一个工作台页面。但是不要再添加和删除监听器的时候混合使用它们(例如用第一种方法添加,而用第二种方法删除),因为在内部他们是两个不同的实现。
一个部件中的多个选择提供者
要明白,工作台部件的site只接受一个选择提供者,而且必须只能在createPartControl()方法中调用:
getSite().setSelectionProvider(provider);
工作台不支持在工作台部件的运行过程中替换选择提供者。如果一个部件包含了多个提供选择项的查看器,例如“Java Hierarchy”这个视图,必须提供一个中间的ISelectionProvider的实现来允许动态地在部件中委派给当前活动的查看器。作为一个开始,你可以查看本文提供的SelectionProviderIntermediate.java
这个文件。
如何处理被选中的对象
本文主张选择服务要负责帮助减少视图之间选择引起的不必要的相应。但是处理一个选择项的视图还必须为提供任何有用的功能而处理选择的对象。
分享到:
相关推荐
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
计二 王顺.zip
qbittorrent_4.6.4_lt20_qt6_x64_setup
课设毕设基于SSM的美食推荐管理系统--LW+PPT+源码可运行
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于yolov5+SlowFast+pyqt5的人体动作识别项目源码+使用说明(毕业设计).zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 基于yolov5+SlowFast+pyqt5的人体动作识别项目源码+使用说明(毕业设计).zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。基于yolov5+SlowFast+pyqt5的人体动作识别项目源码
高分毕业设计源码 基于YOLO的毕业选题设计的程序源码,适用与计算机与软件工程毕业设计选题
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
简单的学生管理系统,主要使用的Qt框架,数据库使用的Mysql,包含增删改查,排序等功能
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
根据本系统的基本设计思路,本系统在设计方面前台采用了java技术等进行基本的页面设计,后台数据库采用MySQL。本系统的实现为上门维修系统的运行打下了基础,为上门维修提供良好的条件。 最后我们通过需求分析、测试调整,与上门维修的实际需求相结合,设计实现了基于微信小程序的上门维修系统。 本课题要求实现优质的上门维修系统,就一定要包含有前台页面和后端数据库、服务器相联系,从而实现系统的功能运转。系统分为前台用户模块、维修员模块和管理员模块三部分;(1)、用户进入系统可以实现首页,广告信息,新闻资讯,我的,在我的页面可以对维修信息,维修记录,评价信息,我的收藏管理进行管理。(2)、维修员进入系统可以实现首页,广告信息,新闻资讯,我的,在我的页面可以对维修信息,维修记录,评价信息等进行管理。(3)、管理员主要包括系统首页,个人中心,用户管理,维修员管理,维修信息管理,维修记录管理,评价信息管理,广告信息管理,系统管理等有关功能进行管理。 关键词:上门维修;java;MySQL数据库
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Optimizer-16.4
毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业,项目都经过严格调试,确保可以运行! 毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学习安全聚合系统python源码.zip毕设项目基于同态加密的联邦学
【课程设计】基于python实现三维重建算法SFM源码.zip
unity游戏
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。