Vuecketのご玹介





ロシアのバヌゞョン

Vuecketは、統合WebフレヌムワヌクであるVueJSをクラむアント偎ずのApache Wicketのサヌバヌ偎で。䞡方の長所を掻甚し、フルスタックアプリケヌションの開発をさらに迅速か぀簡単にしたす。もちろん、Vuecketは珟圚2020幎8月1か月未満であり、「火ず血」の生産サヌバヌのバプテスマをただ通過しおいないため、これらはすべお倧きな蚀葉です。しかし、䞻芁なオヌプン゜ヌス補品であるOrienteerビゞネスアプリケヌションの迅速な開発のためのプラットフォヌムの開発䞭に開発したすべおの最高のものがすでに含たれおいたす。そしお、Vuecketがあなたの助けを必芁ずしおいるのは、たさにその若い幎霢のためです。あなたが奜きなもの、あたり良くないもの、改善が必芁な堎所などを共有しおください。



Vuecketを構築する際の基本原則は次のずおりです。



  1. 宣蚀的であるこずは必須ではありたせん。Vuecketは、特別なコヌド芁件を芏定しおいたせん。これは、既存のVue.JSたたはApacheWicketプロゞェクトにかなり迅速か぀簡単に適甚できたす。
  2. パレヌトの原則に埓っおください。Vuecketは、箱から出しお必芁な機胜の80を提䟛する必芁がありたすが、残りの20には優れた䟿利な拡匵ポむントが必芁です。


これらの原則がVue.JSずApacheWicketにも適甚されるこずは容易に理解できたす。



では、Vuecketをどの皋床正確に䜿い始めるのでしょうか。Markdownをサポヌトするチャット/ゲストボヌドを䜜成するこずをお勧めしたす。私はあたり苊しめたせん完成したアプリケヌションはここにあり、コヌドはここにありたす。



プロゞェクトを䜜成したす



`mvn archetypegenerate`を䜿甚しおプロゞェクトを生成したしょう。これを行うには、たずえば、次のコマンドを䜿甚できたす。



mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=8.9.0 -DgroupId=com.mycompany -DartifactId=mychat -DarchetypeRepository=https://repository.apache.org/ -DinteractiveMode=false


Vuecketにはただ独自のMavenプロゞェクトテンプレヌトがありたせん。おそらく将来的にはこれも远加する予定です。それでは、Vuecket自䜓を接続したしょう。次の䟝存関係をプロゞェクト `pom.xml`に远加したす。



<dependency>
	<groupId>org.orienteer.vuecket</groupId>
	<artifactId>vuecket</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>


マヌクダりンでのテキストの出力



Wicketプロゞェクトには、デフォルトでWicketりェルカムペヌゞがすでに含たれおいたす。Vuecketがすでに機胜しおいるこずを確認するために、いく぀かのコヌドを远加したしょう。たずえば、Hello WorldをMarkdownに衚瀺しお、テキスト自䜓がApacheWicketコンポヌネントのサヌバヌ偎に蚭定されるようにしたす。vue-markdownラむブラリを䜿甚しおMarkdownをレンダリングしたす。



HomePage.htmlで、Wicketグリヌティングの代わりに、次を远加したす。



<div wicket:id="app">
	<vue-markdown wicket:id="markdown">This will be replaced</vue-markdown>
</div>


そしおHomePage.javaで次のコヌド



public HomePage(final PageParameters parameters) {
	super(parameters);
	add(new VueComponent<String>("app")
			.add(new VueMarkdown("markdown", "# Hello World from Vuecket")));
}


しかし、VueMarkdownクラスはどこにありたすかそしお、それを次のように定矩したす。



@VueNpm(packageName = "vue-markdown", path = "dist/vue-markdown.js", enablement = "Vue.use(VueMarkdown)")
public class VueMarkdown extends Label {
	public VueMarkdown(String id) {
		super(id);
	}
	public VueMarkdown(String id, Serializable label) {
		super(id, label);
	}
}


@VueNpmアノテヌションに泚意しおください。このWicketコンポヌネントでVuecketを有効にする必芁がありたす。これにより、NPMから必芁なすべおが読み蟌たれ、ブラりザヌがすでにVueコンポヌネントをMarkdown甚に正しくレンダリングできるようになりたす。



すべおを正しく行った堎合、 `mvn jettyrun`を䜿甚しおプロゞェクトを開始するず、http// localhost8080に次のように衚瀺されたす。




では、ここで䜕が起こったのでしょうか。なぜそれが機胜するのでしょうか。



  • アプリケヌション甚ずマヌクダりン出力甚の2぀のVueコンポヌネントをペヌゞに远加しお、ペヌゞをマヌクアップしたした。
  • サヌバヌ偎HomePage.java内でVueコンポヌネントずWicketコンポヌネントをバンドルしたした
  • どのVue.JSラむブラリをレンダリングする必芁があるかをVuecketに䌝えたした 'vue-markdown'
  • そしお、すべおが簡単です。Wicketは、ペヌゞをブラりザにレンダリングするずきに、Wicketコンポヌネントを远加するずきに蚭定した「#Hello World from Vuecket」ずいう行を䜿甚し、Vuecketは、ブラりザが必芁なVueJSラむブラリをロヌドし、VueJSアプリケヌションを起動し、レンダリングされたマヌクダりンずしおすでに挚拶をレンダリングするのに圹立ちたした。


Githubは支揎を玄束したす



メッセヌゞを入力しおプレビュヌする



このステップでは、アプリケヌションを耇雑にしたす。メッセヌゞを入力しおプレビュヌしたす。

メッセヌゞを入力するためのtextareaをHomePage.htmlに远加し、このフィヌルドずvue-markdownをVueJS倉数「text」にバむンドしおみたしょう。



<div wicket:id="app">
	<textarea v-model="text" style="width:100%" rows="5"></textarea>
	<vue-markdown wicket:id="markdown" :source="text">Will be replaced</vue-markdown>
</div>


すでに「text」倉数を䜿甚しおいたすが、デヌタVueコンポヌネントに远加する必芁がありたす。Vuecketでこれを行うにはいく぀かの方法がありたすが、最も長く行きたしょう。



  • Vueアプリケヌション甚に独自のVueComponentを䜜成する
  • * .vueファむルに関連付けたしょう
  • * .vueファむルにロゞックを蚘述したしょう。珟時点では、「テキスト」フィヌルドのみです。


行う倉曎の䞀郚を次に瀺したす。



//HomePage.java:
public HomePage(final PageParameters parameters) {
	super(parameters);
	add(new ChatApp("app")
			.add(new VueMarkdown("markdown")));
}
//ChatApp.java:
@VueFile("ChatApp.vue")
public class ChatApp extends VueComponent<Void> {
	public ChatApp(String id) {
		super(id);
	}
}


さお、ChatApp.vue自䜓



<script>
module.exports = {
    data: function() {
        return {
            text : ""
        }
    }
}
</script>


その結果、 `mvn jettyrun`を起動しおテキストを入力するず、次のように衚瀺されたす。




この章では、次の方法を孊習したした。䜿い慣れた* .vueファむルを䜜成し、それらをApacheWicketコンポヌネントに関連付ける



GitHubコミット



メッセヌゞのリストを衚瀺し、新しいメッセヌゞを远加したす



この章では、VuecketたたはWicketに固有のものはありたせん。玔粋なVueJSが茝いおいたす。

タスクを分解する堎合は、次のこずを行う必芁がありたす。



  • メッセヌゞを保存するには、Vueアプリケヌションにリストボックスを远加したす
  • リストに新しいメッセヌゞを远加するメ゜ッドを远加したす
  • メッセヌゞのリストを衚瀺し、マヌクダりンを忘れないでください


たず、ChatApp.vueを倉曎しお、必芁なロゞックを远加したしょう。メッセヌゞのリストを含む新しいフィヌルド `messages`ず、新しいメッセヌゞを远加するための` addMessage`メ゜ッドです。たた、リストにメッセヌゞを远加するずきは、元の入力フィヌルドをクリアするこずをお勧めしたす。メッセヌゞの堎合、テキストだけでなく、远加/送信の日付も保存したす。将来的には、このメッセヌゞの送信者、優先床、必芁な匷調衚瀺などの远加フィヌルドで拡匵できるようになりたす。



<script>
module.exports = {
    data: function() {
        return {
            text : "",
            messages: []
        }
    },
    methods: {
    	addMessage : function() {
    		this.messages.push({
    			message: this.text,
    			date: new Date()
    		});
    		this.text = "";
    	}
    }
}
</script>


たた、HomePage.htmlを倉曎し、メッセヌゞのリストの衚瀺を远加し、Ctrl-Enterを抌したずきにaddMessageメ゜ッドぞの呌び出しを远加したす。



<div wicket:id="app">
	<div v-for="(m, index) in messages">
		<h5>{{ index }}: {{ m.date }}</h5>
		<vue-markdown :source="m.message"></vue-markdown>
	</div>
	<textarea v-model="text" 
			  style="width:100%" 
			  rows="5" 
			  @keyup.ctrl.enter="addMessage"
			  placeholder="Enter message and Ctrl-Enter to add the message">
	 </textarea>
	<vue-markdown wicket:id="markdown" :source="text">Will be replaced</vue-markdown>
</div>


`mvn jettyrun`を実行しおいく぀かのメッセヌゞを入力するず、次のようなメッセヌゞが衚瀺されたす。




この章では、VueJSを䜿甚しおリストにメッセヌゞを远加し、埌者を衚瀺するアプリケヌションに぀いおのみ説明したした。



GitHubは支揎を玄束したす



コラボレヌションをオンにする



それ以前にゲストブックのコンテンツがペヌゞの蚪問者ごずに䞀意であった堎合、この章ではサヌバヌずの通信を有効にし、すべおの蚪問者ずの同期を可胜にしたす。このためには、ブラりザ偎のオブゞェクトをサヌバヌ偎のオブゞェクトず同期できる゜リュヌションであるVuecket DataFibersが必芁です。そしお最も興味深いのは、クラむアント偎でこれのために䜕もする必芁がないずいうこずですかっこいいねコヌドを行こうただし... ChatApp.javaコンポヌネントには2぀の新しい行しかありたせん。



private static final IModel<List<JsonNode>> MESSAGES = Model.ofList(new ArrayList<JsonNode>());

public ChatApp(String id) {
	super(id);
	addDataFiber("messages", MESSAGES, true, true, true);
}


ここで䜕が起こったのか



  • 静的ファむナルずしお䜜成されるため、誰でも利甚できるMESSAGESモデルを䜜成したした。
  • クラむアント偎のメッセヌゞオブゞェクトずサヌバヌ偎のMESSAGESモデル内のオブゞェクトをバむンドするデヌタファむバヌを远加したした。
  • , data-fiber 3 : load, observe, refresh. Load — , Observe — , Refresh — .


-




GitHub commit





前の章では、すべおのサむト蚪問者にメッセヌゞコレクションぞの読み取り/曞き蟌みアクセスを䞀床に蚱可するこずで少しだたしたした。これを行うこずは匷くお勧めしたせん。これは、デヌタファむバヌを介しお、送信者がサヌバヌ䞊のすべおのメッセヌゞを自分のメッセヌゞで䞊曞きしたり、消去したりできるためです。デヌタファむバヌは、カスタムのブラりザヌ偎オブゞェクトを同じナヌザヌに属するサヌバヌ偎のデヌタオブゞェクトにリンクするためにのみ䜿甚する必芁がありたす。これは、静的なモデルやデヌタがないこずを意味したす。



どうすれば状況を修正できたすかこのために私達はしなければなりたせん



  • デヌタファむバヌを捚おたす。これは党面的に機胜し、メッセヌゞリストの初期ロヌドにのみ䜿甚したす。
  • リストに新しいメッセヌゞを远加するサヌバヌ偎の方法を䜿甚したす。


したがっお、誰もが䞀般リストに新しいメッセヌゞを远加するこずしかできたせんが、既存のメッセヌゞを削陀したり倉曎したりするこずはできたせん。サヌバヌ偎も少し耇雑にしたしょう。クラむアントから受信したJSONだけでなく、必芁なフィヌルドやメ゜ッドなどを含む特殊なメッセヌゞクラスも保存したす。サヌバヌ偎でデヌタを凊理したす。



ナヌザヌメッセヌゞを保存するためのMessageクラスから始めたしょう。ちなみに、これはデヌタをデヌタベヌスに保存できるJPAクラスの可胜性がありたす。



public class Message implements IClusterable {
	@JsonProperty("message")
	private String text;
	private Date date;
	
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}	
}


@JsonPropertyに泚意しおください。したがっお、JSONフィヌルド「message」をJavaフィヌルド「text」にリダむレクトしたした。



次に、ChatApp.javaを倉曎しお、䞊蚘の操䜜を実行したす。メッセヌゞを保存するためのvuecketメ゜ッドを远加したす。たた、コヌドでは、メッセヌゞのリストが20にカットされおいるこずがわかりたすHabrナヌザヌは非垞に熱心ですが、メッセヌゞを削陀しおも、サヌバヌログに氞久に保存されたす。



@VueFile("ChatApp.vue")
public class ChatApp extends VueComponent<Void> {
	
	private static final Logger LOG = LoggerFactory.getLogger(ChatApp.class);
	private static final int MAX_SIZE = 20;
	private static final IModel<List<Message>> MESSAGES = Model.ofList(new ArrayList<Message>());

	public ChatApp(String id) {
		super(id);
		addDataFiber("messages", MESSAGES, true, false, false);
	}
	
	@VueMethod
	public synchronized void addMessage(Context ctx, Message message) {
		List<Message> list = MESSAGES.getObject();
		list.add(message);
		trimToSize(list, MAX_SIZE);
		IVuecketMethod.pushDataPatch(ctx, "messages", list);
	}
	
	private void trimToSize(List<Message> list, int size) {
		//It's OK to delete one by one because in most of cases we will delete just one record
		while(list.size()>size) LOG.info("Bay-bay message: {}", list.remove(0));
	}
}


@VueMethodアノテヌションメ゜ッドを参照しおくださいその䞭で、新しいメッセヌゞを受け取り、それをリストに保存し、切り取り、すでに曎新されたリストをクラむアントに送信したす。たた、Vueアプリケヌションの起動時にのみデヌタを芁求するようにデヌタファむバヌが再構成されおいるこずにも泚意しおください。



たた、ChatApp.vueのロゞックを倉曎しお、ロヌカルの「メッセヌゞ」フィヌルドの代わりに、非同期モヌドvcInvokeでサヌバヌに新しいメッセヌゞを送信する必芁がありたす。



module.exports = {
    data: function() {
        return {
            text : "",
            messages: []
        }
    },
    methods: {
    	addMessage : function() {
    		this.vcInvoke("addMessage", {
    			message: this.text,
    			date: new Date()
    		});
    		this.text = "";
    	}
    }
}


この章から孊んだこず



  • Vuecketのサヌバヌ偎メ゜ッドを䜜成する方法
  • ブラりザからサヌバヌ䞊のメ゜ッドを呌び出す方法
  • 必芁な倉曎をクラむアントに送信する方法


法を順守する蚪問者の堎合、䜕も倉曎されおいたせんが、ハッカヌはサヌバヌ䞊のメッセヌゞの䞀般的なリストをそれほど簡単に倉曎できなくなりたした。




GitHubは支揎を玄束したす



結論



今日はこれで締めくくりたす。コヌドに加えるこずができる改善点は他にもたくさんありたすが、読者の皆様、お任せしたす。あなたが助けを必芁ずするならば、曞いおください、私たちは助けたす



あなたはフレヌムワヌクが奜きですかご意芋をお聞かせください。結局のずころ、オヌプン゜ヌスは生きお発展しおいるずいうのはあなたの意芋です。



今埌のVuecketの改善のスポむラヌ
  • WebSocket' .
  • , .
  • data-fiber' .
  • Vuecket/Wicket , VueJS , , Markdown





All Articles