2012-04-25 35 views
7

Đầu tiên một chút về lịch sử, chúng tôi có một công cụ được tạo thành từ nhiều tệp javascript về cơ bản là các mô-đun. Các mô-đun này trả về một lớp duy nhất được gán cho phạm vi toàn cục, mặc dù trong một không gian tên được chỉ định.Làm cách nào để mô-đun Javascript được xác định với AMD được mở rộng?

Bản thân động cơ được sử dụng để hiển thị nội dung eLearning, với mỗi khóa học eLearning khác nhau đòi hỏi nhu cầu hơi khác nhau, đó là nơi chúng tôi đưa tệp javascript vào trang dựa trên chức năng cần thiết. (Chỉ có một trang mục nhập).

Tôi đã cố gắng cân nhắc nếu nó có giá trị thay đổi đối với AMD, require.js và r.js hoặc nếu tốt hơn nên ở lại với hệ thống hiện tại của chúng tôi bao gồm mọi thứ cần thiết trên trang và thu nhỏ nó thành một tập lệnh.

Một trong những vấn đề lớn nhất của tôi khi đi đến AMD sẽ khiến việc mở rộng lớp học trở nên khó khăn hơn. Ví dụ, đôi khi chúng ta phải điều chỉnh hành vi của lớp gốc một chút. Vì vậy, chúng tôi thêm một tập lệnh khác bao gồm trên trang mở rộng lớp gốc bằng cách sao chép nguyên mẫu ban đầu, thực thi chức năng ban đầu bị ghi đè khi áp dụng và sau đó thực hiện bất kỳ mã bổ sung nào là bắt buộc.

Bạn có thể mở rộng mô-đun AMD mà không cần điều chỉnh tệp gốc không? Hay tôi đang thiếu điểm và chúng tôi đang ở lại tốt nhất với những gì chúng tôi đang làm vào lúc này?

Trả lời

6

Gần đây tôi đã bắt đầu một dự án sử dụng RequireJS, và các phương pháp tôi sử dụng để mở rộng gạch sôi xuống một cái gì đó như thế này:

liên quan cấu trúc thư mục:

  • /script
  • /scripts/underscore.js
  • /scripts/base/underscore.js

Thư viện gạch dưới thực sự đi tới /scripts/base/underscore.js.

Tiện ích mở rộng của tôi đi theo số /scripts/underscore.js.

Các mã trong /scripts/underscore.js trông như thế này:

define(['./base/underscore'], function (_) { 
    'use strict'; 

    var exports = {}; 

    // add new underscore methods to exports 

    _.mixin(exports); // underscore's method for adding methods to itself 

    return _; // return the same object as returned from the underscore module 
}); 

Đối với một phần mở rộng bình thường, nó có thể trông như thế này:

define(['underscore', './base/SomeClass'], function (_, SomeClass) { 
    'use strict'; 

    _.extend(SomeClass.prototype, { 
     someMethod: function (someValue) { 
      return this.somethingOrOther(someValue * 5); 
     } 
    }); 

    return SomeClass; 
}); 

Lưu ý về dấu gạch dưới: Ở những nơi khác Tôi đã sử dụng hàm shim-config của RequireJS để lấy dấu gạch dưới để tải dưới dạng mô-đun AMD, nhưng điều đó sẽ không ảnh hưởng đến quá trình này với các mô-đun AMD không bị hỏng.

0

Bạn có thể có các mô-đun chứa hàm hàm dựng của mình. khi các mô-đun này được đưa vào, chúng sẵn sàng để sử dụng. sau đó bạn có thể tạo ra các đối tượng ra khỏi chúng sau đó.

dụ như trong yêu cầu:

//construction.js 
define(function(){ 

    //expose a constructor function 
    return function(){ 
     this.... 
    } 
}); 

//then in foo.js 
define([construction],function(Construction){ 
    var newObj = new Construction; //one object using constructor 
}); 

//then in bar.js 
define([construction],function(Construction){ 

    //play with Construction's prototype here then use it 

    var newObj = new Construction; 
}); 
+0

Xin chào Joseph, cảm ơn phản hồi của bạn nhưng đó không phải là câu hỏi tôi đã hỏi. Bạn đang tạo các phiên bản của hàm tạo ban đầu.Tôi muốn có một định nghĩa của nói 'động cơ', được sử dụng trong một định nghĩa cho một mục khác, hãy nói 'contentScreen'. Tuy nhiên, giữa định nghĩa về 'engine' và việc tạo ra 'contentScreen' tôi muốn mở rộng 'engine' một chút. –

+0

@John_ ý bạn là gì khi "mở rộng một chút"? xây dựng một constructor sửa đổi và sau đó sử dụng constructor đã sửa đổi đó? [điều này có thể giúp] (http://stackoverflow.com/a/10101604/575527) – Joseph

+0

Về cơ bản có, tôi không muốn tạo một lớp mới mở rộng bản gốc, tôi thực sự muốn mở rộng bản gốc và sử dụng nó, bởi vì theo như mọi thứ khác thì nó vẫn là cùng một lớp. Theo như tôi có thể nói tôi không thể làm điều đó với AMD? –

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