2017-06-29 1 views
6

Compte tenu du fichier tapuscrit suivant,Omettre "exiger" et "exportations" de tapuscrit émis AMD dépendances

export = {}; 

tsc (avec "module": "amd") émettra:

define(["require", "exports"], function (require, exports) { 
    "use strict"; 
    return {}; 
}); 

Cependant, je préférerais qu'il émettre

define([], function() { 
    "use strict"; 
    return {}; 
}); 

... et inclure seulement require ou exports si je les importer explicitement, à savoir

import relativeRequire = require("require"); 

Est-il possible de dire de ne pas émettre tapuscrit require et exports dans les modules émis AMD (à savoir demandez-lui pas pour utiliser le CommonJS simplified wrapping)?

Notes:

  • La sortie que je propose est totalement conforme à la AMD spec.
  • Un tableau de dépendances vides est le only way pour que le module ait zéro dépendances (par opposition à l'omission du tableau de dépendances, ce qui implique les dépendances require, exports et module).

Mise à jour 4 Juillet 2017 On dirait que c'est en fait une question ouverte dans le repo tapuscrit GitHub: https://github.com/Microsoft/TypeScript/issues/669

Toutes les idées pour une solution pragmatique jusqu'à ce soit mis en oeuvre? (Ou, y a-t-il réellement un moyen de faire du typage?)

Répondre

3

Je ne vois aucun avantage substantiel dans ce que vous essayez de faire. Quel que soit le temps d'exécution enregistré en supprimant les dépendances inutilisées, le temps d'exécution du reste de l'application sera réduit, pour toute application qui est plus qu'une application jouet. Les deux require et exports sont des modules virtuels qui coûtent très peu à instancier. (Par "virtuel", je veux dire qu'ils sont complètement internes au chargeur AMD que vous utilisez et n'impliquent aucune extraction depuis le réseau ou un fichier sur le disque.) Je vois issue 669 que vous mentionnez ouvert depuis septembre 2014 et réputé "accepté" depuis Avril 2015. Personne ne semble avoir tellement mal qu'ils se précipitent pour produire une demande de traction.

Je ne sais pas de quelle façon TypeScript fera ce que vous voulez hors de la boîte. J'ai récemment recherché comment TypeScript émet ses appels define parce que j'avais besoin d'ajouter le module virtuel nommé "module" à la liste des dépendances. (Si vous utilisez Angular, vous voulez utiliser module.id pour passer l'identifiant du module courant à Angular afin qu'il puisse résoudre des choses comme des chemins de modèles relatifs, etc. Vous pouvez utiliser module.id sans problème avec la sortie CommonJS mais avec la sortie AMD module n'est pas inclus par défaut dans la liste des dépendances.) J'ai travaillé autour du problème en écrivant une étape de construction qui modifie le code que tsc émet, après tsc l'a émis. Il utilise une expression rationnelle qui modifie la liste des dépendances pour ajouter "module" et modifie le rappel pour ajouter l'argument correspondant. Cela fonctionne pour moi parce que j'ajoute.Ce n'est pas une approche assez bonne pour ce que vous essayez de faire parce que vous voulez supprimer les dépendances, mais il peut y avoir des cas où les supprimer entraînerait un code invalide.

Pour une solution, vous pouvez utiliser Esprima pour examiner le code JavaScript généré par tsc et si les valeurs des modules "require" et "exports" ne sont pas utilisés par le code dans la fonction usine passée à define, puis retirez les modules inutilisés à partir de la liste des dépendances et des arguments correspondants de la liste d'arguments transmise à la fonction factory. Ce serait la solution la plus générale. (Entre autres, il serait compatible avec l'utilisation de l'appel asynchrone require que les chargeurs AMD mettent à disposition (sous la forme require([...], function (...) {})) dans la fonction usine.) Mais le codage de cette logique peut être tout aussi impliqué qu'il le serait pour produire une requête pull avoir tsc émettre le code que vous voulez en premier lieu.

+0

Je travaille avec une application assez volumineuse avec plusieurs milliers de modules AMD, dont environ 1300 sont chargés lors du démarrage de l'application - et doivent donc faire partie des actifs initialement fournis. J'ai déjà atteint la plupart des gains de performance en termes de temps de chargement, et la réduction de la taille des ressources (et peut-être l'élimination des modules virtuels inutiles) n'est qu'un autre élément de la longue liste des petites améliorations possibles. –

1

Exigent

Vous avez dit:

.. et ne comprennent besoin ou les exportations si je les importer explicitement, à savoir import relativeRequire = require("require");

Vous ne pouvez pas utiliser require à moins que son déjà . Donc c'est bien que c'est là.

Exportations

exports est nécessaire dès que vous exportez quelque chose. Si vous voulez avoir une exportation racine comme dans export = alors TypeScript le mappe à return. Mais avec export const foo = 123, il faudrait utiliser exports.

Il n'y a aucun mal à ce que ce soit là et tout impact sur les performances est vraiment minime.

+0

Ce projet n'utilise jamais 'exports' et n'utilise qu'occasionnellement' require'. Les modules sont exportés en utilisant 'return ThisClass;'. (Il utilise le chargeur de module Dojo, si cela est clair.) –