`
webcode
  • 浏览: 5940283 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在 Node.js 上使用 Dojo

 
阅读更多

Node.js 最近非常火热,不仅开源社区对其非常关注,甚至微软对其也提供了官方的支持,从而让 Node.js 也能运行于 Windows 系统,这为 Node.js 的进一步流行奠定了基础。本文将介绍 Node.js 和 Dojo 的模块管理机制,并在此基础上详细介绍在 Node.js 上运行 Dojo 框架的方案。最后通过一个例子,演示如何用 Dojo 的 DTL 模块来解析一个基于 Django 模板语言的模板文件。


一个普遍的看法是 Node.js 让 JavaScript 成为了服务器端语言,于是自然很多人都把 Node.js 看成了一个 Web Server。但实际上并非如此,Node.js 只是一个 JavaScript 宿主环境,它解释并运行 JavaScript,同时提供了很多原生对象(Native Object)让 JavaScript 可以做更多的事情,例如进行网络通信、文件处理等等。就像,您可以用 Perl、Python 写一个 Web Server 一样,您也可以用 JavaScript 写 Web Server。Node.js 适合创建 Web Server,因为它能高效的处理并发请求,但它自身并不是一个 Web Server。澄清这一点,我们就完全可以像用 Perl 一样来用 JavaScript,让它成为一种工具语言。当出现产品级的基于 Node.js 的 Web Server 时,我们也就能更加容易的上手进行 Web 服务器端开发。


为什么要在 Node 上运行 Dojo
JavaScript 本身是一个设计非常精简的语言,功能相对简单,因为它的初衷并不是用来开发复杂的应用,而只是用于自动化的来操纵浏览器。面对日益复杂的前端应用,已经出现了很多类库来解决这个问题,比如 jQuery、ExtJs、Dojo、YUI。这些类库除了实现了浏览器兼容的 API,同时还有一大部分功能是纯粹的用来增强 JavaScript 的功能。而这部分功能,正是服务器端和浏览器端通用的,我相信如果在这方面提供一致性,一定是广大 Web 开发人员所喜闻乐见的,这也是我写这篇文章的目的。
这么多类库之中,Dojo 是所有当前类库中最适合运行于 Node.js 的,原因有四:

  1. Dojo 和 Node.js 都基于 CommonJS 的 Module 规范。
  2. Dojo 天然支持 Node.js,很好的对浏览器相关代码做了隔离。启动脚本能自动检测 Node.js 运行环境检测,无需任何修改即可直接使用。
  3. Dojo 所采用的单元测试框架和打包工具都是用 JavaScript 写成,可以直接在 Node.js 上运行。从而,Dojo+Node.js 可以完成整个应用开发的生命周期。
  4. Dojo 有完整的面向对象体系,适合大型应用的开发。
Dojo 一直以来都这样定义自己:JavaScript toolkit,而并不是 Ajax Library 之类的简单的以前端应用为目标的框架。可见增强 JavaScript 功能是 Dojo 的一个重要目标,它的强大的面向对象的机制,事件机制,丰富的工具库,已经为大型前端应用的开发提供了很好的基础。而现在,它将又能在 Node.js 上发挥作用。


Node.js 和 Dojo 的模块加载机制
Node.js 和 Dojo 都遵循 CommonJS 的模块相关规范。Node.js 支持的是 Module1.0 规范,而 Dojo 支持的是 AMD(Asynchronous Module Definition,即异步模块定义)规范。虽然是两个规范,但它们都是描述了模块的定义和加载机制,有很多共同点。这就为 Dojo 运行于 Node 提供了天然的基础。在规范中,JavaScript 文件和模块是一一对应的关系,每个文件就是一个模块,模块之间可以通过相对路径来引用。
对于 Node.js,要使用一个模块非常简单,直接用 Module1.0 规范中定义的 require 函数即可,例如:

这里的 fs 是 Node.js 自带的文件系统操作的模块,可以通过它的标识“fs”来载入它,从而可以调用其提供的方法。这种模块依赖的方法和传统编程语言类似,例如 Java 的 import,C# 的 use。


但对于 Dojo 支持的 AMD 规范,则定义的是一个异步载入机制,稍微复杂。因为这个规范强调的是异步,就需要通过一个回调函数来使用模块,这个回调函数会在依赖的模块载入完成之后被调用,例如:

这里的 define 函数是由 AMD 规范定义的,其第一个参数是一个数组,包含了本模块需要依赖的模块,当这些模块载入完成后,会调用第二个参数:一个回调函数。并按顺序将依赖的模块作为参数传递给这个回调函数,供本模块使用。关于 define 函数的详细用法这里不多介绍,有兴趣的可以去查看相关规范文档。我们仅需要知道它是一个异步的模块定义和加载机制。


Dojo 中所有的模块都是通过 define 函数定义的,很显然,不支持 AMD 规范的 Node.js 是不认识 define 函数,不能直接执行这些模块的。因此,Dojo 必须自己维护模块的加载和执行,这也完全符合 Dojo 在浏览器端的行为,只是读取模块代码的逻辑从 HTTP 请求转换到了读取文件,其它逻辑维持不变。在 Dojo 的初始化代码中已经包含了对 Node.js 环境的检测,会自动根据环境使用不同的方法载入模块。


在 CommonJS 规范的基础上,Node.js 和 Dojo 还都另外引入了类似的包(package)的概念。所谓一个包就是一个文件夹,在 Node.js 下可以直接 require('packageIdentifer' ),而 Dojo 则是通过 define(['packageIdentifier' ], callback) 来使用一个包。这时 Node.js 会寻找文件夹下的 index.js 或者 index.node 模块,而 Dojo 则寻找的是 main.js 模块。同样,因为应用是运行于 Dojo 框架之下,包的概念以 Dojo 的实现为准。
如果把模块的加载理解为 Java 中的 ClassLoader,那么 Dojo 就是实现了自己的 ClassLoader,来取代 Node.js 自身的行为。因此,要在 Node.js 上运行一个基于 Dojo 的应用,用的是类似下面的命令:

这个命令告诉了 Node.js 应该执行 dojo.js 这个模块,从而启动了 Dojo 框架。而后面的参数 load=xxx 则是告诉 Dojo 应该执行 xxx 这个包(package)。这里的 xxx 就是您的应用程序的入口位置。因为 Dojo 已经接管了模块的管理,所以这里运行的就是 xxx 这个包下的 main.js 模块。
理解了这些内容,我们就可以进一步了解如何配置 Dojo,让其在 Node.js 上运行基于 Dojo 的应用程序。


在 Node 上运行 Dojo
下面通过一个简单的例子来看,如何在 Node 上运行基于 Dojo 的程序。


1. 引入并配置 Dojo
我们知道,在浏览器端引入 Dojo 之类的框架,首先需要在页面中引入框架自身,通常是通过 <script> 标签引入,在引入的同时,还可以传递参数,对于 Dojo 来说,可以通过两种途径,一种是在 <script> 标签中加入属性,例如:

这里的 djConfig 就是传递给 Dojo 的配置参数,设置了 isDebug 开启状态,从而可以输出调试信息。另一种方式是通过定义一个名为 dojoConfig 的全局变量,在其中对 Dojo 对其配置:
在 Node.js 中,方法是类似的,需要一个 Node.js 可运行的模块来引入 Dojo。例如,创建一个 bootstrap.js 文件,包含如下内容:
Node.js 中定义全局变量的方法和浏览器端略有区别,它是通过为 global 增加一个属性来定义全局变量。随后,通过 require 函数引入 Dojo,相当于 HTML 页面中的 <script> 标签。因此,在本质上,这个 bootstrap.js 文件就是包含配置信息的 Dojo。直接使用下面的代码就可以在 Node 上运行 Dojo 了:
当然,这行命令什么也没有干,只是运行了一下 Dojo。底下我们来看如何在 Dojo 里运行自己的 Dojo 程序。


2. 定义应用程序入口
上面提到了通过 dojoConfig 这个全局变量来配置 Dojo,除此之外,其中还可以定义自己的 package,每个 package 都可能是一个应用,或者一个类库。所有的 package 都放在 packages 数组中:

在这里我们定义了一个名为 mynode 的 package,并指定了其位置。这是一个相对于 <dojoroot>/dojo/ 的位置。这样,要执行这个 package,只要运行下面的命令:
Dojo 通过 load 参数来获得应该执行的 package,在这个 package 下的 main.js 模块会被执行,下面将会介绍。


3. 执行应用程序
如前面所述,package 本身并没有特别的地方,它就是一个文件夹。当仅指定一个 package,而非具体的模块时,Dojo 就会自动执行其下的 main.js 文件。这个 main.js 模块和普通的模块本质上也没有任何区别,但一般这个模块中仅包含应用初始化的逻辑,从而能够启动应用的执行。
现在我们先来看一个简单的“Hello world”的例子。我们不使用任何 Dojo 的模块,而是只用 define 来定义一个自己的模块,让它打印“Hello world”。我们在 main.js 里放如下的内容:

这样,当执行上面提到的命令:

这样,我们将会在命令行窗口看到输出的“Hello world”。这里我们并没有用任何的 Dojo 模块,而是仅仅让 Dojo 去寻找到 main.js 并执行它。那下面来看如何去依赖 Dojo 的模块来实现自己的应用逻辑。


这个例子将使用 Dojo 对 Django 模板语言(DTL)模块的实现来做字符串的转换:

可以看到,通过使用 dojox.dtl 提供的功能,就能够在服务器端将一个基于 DTL 模板的字符串转换成 HTML。dojox.dtl 实现了完整的 DTL 语法,结合 Node.js 的 HTTP 模块,就很容易创建一个自己的 Web Server,这在很大程度上得益于 Dojo 的 DTL 实现。


后记
有人曾预言 Node.js 将取代 PHP 成为最流行的服务器端语言,无论您信不信,Node.js 正在快速的演变和发展,并获得越来越多的关注。基于 Node.js 的一些 Web Server 已经可以用于商业用途,例如 http://expressjs.com。这让 JavaScript 这个简洁而优雅的语言发挥散发出越来越大的魅力。而 Dojo 作为一个功能强大的 JavaScript 框架,在企业级应用中一直备受青睐,借助其对 Node.js 的完美支持,相信也能发挥出更大的作用。


本文首发于IBM Developerworks,原文地址:http://www.ibm.com/developerworks/cn/web/1203_wangpei_dojonodejs/

分享到:
评论

相关推荐

    JavaScript框架/库(React.js,Angular,Node.js等)JavaScript Frameworks/Libraries (React.js, Angular, Node.js, etc.)

    与JavaScript框架/库相关的书籍的集合,包括(但不限于):React.js,Angular / AngularJS,Node.js,Vue.js,Backbone.js,Ember.js,Knockout.js,Dojo.js, D3.js,Three.js,Leaflet.js,Google Maps API,Bing ...

    dojo-node:node.js 的 lightwave dojo 框架包装器在您的节点环境中使用丰富的框架组件

    #Dojo-Node 在服务器上运行 dojo 就像它应该的那样简单...... ##变更日志 道场更新 1.10 小修正 ##Features ... 使用 npm 安装 dojo ... 在本地上下文中使用 dojo。 (保持全局上下文清洁)......使其工作而无需...

    sea.js2.1.1版

    除了解决命名冲突和依赖管理,使用 Sea.js 进行模块化开发还可以带来很多好处: 模块的版本管理。...直到最近两三年,随着 Dojo、YUI3、Node.js 等社区的推广和流行,前端的模块化开发理念才逐步深入人心。

    2024-2030全球与中国盐氯化系统市场现状及未来发展趋势.docx

    2024-2030全球与中国盐氯化系统市场现状及未来发展趋势

    基于深度学习的积灰检测识别-图像分类源码+数据集.zip

    详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;

    沈阳药科大学-答辩通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    微信备忘录小程序源码 作业设计demo 计算机专业作业

    微信备忘录小程序源码 作业设计demo 微信备忘录小程序是一种便捷的个人记事应用,它允许用户在微信内快速记录和查看备忘录。以下是对微信备忘录小程序的简要介绍: --- **微信备忘录小程序** 微信备忘录小程序为用户提供了一个简单、直观的记事平台。用户可以通过这个小程序记录日常事务、重要提醒和个人笔记,非常适合忙碌的现代生活节奏。 主要特点包括: 1. **快速记录**:用户可以迅速添加文本、列表或语音备忘录。 2. **定时提醒**:为每个备忘录设置提醒时间,确保不会错过任何重要事项。 3. **个性化分类**:支持自定义分类,便于管理和查找备忘录。 4. **界面友好**:清晰的界面设计,操作简便,无需复杂的学习过程。 5. **数据同步**:通过微信账号登录,实现备忘录的云端同步,方便在不同设备间切换使用。 此外,小程序还具备以下优势: - **隐私保护**:备忘录内容仅对用户本人可见,保障个人隐私。 - **无广告干扰**:提供一个无广告的清爽记事环境。 - **离线存储**:即使在无网络环境下,也能正常使用,记录的内容会在联网后自动同步。 微信备忘录小程序是日

    中国海洋大学-汇报答辩专用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    毕业设计:python基于深度学习的交通标志识别系统(源码 + 数据库 + 说明文档) 太多存百度云盘

    毕业设计:python基于深度学习的交通标志识别系统(源码 + 数据库 + 说明文档) 2 开发工具及技术 2 2.1 B/S结构的介绍 2 2.2 PYTHON技术的介绍 2 2.3 HTML技术的介绍 2 2.4 MYSQL数据库的介绍 3 2.5 深度算法的介绍 3 2.6 开发环境的介绍 3 3 需求分析 4 3.1 可行性分析 4 3.2 功能需求分析 4 3.3 非功能需求分析 4 4 总体设计 6 4.1 系统总体结构设计 6 4.2 系统的数据库设计 6 5 系统功能实现 6 5.1 登录及注册 6 5.2 首页展示 6 5.3 个人信息 6 5.4 用户管理 6 5.5 修改密码 6 5.6 图片识别 6 5.7 摄像头识别 6 5.8 天气识别 6 6 系统测试 6 6.1 测试目的 6 6.2 测试内容 6 6.3 测试总结 6

    083ssm-vue汉服文化平台网站.zip(可运行源码+数据库文件+文档)

    本L文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述汉服文化平台网站的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 汉服文化平台网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、汉服知识管理、服装展示管理、服装类别管理、用户相册管理、论坛交流、系统管理、订单管理,用户:首页、个人中心、用户相册管理、论坛交流、我的收藏管理、订单管理,前台首页;首页、汉服知识、服装展示、用户相册、论坛交流、个人中心、后台管理、购物车、在线客服等功能。由于本网站的功能模块设计比较全面,所以使得整个汉服文化平台网站信息管理的过程得以实现。 本系统的使用可以实现汉服文化平台网站管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。 关键词:汉服文化平台网站 JAVA语言;MYSQL数据库;SSM 框架

    HTML5浪漫爱心表白动画在线演示程序

    HTML5浪漫爱心表白动画在线演示程序

    node-v13.12.0-linux-armv7l.tar.xz

    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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    实验3-关系运算设计(c语言编程).doc

    实验3-关系运算设计(c语言编程).doc

    对京东网站的分析(ppt文档).ppt

    对京东网站的分析(ppt文档).ppt

    C#本科毕业设计基于Unity3D引擎的网络角色扮演游戏设计与实现源代码.zip

    高分设计源码,详情请查看资源内容中使用说明 高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明

    2021数学建模美赛C题代码.zip

    最全的数学建模美赛C题和代码、大量刷题题库、逻辑清晰易于学习

    基于MATLAB的PCA算法人脸识别项目源码+GUI界面+说明文档.zip

    详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;

    上海交通大学-通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    办公自动化(OA)是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统,极大提高公司的办公效率.zip

    springboot框架 一、Spring Boot基础应用 Spring Boot特征 概念: 约定优于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。 特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值注入IOC容器。 3.自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们。 4.使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了

    市政交通信号工程检验批质量验收记录.doc

    市政交通信号工程检验批质量验收记录.doc

Global site tag (gtag.js) - Google Analytics