本文對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...