opa简单练习
Table of Contents
1 安装
Opa的官方网站:http://opalang.org
下载安装opa后,会询问安装node.js和mongodb,从网站上分别下载安装后,会自 动下载node.js需要的module.
2 Hello,world
新建hello.opa,写如下代码
Server.start( Server.http, { title: "你好,Opa", page: function() { <h1>Hello, Opa,中文测试</h1> } } )
注意文件要用UTF-8格式保存,否则编译失败.
然后用opa hello.opa编译,生成hello.js和package.json。 windows下不能直接运行服务器,手动输入node hello.js启动服务器
node启动服务器时会提示找不到module, NODE_PATH环境变量设置错误, 添加%APPDATA%\npm\node_modules;到环境变量NODE_PATH即可.
启动服务器后,就可以从浏览器打开127.0.0.1:8080进行查看了
3 Hello, chat
实现一个简单的聊天室 opa craete在windows下不好使。
用单文件实现:
type message = { string author, string text } //数据模型, Model module Data { private Network.network(message) room = Network.cloud("room") exposed function broadcast(message) { Network.broadcast(message, room); } function register_message_callback(callback) { Network.add_callback(callback, room); } function new_author() { Random.string(8); } } //页面,也就是View, module Page { //生成页面 function page_template(title, content) { html = <div class="navbar navbar-fixed-top"> <div class=navbar-inner> <div class=container> <div id=#logo /> </div> </div> </div> <div id=#main> {content} </div> Resource.page(title, html) } //消息更新后的回调处理,添加新消息内容 function user_update(message msg) { line = <div class="row line"> <div class="span1 userpic" /> <div class="span2 user">{msg.author};</> <div class="span9 mesage">{msg.text}</> </div>; #conversation =+ line; Dom.scroll_to_bottom(#conversation); } //将文本中的消息广播给所有连接的用户 function broadcast(author) { text = Dom.get_value(#entry); Data.broadcast(~{author,text}); Dom.clear_value(#entry); } //生成发送消息框, 其中注册消息更新的回调事件 function chat_html(author) { <div id=#conversation class=container-fluid onready={function(_) { Data.register_message_callback(user_update)}} /> <div id=#footer class="navbar navbar-fixed-bottom"> <div class=container> <div class=input-append> <input id=#entry class=input-xxlarge type=text onnewline={function(_) { broadcast(author) }}> <button class="btn btn-primary" type=button onclick={function(_) { broadcast(author) }}>发送</> </div> </div> </div> } //每次请求都生成一个新author function default_page() { author = Data.new_author(); page_template("Opa chat", chat_html(author)); } } //控制器 ,所有地址都去default_page module Controller { dispatcher = { parser { case (.*) : Page.default_page() } } } //资源,编译后所有资源都静态嵌入js resources = @static_resource_directory("resources") Server.start(Server.http, [ { register: [ { doctype: { html5 } }, { js: [ ] }, { css: [ "/resources/css/style.css"] } ] }, { ~resources }, { custom: Controller.dispatcher } ])
保存为chat.opa, 资源文件可以从这里下载。 把resources文件夹放到chat.opa同目录下,然后用opa chat.opa, node chat.js即可启动服务器。
4 总结
写完示例后,放弃了,opa不是我想要的。 文档太少,而且1.0经历了重大改变,采用node.js做后端