2012-03-19 24 views
8

Tôi muốn hiển thị Javascript API như một thư viện độc lập mà không gây ô nhiễm không gian tên chung của chúng. Tôi đã tạo ra các wrapper vì vậy tôi không gây ô nhiễm requireJS của riêng mình theo http://requirejs.org/docs/faq-advanced.html. Tôi đã đơn giản hóa những gì tôi có cho đến nay như dưới đây, nhưng tôi không chắc chắn nếu điều này là đúng cách hoặc nếu tôi nên làm điều đó một số cách khác.Cách chính xác để hiển thị mô-đun requireJS cho không gian tên chung là gì?

var MyApi = MyApi || {}; 
var MyApiRequireJS = (function() { 
    // require.js pasted here 
    return {requirejs: requirejs, require: require, define: define}; 
})(); 

(function(require, define, requirejs) { 
    require.config({ 
    baseUrl: 'js/scripts', 
    waitSeconds: 30, 
    }); 

    define('myapi', ['jquery', 'underscore'], 
    function($, _) { 
     $.noConflict(true); 
     _.noConflict(); 
     function api(method, args, callback) { 
     // do stuff here 
     } 
     return {api: api}; 
    } 
); 

    require(['myapi'], function(myapi) { 
    MyApi = myapi; 
    }); 
}(MyApiRequireJS.require, MyApiRequireJS.define, MyApiRequireJS.requirejs)); 

trang web sử dụng thư viện này sẽ bao gồm một thẻ script tham khảo đoạn code trên và sau đó gọi các api sử dụng

MyApi.api('some_remote_method', {foo: 'bar'}, function(result) { 
    // handle the result 
}); 
+0

Bạn có nói rằng bạn không muốn 'require' và' define' nằm trong không gian tên chung, nhưng bạn vui vì 'MyApi' và' MyApiRequireJS' nằm trong không gian tên chung? Tôi có thể hỏi tại sao? –

+0

Nhiều khả năng chúng có thể đang sử dụng 'require' và' define' hơn 'MyApi' trong không gian tên chung của chúng (' MyApi' không phải là var mà tôi sẽ sử dụng, chỉ cần sử dụng để đơn giản.) Tương tự facebook kết nối api chỉ gây ô nhiễm không gian tên toàn cầu với 'FB'. –

+0

Họ có sử dụng 'require' hoặc' define' không? Bạn có thể tìm ra? Nếu không, không có vấn đề gì. Nếu bạn không biết không gian tên toàn cầu của họ sử dụng, thì bạn không thể chắc chắn rằng bất kỳ hình cầu nào bạn xác định sẽ không được sử dụng. –

Trả lời

0

Tôi nghĩ rằng bạn đang cố gắng để dự đoán vấn đề của người khác bằng cách làm cho nó vấn đề của bạn, nhưng tôi không nghĩ bạn thực sự có thể làm điều đó một cách hợp lý. Trang mà bạn liên kết đến được thiết kế để cho phép những người đã có các hình cầu Javascript có tên "require" hoặc "define" đổi tên các globals RequireJS thành một cái gì đó khác. Nó không có ý định tạo ra hai cá thể RequireJS riêng biệt mà độc lập giải quyết các phụ thuộc.

Điều đó nói rằng, nếu bạn đang thực sự cố gắng giảm thiểu ô nhiễm không gian tên, thì bạn nên phơi bày chính xác một tên - MyApi. Viết một đóng con quái vật bao gồm bản sao riêng của RequireJS cũng như mã API của bạn, và nó chỉ trả về các phương thức bạn muốn hiển thị trên API của bạn.

Nó có thể thân thiện hơn/đơn giản hơn để phân phối API của bạn trong hai phiên bản, một phiên bản xác định mô-đun requireJS và mô-đun không có sự phụ thuộc requireJS.

Các vấn đề liên quan