65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Humax 进行 JavaScript 打包

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (2投票s)

2008年3月22日

CC (ASA 2.5)

7分钟阅读

viewsIcon

16267

本文介绍如何使用 0.2.1 版本引入的 Humax 包系统来管理客户端脚本文件。

引言

在典型的 Web 应用程序开发中,我们都清楚管理客户端脚本文件的问题。我们在服务器端开发中不会遇到可管理性问题。大多数服务器端框架都遵循物理、逻辑或两者的组合来处理和识别对象或方法。在 .NET 中,我们可以通过命名空间在逻辑上对类型进行分组,并通过程序集在物理上进行分组。在 Java 中,包有助于我们分组和管理类型。

Humax 在 0.2.1 版本中引入了打包系统。这是一种机制,它使您能够根据脚本文件的功能以及它们应该所属的类别将它们组织到不同的目录中。

不要将 Humax 包与 Java 包混淆。在 Java 中,包是按逻辑和物理分组类型的唯一方式。但是,Humax 包仅用于按物理方式分组脚本文件。

特点

  • 基于功能和类别按物理方式组织 JavaScript 文件
  • 版本控制
  • 统一脚本引用

Humax 包的含义不是

  • 包不像 Java 包那样在逻辑上组合一个或多个脚本文件以及这些文件中定义的函数和类。为此,Humax 使用命名空间。
  • 与 .NET 程序集不同,Humax 包除了版本信息外,不包含任何元信息。
  • 绝对包名(如“lib.coreApp.Page1”)不能包含多个脚本文件。相反,同一目录下的脚本文件共享部分包名,例如包“lib.coreApp.Page1”和“lib.coreApp.Page2”共享“lib.coreApp”。

创建包

要创建包,您需要为包命名,并在每个脚本文件的顶部调用 Humax.declarePackage

规则 #6。强烈建议在脚本文件顶部调用 Humax.declarePackage

例如,

Humax.declarePackage("lib.sample");

使用包的基本原因是为了避免命名冲突。Humax 建议使用脚本文件名作为包名的最后一部分。对于版本控制,Humax 建议在文件名本身中指定版本信息。在这种情况下,不要在包名的最后部分提供版本信息。

包的其余部分应直接映射到 Web 项目中的目录。在上面的示例中,“lib”应映射到一个目录。

代码库

包名的起源是什么?

假设您正在为 Husmoh 公司开发一个名为“PMS”的基于 Web 的患者管理系统。为了简单起见,您维护两组客户端脚本文件:一组用于核心功能,另一组用于 UI 功能。为此,您在“script”目录下创建了两个名为“core”和“ui”的目录。您在“core”目录下创建了两个名为“validator.js”和“common.js”的脚本文件。新患者注册和开处方等有两个脚本文件,名为“newpatreg.js”和“prescribedrugs.js”,位于“ui”目录下。下图显示了此目录结构。

正如我们所讨论的,“core”下的文件的包名最后一部分应该是“validator”和“common”。争论点在于包名的第一部分。如前所述,它应该指向脚本文件的相应目录层次结构。在上面的案例中,“validator”的目录层次结构是“E:\pms_project\scripts\core”。但我们不能使用系统特定的驱动器名和目录作为包名的一部分。合理的入口点应该是“scripts”目录。但 Humax 强烈不推荐这样做。原因是它会影响文件管理。例如,您实现了一个客户端库用于 XML 解析,其中包含大量文件,并且您计划在一个名为“MyXml”的目录下发布。在这种情况下,您可以从“MyXml”开始命名包,而“Core”目录中文件的实际包名可以是“MyXml.Core.Parser”。基于此,Humax 建议遵循以下结构来组织脚本文件,这为您的脚本文件提供了清晰的包名。

(Excluding code base directory)<Header Directory>.<Zero or more Sub Directory>.<script name excluding version>

基于上述结构,我们可以将“validator.js”的包名设为 core.validator。并且“scripts”应该是这个项目的代码库。对于“validator.js”,“core”目录充当标题目录,不需要子目录。

对于中大型应用程序,标题目录应该是“公司名称”,其直接子目录应该是项目的名称,例如 husmoh.pms.core.validator。决策应由该项目的设计师做出。

代码库与 Humax

Humax 将一个目录定义为代码库

  • 如果目录应在 Humax.AppConfig 中声明为“codebase”。
  • 如果在 AppConfig 中未指定任何目录为“codebase”,它会在 Humax 所在路径下搜索目录和/或文件。

在上面的例子中,不需要将“script”指定为代码库,因为它与“humax.js”在同一路径下。假设“husmoh”根目录位于与 humax 安装路径不同的某个目录下。在这种情况下,您应该将所有脚本的代码库指定为

Humax.AppConfig.codeBase = "husmoh"

引用和使用包

Humax 引入了 require() 方法,允许在当前脚本文件中使用包中声明的类型。

Humax.require(<package name>, [version]);

例如,

Humax.require("husmoh.pms.core.validator");

规则 #7。从 v0.2.1 开始,包(也称为 Humax 兼容脚本文件)应通过 Humax.require() 来引用。

版本化包

包的目的是简化和解决使用相同脚本文件不同版本时可能出现的版本控制问题。

版本控制问题

假设您开发了一个名为“NiceWidgets.js”的库,它需要一个特定的第三方 XML 库。假设 NiceWidgets 版本 1.0,引用了特定版本的 XML 库,例如“MyXmlLib v2.3.2.js”。“NiceWidgets.js”的客户端在没有问题的情况下在他们的应用程序中使用它。您发布了“NiceWidgets v2.0.js”,它实际上使用了“MyXmlLib v2.6.js”。在一种情况下,您的一个客户正在开发一个使用“NiceWidgets.js”的网站,现在他们想使用“NiceWidgets v2.0.js”中引入的一个新的客户端控件。由于 2.0 版本引入了一些破坏性更改,他们不想立即迁移到“NiceWidgets v2.0.js”。对他们来说,他们不得不在一个页面上使用 2.0 版本。但您的库应该加载正确版本的“MyXmlLib”,因为在客户端,他们可能同时拥有“MyXmlLib v2.3.2.js”和“MyXmlLib v2.6.js”。

指定版本

为了解决这类版本控制问题,Humax 为包引入了版本控制。您可以在 Humax.declarePackage() 中指定版本信息,

Humax.declarePackage("Husmoh.NiceWidgets", "1.0");

规则 #8。Humax 建议版本信息使用 <major>[.minor[.revision]] 格式。

请求包版本

require() 方法的第二个可选参数允许您指定所需的包版本。

Humax.require("MyXmlLib", "2.3.2");

上述命令请求加载 MyXmlLib 的 2.3.2 版本。

通过表达式请求版本

您可以在版本参数中指定关系表达式来加载给定范围内的版本,例如,您的库需要 MyXmlLib 版本大于 2.3.2。然后您可以指定

Humax.require("MyXmlLib", "v>2.3.2");

表达式应以字母“v”开头,并包含任何一个关系运算符 <, <=, >, >= 和 =。

版本化包的文件名模式

同一包的不同版本不能共享同一个文件名,这是所有操作系统非常基本的标准之一。Humax 不建议像 .NET 全局程序集那样将同一包的不同版本保存在不同目录中。相反,如果您计划开发和采用包版本,Humax 推荐以下规则。

规则 #9。版本化包的文件名模式应为 <package name>_v<major>[.minor[.revision]].js 格式。

根据规则 #9,包“MyXmlLib v2.3.2”的文件名应该是“MyXmlLib_v2.3.2.js”。

您可以将“MyXmlLib.js”用作版本 1.0 或 0.1 包的文件名,这取决于您的实现策略。

加载非 Humax 标准脚本文件

如果您想将非 Humax 标准脚本文件作为具有版本控制功能的 Humax 包来采用,您可以使用 Humax.AppConfig 中的 packages 选项。例如,

Humax.AppConfig.packages = 
[
    {name:"Husmoh.NiceWidgets", version:"0.9.1", file:"NiceWidgets.js"},
    {name:"MyOtherXmlLib", version:"2.5.6", file:"myotherxmllib 2.5.6213.js"},
    {name:"SomeValidatorScript", version:"", file:"some_validator_script.js"} 
];
        

Humax 会自动验证版本详细信息并加载相关的脚本文件。例如,您在 AppConfig 中声明了包,并且您的一个脚本文件需要 MyOtherXmlLib 包,版本大于 2.0,Humax 将加载“myotherxmllib 2.5.6213.js”。

有关 Humax Web 框架的更多详细信息或您的贡献,请访问 http://humax.sourceforge.net
写信给我 udooz@hotmail.com

© . All rights reserved.