Ładowanie Highcharts poprzez shim przy użyciu RequireJS i utrzymywanie zależności jQuery

Próbuję załadować bibliotekę Highcharts przy użyciu shim w RequireJS. Jednak po załadowaniu Highcharts generuje wyjątek, ponieważ nie może uzyskać dostępu do metod jQuery, od których zależy.

Wymagany config wygląda tak:

require.config({
    baseUrl: "js",

    shim: {

        'libs/highcharts/highcharts.src.js': {
            deps: ['jquery'],
            exports: function(jQuery)
            {
                this.HighchartsAdapter = jQuery;

                return this.Highcharts;
            }
        }
    }
});

Wyjątkiem jest:

Uncaught TypeError: undefined is not a function

i dotyczy tej linii:

dataLabels: merge(defaultLabelOptions, {

Problemem jestmerge wywołanie, które ostatecznie odwzorowuje się z powrotem na jQuery (lub inny adapter obsługiwany przez Highcharts; ale używam tylko jQuery).

Nie jestem pewien, jak dokładnie upewnić się, że Highcharts uzyska dostęp do jQuery za pomocą RequireJS i shim.

Czy ktoś wcześniej korzystał z RequireJS i Highcharts? Wydaje mi się, że problem nie jest specyficzny dla highchartów, ale dla każdej biblioteki, która ma inne rodzaje zależności.

Z góry dziękuję za każdą radę lub wskazówkę we właściwym kierunku!

Aby dodać dalszy kontekst, w nadziei, że ktoś, kto jest zaznajomiony z require.js lub shims, będzie w stanie pomóc bez konieczności bycia zbyt dobrze zaznajomionym z highchartami, oto kilka źródeł, które to ustawiająmerge metoda w 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}
}

Thewin obiekt jest zestawem referencyjnym dowindow na początku skryptu. Więc pomyślałem, że dodaniewindow.jQuery = jQuery; do metody eksportowania na podkładce spowodowałoby, że tabele wyszukiwały referencje jQuery; ale tak nie było.

Ponownie, każdy wgląd, informacje, porady lub heckles byłyby mile widziane w tym momencie - jestem całkowicie kompletny i zaczynam kwestionować, czy próba implementacji i systemu pakietów AMD w przeglądarce javascript jest nawet tego warta.

Po zaakceptowaniu odpowiedzi zpabera poniżej pomyślałem, że należy zaktualizować moje pytanie, aby odzwierciedlić, w jaki sposób jego odpowiedź pomogła mojemu rozwiązaniu (chociaż jest to zasadniczo jego odpowiedź).

RequireJS używa „ścieżek” do znajdowania bibliotek, które nie są obsługiwane przez „AMD” i ładuje je na Twoją stronę. obiekt „shim” pozwala zdefiniować zależności dla bibliotek zdefiniowanych w ścieżkach. Zależności muszą zostać załadowane, zanim requirejs spróbuje załadować skrypt zależny.

Właściwość exports zapewnia mechanizm do informowania requirejs, jak określić, czy biblioteka jest załadowana. Dla podstawowych bibliotek, takich jak jquery, backbone, socketio itp., Wszystkie eksportują zmienną poziomu okna (Backbone, io, jQuery i$itp.) Po prostu podajesz tę nazwę zmiennej jakoexports property, i requirejs będą w stanie określić, kiedy lib jest ładowany.

Po zakończeniu definiowania możesz użyćrequirejs' define działają zgodnie z oczekiwaniami.

Oto mój przykładrequire.config obiekt:

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'
        }
    }
});

Tak jakpabera wspomniałem wcześniej, to jest dlaRequire.JS wersja2.0.1.

Mam nadzieję, że ktoś skorzysta z tego; Wiem, że droga zablokowała mnie na chwilę; więc miejmy nadzieję, że powstrzymaliśmy cię przed uderzeniem głową w to samo miejsce w ścianie, które zrobiliśmy, publikując to.

questionAnswers(2)

yourAnswerToTheQuestion