2016-02-11 38 views
9

Mam problemy z poprawnym działaniem jQueryUI. Zanim spróbowałem dodać jQueryUI, samo działanie jQuery działało dobrze.Importowanie jqueryui za pomocą maszynopisu i RequireJS

Z poniższym kodem, aktualnie otrzymuję "TypeError: jQuery nie jest funkcją (...)" w chrome, co jest dziwne, biorąc pod uwagę, że jquery jest oznaczane jako zależność w pliku require.config.

Kompilacja z .ts do .js dzieje się bez błędów.

initApp.ts:

/// <reference path="../../../typings/jqueryui/jqueryui.d.ts"/> 
import * as jQuery from "jquery"; //Works completely fine 
import * as jQueryUI from "jquery-ui"; //Can't even find the module unless 
             //d.ts file is modified 

skompilowany js:

define(["require", "exports", "jquery-ui"], function (require, exports, jQuery) {...} 

jqueryui.d.ts:

/// <reference path="../jquery/jquery.d.ts"/> 
declare module JQueryUI { <unmodified code>} 

//Added this declare 

declare module "jquery-ui" { 
    export = jQuery; 
} 

Require.config.js:

require.config({ 
    baseUrl: "./components/", 
    paths: { 
     "jquery": "./javascripts/lib/jquery-2.1.4", 
     "jquery-ui": "./javascripts/lib/jquery-ui", 
     "go": "./javascripts/lib/go-debug" 
    }, 
    shim: { 
     "jquery": { 
      exports: "jQuery", 
     }, 
     "jquery-ui": { 
      //exports: "jQuery", //Adding this line doesn't fix the problem 
      deps: ["jquery"], 
     } 
    }, 
}); 
require(["./javascripts/initApp"]); 
Drzewo

katalog:

typings/ 
    jquery/ 
     jquery.d.ts 
    jqueryui/ 
     jqueryui.d.ts 
web/ 
    components/ 
     javascripts/ 
      lib/ 
       jquery-2.1.4.js 
       jquery-ui.js 
       require.js 
      initApp.js 
      initApp.ts 
      require.config.js 

Linki do pełnych plików d.ts:

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/jquery/index.d.ts https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/jqueryui/index.d.ts

Każda pomoc będzie mile widziana

+0

I usunęliśmy Rozwiązanie dodano do Twojego pytania. Ta praktyka redakcyjna strony jest taka, że ​​rozwiązania muszą być publikowane jako odpowiedzi, aby ludzie mogli głosować na rozwiązanie * niezależnie * od pytania. Więc powinieneś opublikować swoje rozwiązanie jako odpowiedź. Możesz wrócić do historii edycji pytania, znaleźć edycję, w której dodałeś rozwiązanie, kliknąć przycisk "źródło", skopiować źródło i wkleić je do formularza odpowiedzi. Powinien zająć 2 minuty maks. – Louis

Odpowiedz

2

Więc co się dzieje, że masz jQuery, które ma eksport, a jQueryUi, który importuje jQuery, powiększa go, a następnie eksportuje $.widget, a nie $.

To dlatego, jak myślę, że już wspomniano,

import * as jQuery from 'jquery-ui'; 

jest problematyczne.

Jak przejść na zauważyć,

import jQueryUi from 'jquery-ui'; 

nie działa, ponieważ jQueryUI nigdy nie jest używany w wartości pozycji i tak robi pomijana przez kompilator, który jest rzeczywiście bardzo przydatna, jeśli trudne, zachowanie, które może ułatwić wykonanie wielu asynchronicznych scenariuszy ładowania.

To, czego potrzebujesz, to sposób, aby powiedzieć TypeScript, aby wykonał import biblioteki, niezależnie od tego, czy jest on rzeczywiście używany, to znaczy, importujemy go dla efektu ubocznego.

szczęście maszynopis ma taką formę importu, które z kolei pochodzi z ECMAScript

import 'jquery-ui'; 

powinno załatwić sprawę, że nie powinien potrzebować podkładek dla jQuery w tych dniach (nie zacytować mi na to mój AMD jest zardzewiały).

Powinieneś potrzebować tylko następujących rzeczy.

import $ from 'jquery'; 
// typescript will not remove this as the point of this syntax is: import for mutations! 
import 'jquery-ui'; 

Nie ma potrzeby modyfikowania require.config(....), ale mogę być błędne odczytanie go.

Ponadto, należy zwrócić uwagę na jquery-ui declarations, co powinieneś zaktualizować (Twój link umarł z powodu pakietu restrukturyzacyjnego) nie zadeklarować eksportu i referencje jQuery jako globalnego który zasysa i bałagan wielu wersji .d.ts scenariusze, ale nie powinny powodować praktycznej różnicy w czasie wykonywania w Twojej sprawie.

+0

Kiedy próbuję 'import $ from 'jquery'' vs.' import * as $ from "jquery" ', pojawia się błąd, że' Jquery modułu nie ma domyślnego eksportu '. Czy jest tu jeszcze kawałek, którego tu brakuje? Czy muszę edytować mój import z https://www.npmjs.com/package/@types/jqueryui? – azulBonnet

+0

@azulBonnet musisz użyć '--allowSyntheticDefaultImports' w TypeScript. Jeśli to się nie powiedzie, użyj 'import $ = require ('jquery');' zamiast, ale nigdy _ever_ użyj 'import * jako $ z 'jquery';'. –

+0

Dziękuję @Aluan, ale wygląda na to, że nie mogę pracować. Za pomocą 'require' otrzymuję ostrzeżenie, że' require nie może być użyte podczas kierowania na ECMAScript6 lub wyższy'. Ale może moje 'tsconfig.json' jest jakaś zupełnie inna konfiguracja: ' { "compilerOptions": { "OUTDIR": "./wwwroot/build/" "noImplicitAny": false, "noEmitOnError" : true, "removeComments": false, "sourceMap": true, "target": "ES6" "moduł": "AMD", "moduleResolution": "węzeł", "allowSyntheticDefaultImports": true }, "wyklucz": [ "node_modules", "wwwroot" ] } ' – azulBonnet

0

Moje początkowe obejście było osadzone w treści mojego pytania. Przepisuję to jako odpowiedź na wytyczne redakcyjne StackOverflow.

Odpowiedź Aluana bezpośrednio odpowiada na niektóre pytania zadane w tym bloku.


mogę ręcznie naprawić błąd poprzez edycję skompilowany javascript, aby obejmować zarówno "jquery" i moduły "jquery-ui" i przypisywanie ich do zmiennych:

define(["require", "exports", "jquery", "jquery-ui"], function (require, exports, jQuery, jQueryUI) {...}

Jednak Chciałem kompilator maszynopisów, aby automatycznie to zrobić, lub coś podobnego do ustawienia zarówno jquery-ui jak i jquery jako zależności od mojego pliku.

TypeScript pobiera deklarowaną nazwę modułu i kompiluje ten ciąg w parametrach zależności funkcji AMD define(). Dlatego plik definicji ds.ts w TypeScript musi deklarować moduł przez ten sam ciąg znaków, który reprezentuje moją bibliotekę w require.config.js

Po prostu instrukcja import nie wyzwala żadnej akcji z kompilatora TypeScript. Niezależnie od zmiennej (foo, w tym przypadku) właściwości z modułu/biblioteki są importowane do należy wywołać co najmniej raz i nie mogą być w konflikcie z żadnymi istniejącymi zmiennymi w tym zakresie.

Wcześniej użyłem tej linii:

import * as jQuery from "jquery-ui"

ten zajmowany nazwę zmiennej „jQuery”, a więc funkcja jQuery nie był w stanie dłużej być przypisane do tej nazwy zmiennej, resulging w błąd: "jQuery nie jest funkcją (...)"

Ponieważ jquery-ui po prostu rozszerza bibliotekę jQuery, nigdy nie muszę jej wywoływać. Ale kompilator stał się dla mnie zbyt mądry i postanowił nie kompilować jquery-ui jako zależności w moim zdefiniu (...). To była łatwa naprawa, gdy tylko zdałem sobie sprawę z tego problemu.

kod końcowy


initApp.ts

/// <reference path="../../../typings/jqueryui/jqueryui.d.ts"/> 
import * as jQueryUI from "jquery-ui"; 
import uiVar from "./uiVariables"; 
jQueryUI 

skompilowany js:

define(["require", "exports", "jquery-ui"], function (require, exports, jQueryUI) {...}

require.config.js

require.config({ 
    baseUrl: "./components/", 
    paths: { 
     "jquery": "./javascripts/lib/jquery-2.1.4", 
     "jquery-ui": "./javascripts/lib/jquery-ui", 
     "go": "./javascripts/lib/go-debug" 
    } 
}); 
require(["./javascripts/app"]); 
+0

Czy próbowałeś 'importu 'jquery-ui';'? import nie zostanie usunięty przy użyciu formatu modułu "AMD" lub jakiegokolwiek innego formatu w tym zakresie. –

0

wyprodukowałem mały przykład na GitHub za korzystanie maszynopis 2 z ES 6 modułów i jQuery/jQuery UI z niestandardowych wtyczek, mam nadzieję, że to pomoże: https://github.com/lgrignon/typescript-es6-jquery

+0

Czy Babel musi używać Maszynopisów z JQuery i JQueryUI? – azulBonnet

+0

@azulBonnet nie, nie jest –