2013-05-09 30 views
6

Mam page-a.ts które skompilować do page-a.js:maszynopis: Moduł import tylko sprawozdania

alert('this is from page-a'); 

i mam main.ts który kompiluje się main.js:

import pageA = module('page-a') 
alert('this is from main'); 

I to jest dla mnie rozkazem tsc linia:

tsc --module amd page-a.ts main.ts 

i używam requirejs tak:

<script src="require.js" data-main="main.js"></script> 

nie widzę alertu messagebox z page-a podczas ładowania strony. W wygenerowanych skryptach main.js nie ma nic o page-a.

Moje pytanie brzmi: dlaczego tak się dzieje? A jak wymusić maszynopis do importu modułu, który nie jest jawnie używany przez kod?

+0

Przyjmuję tę odpowiedź, ponieważ jest to właściwa odpowiedź na moje pytanie. Ale użyłem innego podejścia do rozwiązania mojego problemu, który możesz zobaczyć tutaj: https://typescript.codeplex.com/discussions/443144 – deerchao

Odpowiedz

3

Wygenerowany js nie importuje modułu, który nie jest jawnie użyty w kodzie. Maszynopis jest w ten sposób sprytny i nie generuje żadnych js dla modułu, który jest tylko importowany i nieużywany.

Musisz:

  • eksport zmienną w pierwszym module I
  • import pierwszy moduł w drugim module, a
  • użyć zmiennej wywożone w drugim module

, a więc page-a.js coś takiego:

export var x = 123; // just to export something that you can use 
alert('this is from page-a'); 

i main.ts jako:

import pageA = module('page-a') 
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a 
alert('this is from main'); 
+0

Dzięki, twoja sztuczka działa. Poczekam trochę czasu, aby sprawdzić, czy jest jakieś lepsze rozwiązanie, zanim przyjmiesz odpowiedź. – deerchao

+1

To nie jest sztuczka :) requirejs "wymaga" modułów, które mają być zawarte w blokach define ([],() => {}). –

+0

TypeSript wygeneruje go tylko wtedy, gdy jest coś do eksportu w pliku. –

11

Istnieją dwa inne sposoby, oprócz jednego wymienionego z @basarat do zapewnienia, iż moduł jest zawarte w funkcji określić, a tym samym obciążeniu.

Dołącz element amd-dependency na górze pliku TypeScript.

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/> 

lub

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension"); 
moduleName; //Does not require declaring a new variable. 

Były to chyba jeden z najmniej ryzyko wystąpienia skutków ubocznych. Niestety element i jego użycie nie są dobrze udokumentowane.

Znalazłem te metody niezbędne podczas korzystania z leniwego ładowania modułów AngularJS, które tworzą i rejestrują typy w zależności od wstrzykniętej zależności. Ponieważ typ nie jest nigdy tworzony ani przypisywany w odniesieniu do kompilatora TS, nie tworzy on niezbędnego parametru dla funkcji define.

Mówią, że jest to zgodne z projektem (https://typescript.codeplex.com/workitem/2436), ale z szacunkiem się nie zgadzam.Jeśli zaimportowałem moduł/plik i mam odniesienie do konkretnego typu w tym module, to ten moduł musi zostać załadowany w tym momencie, aby działać. Wykonanie dodatkowych czynności jest zbędne.

0

wiem, że jestem późno, ale tu jest inna droga do osiągnięcia tego celu:
Można powiedzieć, maszynopis zaimportować moduł tylko dla efektów ubocznych za pomocą:
import "path/to/external/module";
Choć jest ES6 składnia maszynopis przekształci to do AMD require(), gdy przechodzisz - moduł amd do tsc, a ponieważ jest on importowany tylko dla efektów ubocznych, nie zostanie zrzucony.

Powiązane problemy