sea.js的初次嘗試
阿新 • • 發佈:2019-01-06
sea.js文件地址:http://seajs.org/docs/#docs
sea.js是一個模組載入器,一個檔案就是一個模組。
sea.js主要解決的問題是:模組化程式設計(針對js)、非同步載入、無需考慮名稱空間
初次嘗試:
1.載入模組
sea.use載入一個或多個模組
define用來定義模組
目錄結構:
--test.html
--a
|--a.js
--b
|--b.js
--seajs
|--seajs
test.html:
<script type="text/javascript"> seajs.use(['seajs/test/a/a','seajs/test/b/b']); </script>
a/a.js:
define(function(require,exports,module){
document.write("i am a \n");
})
效果:
頁面中顯示內容
雖然實驗的例子很簡單,但是也遇到了一些問題,比如使用sea.use的時候引入模組的路徑問題
官方對路徑問題給出的文件:
相對標識
相對標識以 .
開頭,只出現在模組環境中(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/
所以使用相對標識可以寫為:
<script type="text/javascript">
seajs.use(['./a/a','./b/b']);
</script>
2.按需非同步載入模組
使用require的非同步介面require.async()
test.html
<input type="button" value="點選" id="btn">
<script type="text/javascript">
seajs.use('./a/a');
</script>
a.js
define(function(require,exports,module){
var btn = document.getElementById('btn');
btn.onclick = function(){
require.async("../b/b.js");
}
})
b.jsdefine(function(require,exports,module){
document.write("i am b");
})
載入test.html時只加載了a.js,在點選按鈕之後才載入b.js。