`

模块标识

阅读更多

模块标识

模块标识是一个字符串,用来标识模块。在 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

    Wavecom模块AT指令

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

    新编码模块 新编码模块大全

    新编码模块,易语言的新编码模块,易语言的新编码模块,易语言的

    ECOM 模块指定网络标识方法

    文档描述了为ECOM 模块指定网络标识的各种方法,每个模块必须至少指定一个唯一的标识符以便网络上的PC 或其它ECOM 识别,标识ECOM 的四种方法以灵活的方式适合大多数的网络计划。

    2.1 需求规格说明书1

    功能需求需求编号规则描述需求的编号规则总体模块划分根据业务和展示功能划分,分为日常模块(上下班打卡、时间打卡、作息表、备忘录)、文件系统模块(文件上传、下载、浏

    WAVECOM_AT_命令简介

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

    AT指令集_AT指令集_

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

    javaweb模块大全---自助建站模块

    明日科技开发的javaweb模块大全系列的自助建站模块

    微模块数据中心概述(一).docx

    摘要:微模块数据中心是一个时代的标志,也是绿色环保机房的发展方向,更是现在旧机房改造的首选。由于模块化数据中心属于新兴机房,有很多的客户都去了解过,但是大家还不是很深入的了解,所以下面就让小博来给...

    学习Node.js模块机制

    CommonJS对模块的定义十分简单,主要分为模块引用、模块定义和模块标识3个部分。 1. 模块引用 模块引用的示例代码如下: var math = require(‘math’); 在CommonJS规范中,存在require()方法,这个方法接受模块...

    毕设:融合物联网标识与定位技术的仓储管理系统(基于Qt平台、MySQL 数据库以及UWB定位模块开发).zip

    毕设:融合物联网标识与定位技术的仓储管理系统(基于Qt平台、MySQL 数据库以及UWB定位模块开发) 毕设:融合物联网标识与定位技术的仓储管理系统(基于Qt平台、MySQL 数据库以及UWB定位模块开发) 毕设:融合物联网...

    Node.js中的模块机制

    CommonJS对模块的定义十分简单,主要分为模块引用、模块定义和模块标识3个部分。模块引用的示例代码如下:在CommonJS规范中,存在require()方法,这个方法接受模块标识,以此引入一个模块的API到当前上下文中。在...

    易语言模块分割无逢文本模块.rar

    易语言模块分割无逢文本模块.rar 易语言模块分割无逢文本模块.rar 易语言模块分割无逢文本模块.rar 易语言模块分割无逢文本模块.rar 易语言模块分割无逢文本模块.rar 易语言模块分割无逢文本模块.rar

    易语言外部线程操作模块

    易语言外部线程操作模块源码,外部线程操作模块,Call,UnicodeToAnsi,错误,提升权限,打开进程,取模块名,枚举模块,取模块信息,枚举线程,取线程信息,挂起线程,恢复线程,结束线程,枚举进程,结束进程,挂起进程,恢复进程,...

    模块化UPS行业标准

    本标准规定了通信用模块化不间断电源的术语和定义、要求、试验方法、检验规则和标志、包装、运输、贮存等。

    电源管理模块pcb图

    电源管理模块pcb图,主要针对飞思卡尔智能车比赛的电池充放电

    幸运福袋抽奖机小程序源码 PHP集小程序前端+后端

    幸运福袋抽奖机小程序源码 集小程序前端+后端 今天分享的也是抖音上比较火的幸运福袋抽奖机 ...2、优化模块标识 版本号:1.0.3 – 小程序 【后台更新到新版,前端需要上传】 1、新增骗审页面 2、优化支付

    超级终端演示说明超级终端演示说明

    10、获取模块标识,输入AT+CGMM后按回车 11、获取出厂日期,输入AT+WDOP 后按回车 12、获取硬件版本,输入AT+WHWV后按回车 13、获取软件版本,输入AT+CGMR后按回车 14、获取GSM模块的IMEI号,输入AT+CGSN后按回车

    seajs中模块的解析规则详解和模块使用总结

    seajs github 模块标识已经说的相对清楚了。但并没有面面俱到,特别是当你需要手写 【模块ID】和【模块依赖】的时候,或者自己写自动化工具来做 transport 的时候(ps:spm貌似适应性不是很强也不易用,毕竟每个项目...

    充电桩模块通讯指导书.pdf

    充电桩暂时也没有标准的通讯协议,这是华为充电桩的通讯协议,仅供参考

Global site tag (gtag.js) - Google Analytics