3个版本

0.1.6 2023年2月20日
0.1.5 2023年2月14日
0.1.4 2023年2月3日

#3 in #comet

MIT 许可证

11KB
328

Comet

Documentation Status GitHub license GitHub release PRs Welcome

响应式同构Rust Web框架。

索引

  1. 简介
  2. 功能
  3. 入门
  4. 快速浏览
  5. 待办事项列表

简介

正在开发中,这还是一个早期原始原型。不要期待任何东西能正常工作,要期待经常出现故障。

Comet是一个使用Rust + Wasm构建的Web框架 <3。它从MeteorJS、Seed-rs、Yew等中获得灵感。

这个crate旨在成为一个包含所有功能的综合性同构响应式框架。

  - You keep saying 'Isomorphic', but why ?

在这个上下文中,同构意味着你只为客户端和服务器编写一个程序。
一个crate。一个。两者都。
这意味着我们大量依赖宏和代码生成,所有这些优点和缺点都可能带来,但它允许实现许多功能,接近零样板代码,并在不同方面提供一些生活质量上的提升。

  - Ok, and how is it reactive then ?

它在许多意义上都是响应式的,首先是通过其组件系统,该系统将小块逻辑封装到HTML模板系统中,并且可以直接将你的struct的方法绑定到JS事件上,触发仅更改的组件的渲染。还有一个在PostgreSQL数据库之上的响应式层,允许在一段时间内监视某些查询是否发生变化,并通过WebSocket向所有监视这些更改的客户端发送推送通知,在需要时触发渲染。

访问示例文件夹


功能

  • 同构客户端/服务器
  • 响应式视图
  • 虚拟DOM
  • 客户端缓存
  • 带有PostgreSQL的响应式数据库
  • 每次你的struct发生变化时自动生成数据库(Alpha)
  • WebSocket
  • 自动协议生成
  • 远程过程调用
  • (几乎)零样板代码

入门

安装Comet二进制文件和依赖项

$> cargo install comet-cli

你需要安装并运行一个PostgreSQL实例。

如果系统上没有找到,Comet将在首次运行时使用cargo install安装以下crate

  • wasm-pack
  • diesel-cli

创建一个简单的递增计数器

$> comet new my_counter && cd my_counter

Cargo.toml中已经设置了依赖项

comet-web = "0.1.6"

这个新生成的项目包含了你开始所需的一切。你的旅程从src/main.rs开始。
方便的是,这个生成的文件已经是最简单的递增计数器了。

use comet::prelude::*;

pub struct Counter {
    pub value: i32,
}

component! {
    Counter {
        button click: self.value += 1 {
            self.value 
        }
    }
}

comet::run!(Counter { value: 0 });

运行它

将数据库地址设置为环境变量

/!\ 警告:此数据库在启动时以及每次模型更改时将被完全清除
这并不理想,但嘿!这仍然是一个正在进行中的项目:p

$> export DATABASE_URL="postgres://your_user:your_password@localhost/your_db"

实际运行你的项目

$> comet run

这将下载并安装构建和运行你的crate所需的工具。

[✓] Installing wasm-pack
[✓] Installing diesel-cli
[✓] Diesel setup
[✓] Migrating database
[✓] Patching schema
[✓] Building client
[✓] Building server
[✓] Running
 -> Listening on 0.0.0.0:8080

然后访问 https://127.0.0.1:8080


快速浏览

简单的DOM定义

use comet::prelude::*;

struct MyStruct {
    my_value: String,
    my_height: u32,
}

component! {
    MyStruct {
	// Here #my_id defined the id,
	// and the dot .class1 and .class2 add some classes to the element
	// The #id must always preceed the classes, if any
	div #my_id.class1.class2 {
	    span {
		// You can access your context anywhere
		self.my_value.as_str()
	    }
	    // Define style properties
	    div style: { height: self.my_height } {
		"Another child"
	    }
	}
    }
};

使用条件渲染和循环

use comet::prelude::*;

struct MyComponent {
    show: bool,
    value: HashMap<String, i32>,
}

component! {
    MyComponent {
	div {
	    div {
		// Conditional rendering with if
		if self.show {
		    "Visible !"
		}
		button click: self.show = !self.show {
		    "Toggle"
		}
	    }
	    div {
		// Use a for-like loop.
		for (key, value) in self.value {
		    div {
			key.as_str()
			value
		    }
		}
		button click: self.value.push(42)  {
		    "Add a number"
		}
	    }
	}
    }
}

将变量绑定到响应事件的字段

目前仅限于Comet crate

  • 视图系统
    • HTML宏
    • 组件宏
  • 通过WebSocket实现的同构数据库模型
    • #[model]过程宏,用于生成基本模型查询
    • 抽象的ws服务器/客户端

依赖项

~0-9MB
~86K SLoC