3 votes

Suppression des JavaScript et CSS génériques de Tapestry

J'ai créé un nouveau projet Tapestry 5.3 en utilisant Maven. J'ai remarqué que Tapestry ajoute des tonnes de fichiers JS et CSS différents à toutes les pages :

<link type="text/css" rel="stylesheet" href="stackoverflow.com/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/default.css"/>
<link type="text/css" rel="stylesheet" href="stackoverflow.com/tutorial1/assets/1.0-SNAPSHOT-DEV/ctx/layout/layout.css"/>
<link type="text/css" rel="stylesheet" href="stackoverflow.com/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tapestry-console.css"/>
<link type="text/css" rel="stylesheet" href="stackoverflow.com/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/t5-alerts.css"/>
<link type="text/css" rel="stylesheet" href="stackoverflow.com/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tree.css"/>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/underscore_1_3_3.js" type="text/javascript"></script>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/scriptaculous_1_9_0/prototype.js" type="text/javascript"></script>

Et beaucoup, BEAUCOUP plus...

Ces éléments sont-ils nécessaires au bon fonctionnement de mon site ? Si non, comment puis-je les supprimer ? Je suis assez à l'aise pour écrire moi-même des JS et je n'ai pas besoin que Tapestry ajoute quoi que ce soit pour moi.

5voto

xl0e Points 286

C'est drôle : Tapestry fournit une fonctionnalité très riche pour remplacer le comportement du service par défaut, mais pas dans ce cas. Le principal coupable, JavaScriptSupport, est créé à la volée et ne peut pas être décoré.

MarkupRendererFilter javaScriptSupport = new MarkupRendererFilter() {
        public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) {
            DocumentLinker linker = environment.peekRequired(DocumentLinker.class);
            //Surprise!;) 
            JavaScriptSupportImpl support = new JavaScriptSupportImpl(linker, javascriptStackSource, javascriptStackPathConstructor);
            environment.push(JavaScriptSupport.class, support);
            renderer.renderMarkup(writer);
            environment.pop(JavaScriptSupport.class);
            support.commit();
        }
    };

La seule solution est donc de corriger les sources (comme nous l'avons fait plusieurs fois), ou d'essayer de remplacer la source javascriptStackSource qui est paramétrée dans JavaScriptSupportImpl :

Votre AppModule.java

@Decorate(serviceInterface = JavaScriptStackSource.class)
public JavaScriptStackSource decorateJavaScriptStackSource(JavaScriptStackSource original) {
    return new MyJavaScriptStackSource(original);
}

MyJavaScriptStackSource.java

public class MyJavaScriptStackSource implements JavaScriptStackSource {
// This bunch of stacks comes from got5
private Set<String> SKIP = new HashSet<String>(Arrays.asList("Slider", "AjaxUploadStack", "DataTableStack", "FormFragmentSupportStack", "FormSupportStack",
        "SuperfishStack", "JQueryDateFieldStack", "GalleryStack"));

private class JavaScriptStackWraper implements JavaScriptStack {
    private final JavaScriptStack original;

    JavaScriptStackWraper(JavaScriptStack original) {
        if (original != null) {
            System.out.println("Wrap " + original.getClass().getName());
        }
        this.original = original;
    }

    @Override
    public List<String> getStacks() {
        return original != null ? original.getStacks() : Collections.<String>emptyList();
    }

    @Override
    public List<Asset> getJavaScriptLibraries() {
        return original != null ? original.getJavaScriptLibraries() : Collections.<Asset>emptyList();
    }

    // Always return empty list
    @Override
    public List<StylesheetLink> getStylesheets() {
        return Collections.<StylesheetLink>emptyList();
    }

    @Override
    public String getInitialization() {
        return original != null ? original.getInitialization() : null;
    }
}

private final JavaScriptStackSource original;

public MyJavaScriptStackSource(JavaScriptStackSource original) {
    this.original = original;
}

@Override
public JavaScriptStack getStack(String name) {
    JavaScriptStack stack = original.getStack(name);
    if (!SKIP.contains(stack.getClass().getSimpleName())) {
        return new JavaScriptStackWraper(stack);
    }
    return new JavaScriptStackWraper(null);
}

@Override
public List<String> getStackNames() {
    return original.getStackNames();
}

}

C'est un gros morceau de code merdique mais ça marche J'aimerais avoir plus de contrôle sur ce qui s'affiche dans mes pages dans Tapestry.

1voto

Une partie de l'avantage de Tapestry est le nombre de composants qui fournissent des comportements DHTML et Ajax sans avoir à écrire de JavaScript, mais simplement à configurer les composants.

Il est possible de désactiver cette fonction, mais cela signifie que de nombreux composants que vous aimeriez utiliser, tels que Zone, ne fonctionneront pas. De même, toute validation des entrées côté client sera supprimée. J'ai des clients qui l'ont fait, mais ce n'est pas une mince affaire.

En fait, vous pouvez remplacer la pile JavaScript "de base" de Tapestry. Il n'y a pas de FAQ pour cela, car la question n'est pas fréquemment posée. Ce n'est pas non plus pour un débutant absolu, mais plutôt pour un compagnon (il est relativement facile de remplacer des choses dans Tapestry grâce à son conteneur d'inversion de contrôle, mais savoir QUOI remplacer est plus délicat).

Quoi qu'il en soit, Tapestry 5.4 est en bonne voie et modifie le JavaScript de Tapestry pour le rendre beaucoup plus léger et modulaire, tout en vous laissant le choix entre Prototype (surtout pour des raisons de compatibilité avec les projets Tapestry existants) et jQuery. Toutefois, même dans ce cas, une certaine quantité de JavaScript sera intégrée au framework.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X