Tencent/omi được TopGit xếp vào nhóm dự án frontend, với 13.3k sao trên GitHub, viết chủ yếu bằng TypeScript. Web Components Framework - Web组件框架
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
VÌ SAO CHƯA CÓ REVIEW
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
import { h } from 'omi'
import './counter-demo'
render(<counter-demo />, document.body)
// or
import { CounterDemo, Other } from './counter-demo'
// Prevent tree Shaking when importing other things
render(<CounterDemo />, document.body)
// or
document.body.appendChild(document.createElement('counter-demo'))
Install
npm i omi
To quickly create an Omi + Vite + TS/JS project:
$ npx omi-cli init my-app # or create js project by: npx omi-cli init-js my-app
$ cd my-app
$ npm start # develop
$ npm run build # release
To quickly create an Omi + Router + Signal + Suspense + Tailwindcss + Vite + TS project:
$ npx omi-cli init-spa my-app
$ cd my-app
$ npm start # develop
$ npm run build # release
Packages
Core packages
omi - Implementation of omi framework.
omi-form - Powerful, simple and cross frameworks form solution.
lucide-omi - Lucide icon collection for omi.
omiu - Hope to create the best web components. For example, the powerful vchart and vtable
omi-router - Create SPA of omi framework.
omi-cli - To quickly create an Omi + Vite + TS/JS project.
Starter kits (not published to npm)
omi-elements - Tailwind Element Omi UI KIT.
omi-starter-spa - A starter repo for building single page app using Omi + OmiRouter + Tailwindcss + TypeScript + Vite + Prettier.
omi-starter-ts - A starter repo for building web app or reusable components using Omi in TypeScript base on Vite.
omi-starter-tailwind - A starter repo for building web app or reusable components using Omi + Tailwindcss + TypeScript + Vite.
omi-starter-js - A starter repo for building web app or reusable components using Omi in JavaScript base on Vite.
omi-vue - Vue SFC + Vite + OMI + OMI-WeUI.
Components
omi-weui - WeUI Components of omi.
omi-auto-animate - Omi version of @formkit/auto-animate.
omi-transition - Applying animations when an component is entering and leaving the DOM.
omi-ripple - A lightweight component for adding ripple effects to user interface elements.
Examples (not published to npm)
snake-game-2tier - SNake Game with Signal class
snake-game-3tier - SNake Game with reactivity functions
omi-tutorial - Source code of omi tutorial.
If you want to help the project grow, start by simply sharing it with your peers!
Share via Dev.to
Share via Twitter
Share via Facebook
Share via LinkedIn
Share via Pinterest
Share via Reddit
Share via StumbleUpon
Share via Vkontakte
Share via Weibo
Share via Hackernews
Thank you!
Usage
TodoApp with reactivity functions
Data oriented programming
In data-oriented programming, the focus is on the data itself and the operations on the data, rather than the objects or data structures that hold the data. This programming paradigm emphasizes the change and flow of data, and how to respond to these changes. The TodoApp with reactivity functions is a good example of this, using the concepts of reactive programming, where the UI automatically updates to reflect changes in the data (i.e., the to-do list).
import { render, signal, computed, tag, Component, h } from 'omi'
const todos = signal([
{ text: 'Learn OMI', completed: true },
{ text: 'Learn Web Components', completed: false },
{ text: 'Learn JSX', completed: false },
{ text: 'Learn Signal', completed: false }
])
const completedCount = computed(() => {
return todos.value.filter(todo => todo.completed).length
})
const newItem = signal('')
function addTodo() {
// api a
todos.value.push({ text: newItem.value, completed: false })
todos.update() // Trigger UI auto update
// api b, same as api a
// todos.value = [...todos.value, { text: newItem.value, completed: false }]
newItem.value = '' // Changing the value type can automatically update the UI
}
function removeTodo(index: number) {
todos.value.splice(index, 1)
todos.update() // Trigger UI auto update
}
@tag('todo-list')
class TodoList extends Component {
onInput = (event: Event) => {
const target = event.target as HTMLInputElement
newItem.value = target.value
}
render() {
return (
<>
<input type="text" value={newItem.value} onInput={this.onInput} />
<button onClick={addTodo}>Add</button>
<ul>
{todos.value.map((todo, index) => {
return (
<li>
<label>
<input
type="checkbox"
checked={todo.completed}
onInput={() => {
todo.completed = !todo.completed
todos.update() // Trigger UI auto update
}}
/>
{todo.completed ? <s>{todo.text}</s> : todo.text}
</label>
{' '}
<button onClick={() => removeTodo(index)}>❌</button>
</li>
)
})}
</ul>
<p>Completed count: {completedCount.value}</p>
</>
)
}
}
render(<todo-list />, document.body)
Auto Import h
vite.config.js:
import { defineConfig } from 'vite'
export default defineConfig({
esbuild: {
jsxInject: "import { h } from 'omi'",
jsxFactory: "h",
jsxFragment: "h.f"
}
})
You can inject code during construction, so you don't have to manually export h.
Define Cross Framework Component
The case of using Omi component in Vue is as follows:
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/Tencent/omi là nguồn chính thức.
Tencent/omi có bao nhiêu sao?
Tencent/omi có 13.3k sao GitHub — tải lại trang để xem số mới nhất, hoặc xem trực tiếp github.com/Tencent/omi. TopGit phản chiếu số sao của GitHub nhưng không cam kết đến từng phút.