seajs中模块ID注意事项,模块定义、模块加载、模块依赖的ID路径
seajs github 模块标识 已经说的相对清楚了。 1. 顶级标识始终相对 base 基础路径解析。 2. 绝对路径和根路径始终相对当前页面解析。 3. require 和 require.async 中的相对路径相对当前模块路径来解析。 4. seajs.use 中的相对路径始终相对当前页面来解析。 seajs中,模块的ID大致可分为三种:【相对标识】、【顶级标识】、【普通路径】, 这里重点说明 【相对标识】 和 【顶级标识】。
需要写模块ID的地方有三处: define("id (1)",["../id2 (2)"],function(require,exports,module){ var moduleA = require('./moduleA (3)'); }) 注意:无论是define第一个参数【模块ID】还是第二个参数【依赖模块的ID】还是【require模块ID】,最终的比对标准是【解析后的文件URI】。 因此,这三处需要写ID 的地方可以以任意一种方式来写,只要最终解析为同一个URI,即被认为是同一个模块。 在解析ID的过程中,会预先经过 seajs.config 中定义的 alias 和 paths 的处理。 base 路径解析规则(第 1 层,本身的路径不依赖于任何设置) paths 中路径解析规则(第 1 层,本身的路径不依赖于任何设置) //代码块(1) //path定义: seajs.config({ base:"./app/src",path:{ "a":"../lib",//(1) 相对路径 "lib":"path/to/lib",//(2) 顶级标识 "l2":"/lib" //(3) 根路径 } }); //模块 mod/m/m.js: ... require("a/jquery"); //=> 转换为:"../../lib/jquery" //=> 加载:mod/lib/jquery (特别注意 1) ... //模块 mod/f.js: ... require("a/jquery"); //=> 转换为:"../../lib/jquery" //=> 加载:lib/jquery (特别注意 2) ... alias 中路径解析规则(第 2 层,本身的路径可以依赖于paths的设置) seajs.use 路径解析规则
define 定义模块 ID 解析规则 (1)(第 3 层,路径可以相对于 alias 或 paths 来设置)
// 代码块(2) //config -- 还使用 [代码块 (1)]中的配置 // 模块1,无歧义,根路径解析 define("/app/src/module/Base",..); // 模块2,无歧义,顶级标识,相对于 base 基础路径来解析 define("app/src/module/Base",..); // 模块3,有歧义,相对标识,此处相对于 当前页面(引用到这个模块的html页面) // 但其他地方即便使用 【表面上相同的“ID”】,也可能会被解析不同的模块 define("./app/src/module/Base",..); 模块依赖ID 解析规则 (2)(第 3 层,路径可以相对于 alias 或 paths 来设置) //代码块(3) //config -- 还使用 [代码块 (1)]中的配置 //无歧义,相对于根路径解析 define("..",["/app/src/module/Base"],..) // 无歧义,顶级标识,相对于 base 基础路径解析 define("..",["app/src/module/Base"],..) //有歧义,相对标识,此处相对于 当前模块 来解析 //此处的依赖看起来是依赖于【代码块(2)】中的 `模块3` //但如果当前模块跟当前页面不在同一层目录下,就不会被解析为 `模块3` define("..",["./app/src/module/Base"],..) 模块内 require 其他模块的ID 解析规则 (3)(第 3 层,路径可以相对于 alias 或 paths 来设置) //代码块(4) //config -- 还使用 [代码块 (1)]中的配置 define("..",[..],function(require){ //无歧义,相对于根路径解析 require("/app/src/module/Base"); }); define("..",function(require){ // 无歧义,顶级标识,相对于 base 基础路径解析 require("app/src/module/Base"); }); define("..",function(require){ //有歧义,相对标识,此处相对于 当前模块 来解析 //此处的依赖看起来是依赖于【代码块(2)】中的 `模块3` //但如果当前模块跟当前页面不在同一层目录下,就不会被解析为 `模块3` require("./app/src/module/Base"); }) 特别提醒:模块内三处需要写ID的地方,不需要使用看起来相同的字符串,只要被解析为相同的模块即可。总结:
参考 : 转载请注明来自[超2真人] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |