`

模块标识

 
阅读更多

模块标识

模块标识是一个字符串,用来标识模块。在 require require.async 等加载函数中,第一个参数都是模块标识。

Sea.js 中的模块标识是 CommonJS 模块标识 的超集:

  1. 一个模块标识由斜线(/)分隔的多项组成。
  2. 每一项必须是小驼峰字符串、 .  .. 
  3. 模块标识可以不包含文件后缀名,比如 .js 
  4. 模块标识可以是 相对  顶级 标识。如果第一项是 .  ..,则该模块标识是相对标识。
  5. 顶级标识根据模块系统的基础路径来解析。
  6. 相对标识相对 require 所在模块的路径来解析。

注意,符合上述规范的标识肯定是 Sea.js 的模块标识,但 Sea.js 能识别的模块标识不需要完全符合以上规范。 比如,除了大小写字母组成的小驼峰字符串,Sea.js 的模块标识字符串还可以包含下划线(_)和连字符(-), 甚至可以是http://https://file:/// 等协议开头的绝对路径。

相对标识

相对标识以 . 开头,只出现在模块环境中(define  factory 方法里面)。相对标识永远相对当前模块的 URI 来解析:

// 在 http://example.com/js/a.js 的 factory 中:
require.resolve('./b');
  // => http://example.com/js/b.js

// 在 http://example.com/js/a.js 的 factory 中:
require.resolve('../c');
  // => http://example.com/c.js

顶级标识

顶级标识不以点(.)或斜线(/)开始, 会相对模块系统的基础路径(即 Sea.js 的 base 路径)来解析:

// 假设 base 路径是:http://example.com/assets/

// 在模块代码里:
require.resolve('gallery/jquery/1.9.1/jquery');
  // => http://example.com/assets/gallery/jquery/1.9.1/jquery.js

模块系统的基础路径即 base 的默认值,与 sea.js 的访问路径相关:

如果 sea.js 的访问路径是:
  http://example.com/assets/sea.js

则 base 路径为:
  http://example.com/assets/

 sea.js 的访问路径中含有版本号时,base 不会包含 seajs/x.y.z 字串。 当 sea.js 有多个版本时,这样会很方便。

如果 sea.js 的路径是:
  http://example.com/assets/seajs/1.0.0/sea.js

则 base 路径是:
  http://example.com/assets/

当然,也可以手工配置 base 路径:

seajs.config({
  base: 'http://code.jquery.com/'
});

// 在模块代码里:
require.resolve('jquery');
  // => http://code.jquery.com/jquery.js

普通路径

除了相对和顶级标识之外的标识都是普通路径。普通路径的解析规则,和 HTML 代码中的<script src="..."></script> 一样,会相对当前页面解析。

// 假设当前页面是 http://example.com/path/to/page/index.html

// 绝对路径是普通路径:
require.resolve('http://cdn.com/js/a');
  // => http://cdn.com/js/a.js

// 根路径是普通路径:
require.resolve('/js/b');
  // => http://example.com/js/b.js

// use 中的相对路径始终是普通路径:
seajs.use('./c');
  // => 加载的是 http://example.com/path/to/page/c.js

seajs.use('../d');
  // => 加载的是 http://example.com/path/to/d.js

提示

  1. 顶级标识始终相对 base 基础路径解析。
  2. 绝对路径和根路径始终相对当前页面解析。
  3. require  require.async 中的相对路径相对当前模块路径来解析。
  4. seajs.use 中的相对路径始终相对当前页面来解析。

文件后缀的自动添加规则

Sea.js 在解析模块标识时, 除非在路径中有问号(?)或最后一个字符是井号(#),否则都会自动添加 JS 扩展名(.js)。如果不想自动添加扩展名,可以在路径末尾加上井号(#)。

// ".js" 后缀可以省略:
require.resolve('http://example.com/js/a');
require.resolve('http://example.com/js/a.js');
  // => http://example.com/js/a.js

// ".css" 后缀不可省略:
require.resolve('http://example.com/css/a.css');
  // => http://example.com/css/a.css

// 当路径中有问号("?")时,不会自动添加后缀:
require.resolve('http://example.com/js/a.json?callback=define');
  // => http://example.com/js/a.json?callback=define

// 当路径以井号("#")结尾时,不会自动添加后缀,且在解析时,会自动去掉井号:
require.resolve('http://example.com/js/a.json#');
  // => http://example.com/js/a.json

设计原则

模块标识的规则就上面这些,设计的核心出发点是:

  1. 关注度分离。比如书写模块 a.js 时,如果需要引用 b.js,则只需要知道 b.js 相对 a.js 的相对路径即可,无需关注其他。

  2. 尽量与浏览器的解析规则一致。比如根路径(/xx/zz)、绝对路径、以及传给 use 方法的非顶级标识,都是相对所在页面的 URL 进行解析。

一旦理解了以上两点,一切都会很自然、很简单。不必刻意去记这些规则,多写写,自然就会。

分享到:
评论

相关推荐

    用友ERP模块标识汇总.xls

    用友ERP模块标识汇总.xls

    《HSVM-10同步电压检测模块使用说明书》.pdf

    HSVM-10同步电压检测模块的铭牌说明包括:HSVM产品系列同步电压检测模块标识、10用途交流电压检测模块、20直流电压检测模块、产品型号、制造编号等信息。 规格参数 HSVM-10同步电压检测模块的规格参数包括:使用...

    Wavecom模块AT指令

    2.AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900).当 模块有多频带时,回应可能是不同频带的结合. 3.AT+CGMR 获得模块的软件版本. 4.AT+CGSN 获得 GSM 模块的 IMEI(国际移动设备...

    乐高EV3所有编程模块使用 学习笔记整理

    开始模块标志着程序的起点,而结束模块则表示程序的结束。等待模块用于控制程序的执行速度,如等待一定时间或特定传感器事件。重复模块(如“无限循环”或“重复N次”)使指令块可以反复执行,条件语句(如“如果......

    AS-Interface 数字模块 / 模拟模块[手册].pdf

    而提及的型号如3RK2200-0C.00、3RK2200-2C.00等,可能是不同系列或版本的模块标识,用于区分功能、性能或适用环境(如温度范围)。这些型号的特定参数和兼容性是操作手册的重要部分,指导用户选择适合自己应用需求的...

    端子箱、模块箱的安装方案.docx

    9. **模块标识与配合**:模块箱内的模块应标有部位、类别、功能和编号,与图纸或设计说明一致。如有缺失,应提前编制。模块的安装需与其他专业、工种协调,确保设备功能的独立有效性。 10. **联动设备验证**:受...

    it618插件模块调用管理使用教程3

    - 在添加模块时,确保输入正确的模块标识,这是插件与DIY模块对接的关键。数据来源选择自定义HTML,并留空HTML代码字段。 2. 修改现有的DIY模块: - 当你想利用已有的模块样式和设置时,可以选择修改现有模块。...

    JS中的模块规范(CommonJS,AMD,CMD

    - **模块标识(module)**: 每个模块都有一个`module`对象,它包含了关于模块的信息,比如其路径等。 示例: ```javascript // sum.js exports.sum = function(a, b) { return a + b; }; // calculate.js var math...

    discuz如何编辑模块,以文章模块为例说明.pdf

    模块标识是模块的唯一名称,例如"zz_20124_xx_xx_4_网站名称_年月_页面名称_分区名称",它应该具有辨识度,方便后续管理和识别。模块分类则用于区分不同类型的模块,比如文章模块。数据来源可以是系统中的指定文章,...

    SeaJS(Javascript模块加载框架)v0.9.1免费版

    4. **模块标识**:模块标识可以是相对路径、绝对路径或别名,SeaJS会自动处理这些标识,确保正确加载模块。 在提供的压缩包文件中,我们看到有以下文件: - `jb51.net.txt`:可能是关于SeaJS使用教程或者相关资源的...

    汇川 H2U-4PT本地扩展模块随机手册.pdf

    3. 在操作和配置过程中,涉及到具体的指令和操作,例如读取BFM#30的读数暂存于D0,判断模块标识是否为H2U-4PT模块,避免操作错误。 4. 提及了模块的接口和接线方式,例如CH1、CH2、CH3和CH4通道的应用接线方法,...

    Javascript模块化编程(二)AMD规范共3页.pd

    2. **依赖管理**:AMD规范通过`define`函数来定义模块,它接受三个参数:模块标识(可选)、依赖模块数组和模块实现函数。依赖模块会在调用实现函数之前加载,这样可以确保在使用依赖时它们已经准备就绪。 ```...

    ECOM 模块指定网络标识方法

    ECOM模块在网络通信中扮演着重要的角色,它们需要在网络中拥有独特的标识以便于其他设备能够准确识别和通信。本文档主要介绍了为ECOM模块指定网络标识的四种方法,确保其在网络上的唯一性和可识别性。 首先,Module...

    将一些js库改写成符合cmd规范的模块

    , factory)`完成,其中`id`是可选的模块标识,`dependencies`是依赖的模块数组,`factory`是生成模块实例的函数或对象。 - **`require`函数**:用于引入模块,`require([dependencies], function(){})`,在回调函数...

    SeaJS快速入门,让js代码模块化 - 2011-09-09修订,新添参考资料

    通过 `define` 函数,可以定义一个模块,传入模块标识、依赖和模块实现。 ```javascript seajs.use(['dep1', 'dep2'], function(dep1, dep2) { // 模块实现 }); ``` 2. **依赖(Dependency)**: 模块可以声明其...

    用友数据库表名

    - cSub_Id:模块标识,具体标识参照标注(二) - bClosing:是否关闭,除了总账模块之外的其他模块在进行年度结转以后这个字段值会变为 1,只能修改为 0 才能再次进行年度结转 11. UA_period(会计期间设置表)...

    U8数据库字段

    - **cSub_Id**:存储模块标识,用于区分不同模块的年度设置,具体标识参见标准文档。 - **bClosing**:指示模块是否已关闭,通常在非总账模块进行年度结转后,此字段会被置为1,若需再次结转,则需先将其重置为0。 ...

Global site tag (gtag.js) - Google Analytics