博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从 RequireJS 到 SeaJS(3)
阅读量:6001 次
发布时间:2019-06-20

本文共 2010 字,大约阅读时间需要 6 分钟。

来看 RequireJS 的 API 页面:, 该篇博客着重分析 RequireJS 和 SeaJS 在 ID 规则上的异同。

RequireJS 的 ID 规则

对于模块加载器来说,模块 id 遵守的规则非常重要。

首先来定义几个概念。假设当前页面路径为 , 则:

  1. pageRoot = 
  2. pageUrl = 
  3. baseUrl: 在 RequireJS 里,默认情况下,baseUrl 就是 pageUrl, 除非:
    • 通过 require.config 更改了 baseUrl
    • 指定了 data-main, 比如

      这时 baseUrl 为 pageUrl/scripts

  4. paths: 表示路径的缩写,通过 config 来配置:
    require.config({ paths: { 'some': 'xxx/zzz' } })

    这时,some/a 实际上代表 xxx/zzz/a

  5. moduleUrl: 如果模块路径为 , 则 moduleUrl = 

RequireJS 的 id 规则为:首先,会通过 paths 解析,解析完成后:

  1. 是 Page ID
    • 以 .js 结尾的,比如 some/a/b.js
    • 以 / 开头的,比如 /a/b
    • 以 http(s):// 开头的

    Page ID 的解析规则与 script src="xxx" 中的 xxx 一样。

  2. 是 some/module 这种 Top-Level ID, 会解析成 baseUrl/some/module.js
  3. 是 ./some/module 这种 Relative ID, 会解析成 moduleUrl/some/module.js

SeaJS 的 ID 规则

文档:

SeaJS 的 ID 规则可以总结为:

    1. 省略约定.js 后缀可以省略。 require('path/to/a.js') 和 require('path/to/a') 是一样的。
  • 环境相关: 除了 Top-Level ID 始终相对 baseUrl 来定位,其他 ID 都是相对当前环境来定位。

举例如下:

// 在 http://t.com/test.html 中:seajs.use(['./a', 'b', 'c.js', '/d', 'http://x.com/e']);// 会下载// http://t.com/a.js// baseUrl/b.js// baseUrl/c.js// http://t.com/d.js// http://x.com/e.js// 在 http://cdn.com/path/to/t.js 中:define(function(require) {  require('./a');  require('b');  require('c.js');  require('/d');  require('http://x.com/e');});// 会下载// http://cdn.com/path/to/a.js// baseUrl/b.js// baseUrl/c.js// http://cdn.com/d.js// http://x.com/e.js

 

可以看出,在 SeaJS 里,ID 可以分成两类:

  1. Top-Level IDsome/module 这种,会根据 baseUrl 来定位。
  2. Context ID: 除了 some/module 之外的所有形式,会根据当前环境来定位。

ID 规则对使用体验的影响

RequireJS 里有 Page ID 的概念,和浏览器解析 src 的规则保持一致。

SeaJS 里则有省缺 .js 后缀的约定,和 CommonJS 以及 NodeJS 的约定保持一致。

这个取舍,使得 RequireJS 的 ID 更接近文件路径,SeaJS 的 ID 则更接近模块标识。

这其实是由两者的定位决定的:RequireJS 想同时是文件和模块加载器,SeaJS 则只专注于模块加载器。

当采用 Simplified CommonJS Wrapper 格式时,RequireJS 和 SeaJS 的解析规则基本一致:

1
2
3
4
5
6
// xxx/to/a.js
define(function(require, exports, module) {
  
require('a'); // baseUrl/a.js
  
require('./b'); // xxx/to/b.js
  
require('./b.js'); // xxx/to/b.js
});

RequireJS 的 ID 规则是比较容易让人混淆的,特别对于新手来说。有没有 .js 后缀,以及采用的模块书写格式,都会影响解析规则。

SeaJS 的 ID 规则更简单纯粹,和 CommonJS 以及 NodeJS 尽量保持一致。

转载地址:http://vibmx.baihongyu.com/

你可能感兴趣的文章
Linux系统GEDIT编译运行C++
查看>>
ASP.NET MVC学前篇之Ninject的初步了解
查看>>
归并两个有序的数组
查看>>
lsof,ulimit,
查看>>
Navicat For Mysql 数据库备份与还原
查看>>
Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法...
查看>>
外出培训 整理第二天
查看>>
Windows10下安装Ubuntu的错误总结
查看>>
PHP设置脚本最大执行时间的三种方法
查看>>
luogu P5002 专心OI - 找祖先
查看>>
自己写的Python数据库连接类和sql语句拼接方法
查看>>
Java读取文件方法大全
查看>>
树的直径证明
查看>>
Game
查看>>
Sequence one
查看>>
【Spring源码深度解析学习系列】默认标签解析(三)
查看>>
SQL——索引
查看>>
Eclipse rap 富客户端开发总结(4):如何搭建 rap 中文开发环境
查看>>
js清空表单数据的方式(遍历+reset)
查看>>
全面阐述某系统设计所实现的质量属性战术
查看>>