tôi đã tìm ra câu trả lời cho câu hỏi của tôi, và các giải pháp (họ không giống nhau rõ ràng). Tôi đoán tôi sẽ đăng nó ở đây trong trường hợp nó có thể giúp đỡ người khác trong tương lai.
Về cơ bản những gì tôi muốn là tải khung của tôi trong bối cảnh riêng của mình. Tôi đã tìm thấy tùy chọn ngữ cảnh theo số configuration section trên trang web của yêu cầu và example of how to use it. Ban đầu tôi đã thử điều này bằng cách thực hiện một số việc như:
var req = require.config({
baseUrl: 'framework',
context: 'framework',
paths: {
jQuery: 'lib/jquery/jquery-1.7.min.js',
Underscore: 'lib/underscore/underscore.min.js',
Backbone: 'lib/backbone/backbone.min.js',
etc...
}
});
req(['main'], function() {});
Có hai vấn đề với điều này. Đầu tiên, biến 'req' của tôi đã được định nghĩa bên ngoài khung công tác, nhưng tôi muốn khung công tác định nghĩa các đường dẫn riêng của nó. Và thứ hai, bất cứ khi nào một tệp bên ngoài khung công tác sẽ yêu cầu một tệp trong khung công tác, điều này sẽ yêu cầu 'jQuery', ví dụ, sau đó jQuery (hoặc bất kỳ thứ gì khác) sẽ không được yêu cầu từ bên trong ngữ cảnh của cá thể khung công tác yêu cầu và do đó không thể tìm thấy tệp.
Những gì tôi đã kết thúc làm được xác định main.js khuôn khổ của tôi để tìm một cái gì đó như thế này:
var paths = {
jQuery: 'lib/jquery/jquery-1.7.min.js',
Underscore: 'lib/underscore/underscore.min.js',
Backbone: 'lib/backbone/backbone.min.js',
etc...
};
define(function() {
var exports = {};
exports.initialize = function(baseUrl, overridePaths, callback) {
if(!overridePaths) {
overridePaths = {};
}
if(baseUrl && baseUrl[baseUrl.length - 1] != '/') {
baseUrl = baseUrl + '/';
}
var fullpaths = {};
for(var path in paths) {
// Don't add baseUrl to anything that looks like a full URL like 'http://...' or anything that begins with a forward slash
if(paths[path].match(/^(?:.*:\/\/|\/)/)) {
fullpaths[path] = paths[path];
}
else {
fullpaths[path] = baseUrl + paths[path];
}
}
var config = {paths: fullpaths};
for(var pathName in overridePaths) {
config.paths[pathName] = overridePaths[pathName];
}
require.config(config);
// Do anything else you need to do such as defining more functions for exports
if(callback) {
callback();
}
}
return exports;
});
Và sau đó trong main.js của dự án của tôi tập Tôi chỉ làm điều này:
require(['framework/main'], function(framework) {
// NOTE: This setTimeout() call is used because, for whatever reason, if you make
// a 'require' call in here or in the framework without it, it will just hang
// and never actually go fetch the files in the browser. There's probably a
// better way to handle this, but I don't know what it is.
setTimeout(function() {
framework.initialize('framework', null, function() {
// Do stuff here
}
}, 0);
});
Điều này nhận bất cứ điều gì được truyền vào phương thức initialize() của khung công tác cho 'baseURL' và thêm vào bất kỳ đường dẫn nào mà khung công tác định nghĩa không bắt đầu bằng dấu gạch chéo hoặc 'bất cứ điều gì: //', trừ khi chúng ghi đè đường dẫn. Điều này cho phép các gói bằng cách sử dụng khuôn khổ để ghi đè lên những thứ như 'jQuery'.
Điều này vẫn cho phép gói để thực hiện cuộc gọi riêng biệt của nó tới require.config() và xác định danh sách riêng biệt của bí danh đường dẫn, miễn là các tệp tham chiếu bí danh bắt đầu bằng './'? Tôi không muốn phải sử dụng đường dẫn tương đối đầy đủ cho tất cả các tệp, mỗi khi tôi tham chiếu chúng với một hàm define(). Tôi đã kể từ khi tái cấu trúc toàn bộ dự án, nhưng tôi vẫn tò mò. –
Tôi biết câu trả lời này là một chút ngày, nhưng gần đây, bạn có thể sử dụng một cách an toàn đường dẫn tương đối để yêu cầu các mô-đun ngay cả khi không có gói. – hayavuk
Để tham khảo: http://requirejs.org/docs/api.html#packages – Skarllot