2017-06-10 2 views
2

J'essaie de comprendre le processus de la résolution du module en TypeScript.Phases de résolution et de génération de code TypeScript

Supposons que j'ai deux fichiers. A.ts et B.ts, et "A" importe "B".
Comment fonctionne la résolution du module? et quand ? (dans la phase du compilateur). Après l'analyse de chacun des fichiers, et la construction de deux AST. Quelle est la prochaine phase du compilateur?
Comment sait-il résoudre les variables (ou types) du fichier "B" dans le fichier "A"?
Je ai deux hypothèses:
1. il regarde la table de symboles du fichier "B", et faire la vérification de type.
2. fusionner les AST en un seul arbre? (de l'ensemble du programme)

Selon ces hypothèses, je suis également intéressant de savoir comment la génération de code affecté par cela.
1. Si la première hypothèse est correcte, la génération de code est plus compliquée. car vous devez générer le code JS en fonction de l'ordre des dépendances. (comment détecte-t-il les cycles d'importation? si A importe B et vice versa).
2. Si la deuxième hypothèse est correcte, il me semble que la génération de code sera plus facile à faire. mais je suppose qu'il faudra faire pour cela un "tri topologique" pour les modules, avant de générer le code.

Merci d'avance.

Répondre

3

TypeScript ne fusionne pas les fichiers ensemble; il génère des instructions import, des appels require ou des appels define en fonction de la valeur de la configuration "module" de votre système tsconfig. (Voir --module sur this page of the handbook) Pour cette raison, TypeScript n'a jamais besoin de s'inquiéter des dépendances circulaires ou de fusionner les AST.

Dans votre exemple, "A.ts" est compilé dans "A.js" et "B.ts" est compilé dans "B.js".

De plus, la génération de code de TypeScript n'utilise pas ou n'a pas besoin d'informations de type. Pour cette raison:

  • Il peut y avoir des centaines d'erreurs de type et le code sera toujours compilation identique à si les erreurs de type ont été éliminés
  • Vous pouvez compiler le code JavaScript plaine, par exemple, downleveling ES2015 à ES3.

La seule exception est const enum s étant donné que les valeurs énumérées sont incorporées dans le code à chaque fois qu'elles sont référencées. Cependant, comme les valeurs sont en ligne, l'ordre des modules n'est pas un problème.

+0

Merci pour votre commentaire! –