ãã·ã¢ã®ããŒãžã§ã³
Vuecketã¯ãçµ±åWebãã¬ãŒã ã¯ãŒã¯ã§ããVueJSãã¯ã©ã€ã¢ã³ãåŽãšã®Apache Wicketã®ãµãŒããŒåŽã§ãäž¡æ¹ã®é·æã掻çšãããã«ã¹ã¿ãã¯ã¢ããªã±ãŒã·ã§ã³ã®éçºãããã«è¿ éãã€ç°¡åã«ããŸãããã¡ãããVuecketã¯çŸåšïŒ2020幎8æïŒ1ãææªæºã§ããããç«ãšè¡ãã®çç£ãµãŒããŒã®ãããã¹ãããŸã ééããŠããªãããããããã¯ãã¹ãŠå€§ããªèšèã§ããããããäž»èŠãªãªãŒãã³ãœãŒã¹è£œåã§ããOrienteerïŒããžãã¹ã¢ããªã±ãŒã·ã§ã³ã®è¿ éãªéçºã®ããã®ãã©ãããã©ãŒã ïŒã®éçºäžã«éçºãããã¹ãŠã®æé«ã®ãã®ããã§ã«å«ãŸããŠããŸãããããŠãVuecketãããªãã®å©ããå¿ èŠãšããŠããã®ã¯ããŸãã«ãã®è¥ã幎霢ã®ããã§ããããªãã奜ããªãã®ãããŸãè¯ããªããã®ãæ¹åãå¿ èŠãªå Žæãªã©ãå ±æããŠãã ããã
Vuecketãæ§ç¯ããéã®åºæ¬ååã¯æ¬¡ã®ãšããã§ãã
- 宣èšçã§ããããšã¯å¿ é ã§ã¯ãããŸãããVuecketã¯ãç¹å¥ãªã³ãŒãèŠä»¶ãèŠå®ããŠããŸãããããã¯ãæ¢åã®Vue.JSãŸãã¯ApacheWicketãããžã§ã¯ãã«ããªãè¿ éãã€ç°¡åã«é©çšã§ããŸãã
- ãã¬ãŒãã®ååã«åŸã£ãŠãã ããã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