3

Maven を使用して新しい Tapestry 5.3 プロジェクトを作成しました。Tapestry がすべてのページに大量の異なる JS および CSS ファイルを追加していることに気付きました。

<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/default.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/ctx/layout/layout.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tapestry-console.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/t5-alerts.css"/>
<link type="text/css" rel="stylesheet" href="/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>

そして、もっとたくさん...

これらは、サイトが適切に機能するために必要ですか? そうでない場合、どうすればそれらを削除できますか? 私は自分で JS を書くことにかなり慣れており、Tapestry に何かを追加する必要はありません。

4

2 に答える 2

5

面白いことに、Tapestry はデフォルトのサービス動作をオーバーライドする非常に豊富な機能を提供しますが、この場合はそうではありません。主な原因 JavaScriptSupport はオンザフライで作成され、装飾できません。

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();
        }
    };

したがって、唯一の方法は、ソースにパッチを適用するか (何度も行ったように)、JavaScriptSupportImpl のパラメーターとして使用される javascriptStackSource をオーバーライドすることです。

あなたの 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();
}

}

くだらないコードの大きな部分ですが、うまくいきます。Tapestry の自分のページに表示されるものをもっと制御したいと思います。

于 2013-06-10T20:38:33.320 に答える
1

Tapestry の利点の 1 つは、コンポーネントを構成するだけで、JavaScript を記述せずにすぐに使用できる DHTML および Ajax の動作を提供するコンポーネントの数です。

これを無効にすることは可能ですが、それは、Zone など、使用したい多くのコンポーネントが壊れることを意味します。同様に、クライアント側の入力検証はすべてなくなります。私はこれを行ったクライアントを持っていますが、それは小さな仕事ではありません.

基本的に、Tapestry の「コア」JavaScriptStack をオーバーライドできます。頻繁に聞かれるものではないので、FAQ はありません。また、完全な初心者向けではなく、経験者向けです (コントロール コンテナーが反転しているため、Tapestry でオーバーライドするのは比較的簡単ですが、何をオーバーライドするかを知るのは難しいです)。

いずれにせよ、Tapestry 5.4 は順調に進行しており、Tapestry の JavaScript を大幅に軽量化してモジュール化するように変更し、プロトタイプ (主に既存の Tapestry プロジェクトとの互換性のため) または jQuery のどちらかを選択できるようにしています。ただし、その場合でも、フレームワークにはある程度の JavaScript が組み込まれます。

于 2012-10-23T01:01:18.390 に答える