Fable: Suggestion d'architecture alternative

Créé le 20 nov. 2016  ·  10Commentaires  ·  Source: fable-compiler/Fable

Le projet est génial mais je vois actuellement un gâchis dans les configurations. Moi-même, je ne peux rien faire d'autre que d'exécuter quelques échantillons. Actuellement, j'ai besoin de Fable pour travailler pour un projet où j'ai ASP.NET + WebApi + IIS + EntityFramework. Cela implique beaucoup de dépendances d'assemblage.
J'ai essayé de tout garder dans un seul assemblage - le compilateur de fable se bloque ne pouvant pas transpiler le code qui ne devrait pas être transpilé.
J'avais essayé de déplacer le code de fable vers un assembly séparé dans l'espoir que fable respectera cela et ne transpilera que ces codes sans aucune dépendance. Le problème avec cela, c'est que je dois toujours garder la dépendance à l'égard d'un autre projet de la solution. Je soupçonne que l'option --refs peut aider, mais je ne parviens pas à la faire fonctionner.

Donc, comme je le vois, vous avez des problèmes avec la gestion des dépendances. Comme cela a toujours été un sujet difficile, nous devons le prendre très au sérieux. Je ne crois pas que des trucs comme l'option --refs soient assez fiables même si je le fais fonctionner. Dans les applications réelles où vous avez de nombreuses dépendances, les gérer toutes peut être un cauchemar.
J'ai déjà eu des problèmes similaires avec la bibliothèque TypeLite pour la génération d'interfaces Typescript à partir de l'assemblage.

Je suggère une approche alternative. Et si au lieu de la ligne de commande, nous utilisions VisualStudio. Je veux dire que nous mettons tout le code dont nous avons besoin pour transpiler dans un assembly séparé, mais exigeons qu'il s'agisse d'un fichier exe appelant le compilateur fable en interne.
De cette façon, nous utilisons l'infrastructure VS pour la gestion des dépendances. Je comprends que cela semble un peu gênant et peut ne pas être multiplateforme, etc., mais cela pourrait quand même être une solution.
BTW, je n'ai pas réussi à construire le compilateur avec des tests aussi. Donc, mes spéculations sont assez brutes. S'il vous plaît laissez-moi savoir où je me trompe.

Commentaire le plus utile

@Krzysztof-Cieslak , ha-ha-ha, je suis développeur .Net à temps plein d'applications Web d'entreprise. Donc, ma vision est un peu différente.

Tous les 10 commentaires

Cela va être difficile car je travaille sur Mac avec Visual Studio Code, donc je n'ai absolument aucune idée de comment fonctionnerait cette infrastructure VS pour la gestion des dépendances :wink: Fable ne peut pas compiler un projet s'il ne sait pas comment résoudre les appels, ceci est destiné car vous ne voulez pas que les appels échouent au moment de l'exécution dans JS.

Mon conseil serait de créer un projet distinct dans votre solution qui ne contient que le code censé être compilé en JS. Cela peut inclure des fichiers partagés avec votre projet de serveur (par exemple des types définissant votre modèle de domaine, etc.) mais ne devrait pas avoir de dépendance d'assemblys pour le serveur (ASP.NET, WebAPI, Entity Framework...).

BTW, la façon de compiler plusieurs projets et références change dans 0.7. Vous pouvez voir quelques instructions préliminaires dans #522.

De cette façon, nous utilisons l'infrastructure VS pour la gestion des dépendances. Je comprends que cela semble un peu gênant et peut ne pas être multiplateforme, etc., mais cela pourrait quand même être une solution.

Créer un couplage étroit avec un [mauvais] éditeur particulier et un [mauvais] système d'exploitation particulier n'est une solution à rien. Une telle réflexion est une des raisons pour lesquelles nous sommes en place, nous sommes [.Net est mort. ]

@alfonsogarciacaro , merci pour les conseils, je pense que ça va marcher.

@Krzysztof-Cieslak , ha-ha-ha, je suis développeur .Net à temps plein d'applications Web d'entreprise. Donc, ma vision est un peu différente.

@alehro En effet, c'est comme l' a dit FeathersJs avec Fable actuellement uniquement pour le frontend et cela ressemble presque aux applications précédentes avec suave et aussi asp.net core .

Clôturant le problème, n'hésitez pas à le rouvrir si vous avez d'autres questions.

Je pense que @alehro a soulevé un sujet absolument raisonnable.
Ce serait extrêmement bien d'avoir un seul fsproj pour le front-end et le back-end ASP.NET Core.
Peut-être que cela peut être fait avec une compilation conditionnelle, n'est-ce pas ?

Merci de ne pas mélanger le code frontend et backend...

Par exemple, si vous utilisez Elmish, quelle partie du code voulez-vous mixer ? Les genres ? Pourquoi la vue et le serveur auraient-ils besoin des mêmes types ? Probablement juste pour la partie interface oui, donc une bibliothèque de classes commune ferait le travail.

En outre, vous pouvez avoir une communication facile entre le serveur et le client. Voir cet article

Je n'utilise pas Elmish car cela ne me semble pas expressif. Je ferais mieux d'utiliser XAML + C# et de les transformer en HTML + JavaScript car je les connais mieux et je peux les visualiser dans le concepteur.

Pourquoi la vue et le serveur auraient-ils besoin des mêmes types ?

Oui.

Probablement juste pour la partie interface oui, donc une bibliothèque de classes commune ferait le travail.

C'est possible mais pourquoi suis-je limité à tout composer en un seul projet ?

En outre, vous pouvez avoir une communication facile entre le serveur et le client. Voir cet article

Suave est trop lent et avoir un routage en un seul endroit n'est pas pratique. De plus, il ne prend pas en charge quelque chose comme ASP.NET API Versioning .

Fable n'est lié à aucune bibliothèque spécifique comme Suave ou Elmish, vous pouvez utiliser tout ce qui correspond le mieux à vos besoins :smile: Côté serveur, vous pouvez utiliser n'importe quel langage de programmation d'ailleurs. Le principal avantage de l'utilisation de F# à la fois à l'arrière et à l'avant est que vous pouvez partager des types et que vous disposez également d'outils pour faciliter la communication, comme Fable.JsonConverter ou Fable.Remote.

Cependant, permettre de tout mettre dans le même projet est compliqué, je recommande donc d'utiliser différents projets. Pour les types partagés, vous pouvez utiliser un projet partagé comme le suggère @MangelMaxime , ou simplement inclure une référence au fichier contenant les types partagés dans votre projet frontal.

Cette page vous a été utile?
0 / 5 - 0 notes