seajs的價值
原生javascript的一個弱項,就是不支持模塊化,說白了就是沒有其他語言的import,include等語句。所以開發者就只有2個選擇:把所有的東西寫到一起,或者通過全局變量來交互 這至少造成以下幾個問題: 1、污染全局變量,容易發生命名空間沖突,難以維護 2、無法按需加載 由於javascript官方遲遲未能解決這些問題,所以就有民間的社區提出標准,希望能自行解決,彌補語言的不足。主要有2種規范,一種是 CommonJS提出的CMD規范,另一種是AMD規范,server端的node就是CMD的一種實現,seajs實現的也是CMD規范。所以熟悉 node的用戶會發現,seajs的API和node的API非常類似,這就是因為它們是同一種規范的不同實現 關於seajs的價值,這篇帖子說得更加詳細: why seajsseajs的例子
官網上的5分鍾入門例子也很簡單,不過本文再簡化一點,用一個更簡單的例子進行說明: 目錄結構簡化后是這樣的:
- <!doctype html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>Hello Sea.js</title>
- </head>
- <body>
- <div id="thediv">
- <p>hello world</p>
- </div>
- <script src="../javascript/sea.js"></script>
- <script>
- seajs.config({
- alias: {
- "jquery": "jquery-debug.js"
- }
- });
- seajs.use("../javascript/main");
- </script>
- </body>
- </html>
- seajs.use("../javascript/main");
- define(function (require, exports, module) {
- var module1 = require("./module1");
- alert(module1.add(1, 2));
- })
- define(function (require, exports, module) {
- exports.add = function (a, b) {
- return a + b;
- }
- var $ = require("jquery");
- $("#thediv").click(function () {
- alert("on click");
- });
- })
- define(function () {
- return {sayHello: function () {
- alert("hi there");
- }};
- });
與node module的比較
基本上是一致的,包括exports和module.exports的表現,還有require后立刻執行的行為,還有require的結果也同樣會被cache起來
集成jQuery的一個坑
我下載了官網的例子,然后只是稍微移動了文件的路徑,結果發現這行代碼:
- var $ = require("jquery");
seajs的設計思想是,路徑即ID。一般在調用define()方法時,如果只傳遞一個factory function,那么這個模塊就是個匿名模塊;或者傳遞define(module_id, dependency, factory),這個模塊就是個具名模塊
如果一個文件就是一個模塊,那么匿名模塊就可以了。但是在生產環境中,往往會把多個模塊放到一個文件里,但是路徑只有一個,如何知道要加載哪個 模塊呢?這時候就需要給其中一個模塊賦予module_id,和path保持一致,seajs就知道應該加載這個ID和path匹配的模塊了
如果具名模塊的id和require的path參數不匹配,就會返回null,這就是我出現這個錯誤的原因:
- var $ = require("jquery-debug");// path是"jquery-debug"
- define("jquery/jquery/1.10.1/jquery-debug", [], function () { return jQuery; } );// module_id是"jquery/jquery/1.10.1/jquery-debug"
把jQuery中的代碼改成:
- define("jquery-debug.js",[],function(){return jQuery});
- define(function(){return jQuery});