一步步學會使用SeaJS 2.0
--------------------------------------------------
1、SeaJS是什麼?
我知道你看到那麼長的文章肯定會望而卻步,也許你是希望能夠快速開始敲代碼(程序員的通病……)。沒關係,如果實在讀不下去,只要記住模塊化要解決的問題即可:命名衝突、文件依賴關係。
這兩個鬧心的問題應該遇到過吧,如果沒遇到過……我只能說你太牛X了
2、下載並檢閱SeaJS
解壓後會看到下列目錄:
3、建立工程和各種目錄
(我使用了Sublime2.0,在這裏強烈推薦)
注意:SeaJS會根據自身的URI來決定URL base,而SeaJS在加載其他模塊的時候會根據這個URL base來計算路徑。SeaJS會忽略掉seajs、seajs/2.0.0/seajs這兩種目錄,照上述的目錄結構,此處的URL base就是HelloSeaJS/assets/scripts,這樣其他模塊就可以與seajs目錄並行存放。
4、引入SeaJS庫
b. SeaJS內部通過document.getElementById("seajsnode")來獲取這個script標籤(其實SeaJS內部還有一種方式,不過另一種方式的效率比較低,所以不推薦,如果有興趣,可以看一下源碼https://github.com/seajs/seajs/blob/master/src/util-path.js)
5、編寫自己的代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
define( function (require,exports,module){ var util = {}; var colorRange = [ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ]; util.randomColor = function (){ return '#' + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)]; }; var helloSeaJS = document.getElementById( 'hello-seajs' ); helloSeaJS.style.color = util.randomColor(); window.setInterval( function (){ helloSeaJS.style.color = util.randomColor(); },1500); }); |
隨着代碼的增多,你肯定會遇到util越來越多的情況。很好,這樣看來,我們就有了兩個模塊:util模塊和application模塊。SeaJS中,文件即模塊,所以當然要將其分爲兩個文件。先看util.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
define( function (require,exports,module){ var util = {}; var colorRange = [ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ]; util.randomColor = function (){ return '#' + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)]; }; module.exports = util; }); |
再看application.js:
1
2
3
4
5
6
7
8
9
10
|
define( function (require,exports,module){ var util = require( './util' ); var helloSeaJS = document.getElementById( 'hello-seajs' ); helloSeaJS.style.color = util.randomColor(); window.setInterval( function (){ helloSeaJS.style.color = util.randomColor(); },1500); }); |
我們看到var util = require('./util');這句比較特殊。這句就是在說,我application模塊由於業務需要,想請util模塊來幫忙,所以把util給require進來。
6、引入自己的代碼
你看不到效果吧?這就是這個小節存在的理由。
那麼,加載路徑就是HelloSeaJS/assets/scripts/application/application.js(SeaJS會自動加上.js後綴)
如果你對你的程序有完全的控制權,建議使用data-main的方式,這樣整個頁面就只有一段script標籤!作爲一名前端開發人員,我不得不驚歎:乾淨、完美!
7、壓縮合並
壓縮後之後,require變量變成了a變量。SeaJS是通過require字面來判斷模塊之間的依賴關係的,所以,require變量不能被簡化。
SeaJS在2.0之前,是採用SPM作爲壓縮合並工具的,到了2.0,改爲Grunt.js,SPM變爲包管理工具,類似NPM(不知道NPM?Google一下吧)
……
Grunt最核心的就兩個部分,package.json、Gruntfile.js。
a. package.json
1
2
3
4
5
6
7
8
9
10
11
12
|
{ "name" : "HelloSeaJS", "version" : "1.0.0", "author" : "Qifeng Liu", "devDependencies" : { "grunt" : "0.4.1", "grunt-cmd-transport" : "0.1.1", "grunt-cmd-concat" : "0.1.0", "grunt-contrib-uglify" : "0.2.0", "grunt-contrib-clean" : "0.4.0" } } |
grunt-contrib-clean模塊用來清除臨時目錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
module.exports = function (grunt){ grunt.initConfig({ transport : { options : { format : 'application/dist/{{filename}}' //生成的id的格式 }, application : { files : { '.build' : [ 'application.js' , 'util.js' ] //將application.js、util.js合併且提取依賴,生成id,之後放在.build目錄下 } } }, concat : { main : { options : { relative : true }, files : { 'dist/application.js' : [ '.build/application.js' ], // 合併.build/application.js文件到dist/application.js中 'dist/application-debug.js' : [ '.build/application-debug.js' ] } } }, uglify : { main : { files : { 'dist/application.js' : [ 'dist/application.js' ] //對dist/application.js進行壓縮,之後存入dist/application.js文件 } } }, clean : { build : [ '.build' ] //清除.build文件 } }); grunt.loadNpmTasks( 'grunt-cmd-transport' ); grunt.loadNpmTasks( 'grunt-cmd-concat' ); grunt.loadNpmTasks( 'grunt-contrib-uglify' ); grunt.loadNpmTasks( 'grunt-contrib-clean' ); grunt.registerTask( 'build' ,[ 'transport' , 'concat' , 'uglify' , 'clean' ]) }; |
該命令會運行grunt.registerTask方法中指定的任務
8、總結展望
最後,感謝SeaJS作者玉伯。
PS,本文參考了SeaJS提供的使用範例https://github.com/seajs/examples/tree/master/static/hello
==================================