-------------------------------------------------- html
一、SeaJS是什麼? 前端
我知道你看到那麼長的文章確定會望而卻步,也許你是但願可以快速開始敲代碼(程序員的通病……)。不要緊,若是實在讀不下去,只要記住模塊化要解決的問題便可:命名衝突、文件依賴關係。 node
這兩個鬧心的問題應該遇到過吧,若是沒遇到過……我只能說你太牛X了 git
二、下載並檢閱SeaJS 程序員
解壓後會看到下列目錄: github
三、創建工程和各類目錄 算法
(我使用了Sublime2.0,在這裏強烈推薦) npm
注意:SeaJS會根據自身的URI來決定URL base,而SeaJS在加載其餘模塊的時候會根據這個URL base來計算路徑。SeaJS會忽略掉seajs、seajs/2.0.0/seajs這兩種目錄,照上述的目錄結構,此處的URL base就是HelloSeaJS/assets/scripts,這樣其餘模塊就能夠與seajs目錄並行存放。 json
四、引入SeaJS庫 瀏覽器
b. SeaJS內部經過document.getElementById("seajsnode")來獲取這個script標籤(其實SeaJS內部還有一種方式,不過另外一種方式的效率比較低,因此不推薦,若是有興趣,能夠看一下源碼https://github.com/seajs/seajs/blob/master/src/util-path.js)
五、編寫本身的代碼
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進來。
六、引入本身的代碼
你看不到效果吧?這就是這個小節存在的理由。
那麼,加載路徑就是HelloSeaJS/assets/scripts/application/application.js(SeaJS會自動加上.js後綴)
若是你對你的程序有徹底的控制權,建議使用data-main的方式,這樣整個頁面就只有一段script標籤!做爲一名前端開發人員,我不得不驚歎:乾淨、完美!
七、壓縮合並
壓縮後以後,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方法中指定的任務
八、總結展望
最後,感謝SeaJS做者玉伯。
PS,本文參考了SeaJS提供的使用範例https://github.com/seajs/examples/tree/master/static/hello