1. 程式人生 > >sea.js的初次嘗試

sea.js的初次嘗試

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.js
define(function(require,exports,module){
	document.write("i am b");
})
載入test.html時只加載了a.js,在點選按鈕之後才載入b.js。