seajs 路徑解析過程

2021-07-08 22:24:11 字數 3805 閱讀 2322

本文對seajs 3.0.1 的部分原始碼(util-path.js) 進行學習,習得的體會。

重點是對sea.js中路徑解析的過程進行原始碼級的理解和探索,包括seajs.resolve的定義;id解析到檔案路徑的過程;seajs.config 中alias,paths,vars,map等的具體使用。

檔案出處:util-paths.js

function id2uri(id, refuri) 

// for developers

seajs.resolve = id2uri

可以看到resolve解析id的主要過程:

從 alias, 別名解析

path, path解析

vars, 變數解析

normalize, 字尾標準化js

addbase, 新增基礎路徑

map 路徑對映

至此 resolve 讓id 變成 了檔案的路徑,可以進行後續的檔案訪問。

seajs.data.alias 存放的是seajs.config中設定的別名對映。

var alias = data.alias

return

alias && isstring(alias[id]) ? alias[id] : id

}alias 解析的函式中可以看到:id作為乙個整體 作為alias對映的key

seajs.data.paths 存放的是seajs.config 中設定的paths的路徑對映。

//匹配路徑正規表示式 

var paths_re = /^([^/:]+)(\/.+)$/;

function

parsepaths

(id)

return id

}

這裡主要就是路徑的正規表示式:id.match(paths_re)

例如:

id  = "abc/def/ghi ";

id.match(paths_re) // 結果是["abc/def/ghi", "abc","def/ghi"]

這裡取值 m[1] ,獲取的是 第乙個/之前的字串作為 paths 的 key ,來獲取 paths[『abc』]的值

最後的結果是: paths[『abc』] + 『def/ghi』

seajs.data.vars 存放的是seajs.config 中設定的vars物件。

// 匹配vars 的格式 

var vars_re = //g

function

parsevars

(id) )

}return id

}

如果 id 中存在 替換為 vars中定義的vars[key]

主要在正規表示式匹配id中的 格式的字元:

vars: 

id = "abc//def"

vars_re 匹配結果: [,bbb] , 其中子模式 bbb作為key,取得vars變數的值 vars[bbb],字串替換,結果是 abc/ccc/def

#結尾的path,不處理

.js結尾,或者 包含有?的path, 不處理

/結尾,不處理

給path 新增字尾.js

function

normalize(path)

return (path.substring(last - 2) === ".js" ||

path.indexof("?") > 0 ||

lastc === 47

/* "/" */) ? path : path + ".js"

}

給解析後的path新增上基礎路徑,形成可以用給的檔案位址

可以在seajs.config 中配置base來說設定基礎 路徑

1. 絕對路徑   http://  或者 // 開頭

2. 相對路徑 ./ ../

3. 根路徑 /

4. 頂級路徑 a/b/c

上面四種路徑的形式,解析成乙個有效的檔案位址

// "//"開頭 或者 包含":/" 的絕對路徑

var absolute_re = /^\/\/.|:\//

// 匹配 ..//../ 結構的字元

var root_dir_re = /^.*?\/\/.*?\//

function

addbase

(id, refuri)

// relative

else

if (first === 46

/* "." */)

// root

else

if (first === 47

/* "/" */)

// top-level

else

// add default protocol when uri begins with "//"

if (ret.indexof("//") === 0)

return realpath(ret)

}

絕對路徑: absolute_re 匹配的,直接返回

相對路徑: 相對於參考路徑或者當前工作目錄

根路徑: 當前工作目錄如果是乙個根路徑,拼接乙個位址

頂級路徑: 前面加上 base

//開頭的path,新增上協議

轉換path為乙個真實路徑;其中包含對相對路徑,多餘// 的處理;從過程中可以看到正規表示式的強大。

var dot_re = /\/

\.\//g

var double_dot_re = /\/

[^/]+\/

\.\.

\//var multi_slash_re = /([^:/])\/+\//g

其中dot_re 匹配 /./ 模式的相對路徑,當前目錄下的檔案,直接使用 /替換

a/./b => a/b
multi_slash_re 將多個/ 轉化 只有乙個 /

a///b//c => a/b/c
double_dot_re 在除去多餘/ 後, 進行切換到上層目錄,將上層目錄替換為 /

a/b/../c  => a/c  其中/b/../ 是匹配的字串,用/ 替換
原始碼:

// canonicalize a path

// realpath("") ==>

""function realpath(path)

return path

}

在對id解析後,得到乙個檔案位址,最後進行一次map對映。

seajs.config 可以設定map的對映規則,如果uri應用了一條對映規則後,便返回,只對映一次。

function parsemap(uri) 

}return ret

}

以上貼上了seajs的相關原始碼,最其中的思想是很佩服的。通過了解這些實現過程,對於我們使用seajs將會更加的便利。

seajs模組路徑解析

seajs模組路徑解析 最近在試著用seajs grunt改造現有專案,遇到的最大的問題就是seajs命名與呼叫,簡單總結一下。seajs中呼叫模組有兩種方式,seajs.use id require id 替換alias 新增base字首 可以在seajs.config 方法中設定id別名和基礎路...

seajs模組路徑解析 簡單總結

seajs模組路徑解析 最近在試著用seajs grunt改造現有專案,遇到的最大的問題就是seajs命名與呼叫,簡單總結一下。seajs中呼叫模組有兩種方式,seajs.use id require id 替換alias 新增base字首 可以在seajs.config 方法中設定id別名和基礎路...

VC include 路徑解析

要了解vc中使用 include命令包含標頭檔案所搜尋的路徑,必須先了解vc中的幾種路徑 1.系統路徑 系統路徑在vc中是 tools options directories 中 include files 指定的路徑。開啟此對話方塊會發現預設有這幾條路徑 c program files micro...