Tôi đang cố gắng tải thư viện Highcharts bằng cách sử dụng một shim trong RequireJS. Tuy nhiên, khi Highcharts tải, nó ném một ngoại lệ vì nó không thể truy cập các phương thức jQuery mà nó phụ thuộc vào.Đang tải Highcharts qua shim bằng cách sử dụng RequireJS và duy trì phụ thuộc jQuery
Các yêu cầu cấu hình trông giống như vậy:
require.config({
baseUrl: "js",
shim: {
'libs/highcharts/highcharts.src.js': {
deps: ['jquery'],
exports: function(jQuery)
{
this.HighchartsAdapter = jQuery;
return this.Highcharts;
}
}
}
});
Trường hợp ngoại lệ được ném là:
Uncaught TypeError: undefined is not a function
và là liên quan đến dòng này:
dataLabels: merge(defaultLabelOptions, {
Vấn đề là cuộc gọi merge
, cuối cùng sẽ tự ánh xạ trở lại jQuery (hoặc một số bộ điều hợp khác mà Highch hỗ trợ nghệ thuật; nhưng tôi chỉ sử dụng jQuery).
Tôi không chắc chắn chính xác cách đảm bảo Highcharts được truy cập vào jQuery bằng cách sử dụng RequireJS và shim.
Có ai đã sử dụng RequireJS và Highcharts cùng nhau trước đây không? Tôi đoán vấn đề không cụ thể đối với highcharts, nhưng bất kỳ thư viện nào có các loại phụ thuộc khác.
Cảm ơn trước cho bất kỳ lời khuyên hoặc điểm nào về đúng hướng!
Để thêm bối cảnh hơn nữa, với hy vọng rằng một người quen thuộc với require.js hoặc miếng chêm sẽ có thể giúp đỡ mà không cần phải quá quen thuộc với highcharts, đây là một số nguồn mà thiết lập phương pháp merge
này trong Highcharts
var globalAdapter = win.HighchartsAdapter,
adapter = globalAdapter || {},
// Utility functions. If the HighchartsAdapter is not defined,
// adapter is an empty object
// and all the utility functions will be null. In that case they are
// populated by the
// default adapters below.
// {snipped code}
merge = adapter.merge
// {snipped code}
if (!globalAdapter && win.jQuery) {
var jQ = win.jQuery;
// {snipped code}
merge = function() {
var args = arguments;
return jQ.extend(true, null, args[0], args[1], args[2], args[3]);
};
// {snipped code}
}
Đối tượng win
là một tài liệu tham khảo thiết lập để window
vào đầu của kịch bản. Vì vậy, tôi nghĩ rằng việc thêm window.jQuery = jQuery;
vào phương thức xuất trên shim sẽ dẫn đến highcharts chọn tham chiếu jQuery; nhưng không.
Một lần nữa, bất kỳ thông tin chi tiết, thông tin, lời khuyên hoặc heckles nào sẽ được đánh giá cao tại thời điểm này - tôi mất hoàn toàn và bắt đầu đặt câu hỏi liệu có cố gắng triển khai và hệ thống gói AMD trong javascript của trình duyệt hay không.
Sau khi chấp nhận câu trả lời từ pabera dưới đây, tôi nghĩ rằng nó thích hợp để cập nhật câu hỏi của tôi để phản ánh như thế nào câu trả lời của ông đã giúp tôi giải pháp (mặc dù, đó là về cơ bản câu trả lời của mình).
RequireJS sử dụng "đường dẫn" để tìm các thư viện không phải là "AMD" được hỗ trợ và tải chúng trên trang của bạn. đối tượng "shim" cho phép bạn định nghĩa các phụ thuộc cho các thư viện được định nghĩa trong đường dẫn. Các phụ thuộc phải được nạp trước khi requirejs sẽ cố gắng tải tập lệnh phụ thuộc.
Thuộc tính xuất khẩu cung cấp cơ chế để yêu cầu requirejs cách xác định xem thư viện có được tải hay không. Đối với các libs lõi như jquery, backbone, socketio, vv, tất cả chúng đều xuất một số biến mức cửa sổ (Backbone
, io
, jQuery
và $
, v.v ...). Bạn chỉ cần cung cấp tên biến đó làm thuộc tính exports
và requirejs sẽ có thể xác định thời điểm tải lib.
Khi định nghĩa của bạn được thực hiện, bạn có thể sử dụng chức năng requirejs
'define
như mong đợi.
Dưới đây là ví dụ của tôi require.config
đối tượng:
require.config({
baseUrl: "/js/",
paths: {
jquery: 'jquery',
socketio: 'http://localhost:8000/socket.io/socket.io', //for loading the socket.io client library
highcharts: 'libs/highcharts/highcharts.src',
underscore: 'libs/underscore',
backbone: 'libs/backbone'
},
shim: {
jquery: {
exports: 'jQuery'
},
socketio: {
exports: 'io'
},
underscore: {
exports: '_'
},
backbone: {
deps: ['jquery', 'underscore'],
exports: 'Backbone'
},
highcharts: {
deps: ['jquery'],
exports: 'Highcharts'
}
}
});
Như pabera đề cập trước đây, điều này là dành cho phiên bản Require.JS
2.0.1
.
Tôi hy vọng một người nào đó sẽ được sử dụng trong số này; Tôi biết đường đã chặn tôi một lúc; vì vậy hy vọng chúng tôi giữ cho bạn khỏi đập đầu của bạn vào cùng một vị trí trong bức tường mà chúng tôi đã làm, bằng cách đăng này.
Tôi sẽ cung cấp cho một shot và xem những gì tôi đưa ra; Cảm ơn vì sự trả lời! –
Tôi sử dụng 'require.js 2.0.1', chỉ trong trường hợp nó quan trọng. Chúc may mắn – pabera
Tôi đã thay đổi để sử dụng require.js bình thường (thay vì w/jquery) và sử dụng shim jquery, với lời giải thích/ví dụ về đường dẫn/miếng chêm của bạn. sau khi đọc tài liệu một số chi tiết, bây giờ tôi hiểu những gì đang xảy ra - cảm ơn một tấn! –