寫在前面
Omi 4.0 釋出至今,收到了大量的意見和建議以及真刀真槍的 PR,雖然現在接受 Omi 都是外國友人,但是隨著 IE 市場份額的慢慢消失,可以遇見的未來,國人也會慢慢擁抱 Omi。Omi Team 經過一個星期的努力,終於完成了核心的生態的構建,用來服務海量的開發者,當然這只是一個起點,歡迎有任何需求給我們開 Issues, 我們對待你提的 issues 處理的速度會令你感到驚訝。 下面鄭重介紹下最近一個星期我們的工作:
專案 | 描述 |
---|---|
omi-docs | Omi 官方文件 |
omi-devtools | 谷歌瀏覽器開發工具擴充套件 |
omi-cli | 專案腳手架工具,支援 Javascript 和 Typescript |
omi-i18n | Omi 國際化解決方案 |
omi-transform | Omi 和 css3transform 完美結合. 讓 css3 transform 在你的 Omi專案中變得超級簡單. |
omi-page | 基於 page.js 的 Omi 路由 |
omi-tap | 讓 Omi 專案輕鬆支援 tap 事件 |
omi-finger | Omi 官方手勢庫 |
omi-mobx | Omi Mobx 介面卡 |
omi element ui(working) | Omi 版本的 element-ui |
westore | 小程式解決方案 westore,與 Omi 互相啟發 |
omi 周邊 | T恤、衣服、手機殼、包包等 |
文件國際化
我們現在擁有了三個語言版本的開發文件:
語言 | 快速入門 | 主要概念 |
---|---|---|
英語 | English | English |
中文 | 簡體中文 | 簡體中文 |
韓文 | 한국어 | 한국어 |
土耳其版本和日語版本的相關文件也正在緊急補齊當中。
開發者工具
使用 Omi 開發工具 可以非常簡單地除錯和管理你的 UI。不需要任何配置,你只要安裝然後就能除錯。
既然 Omi 使用了 Web Components 和 Shadow-DOM, 所以不需要像 React 和 Vue 一樣安裝其他元素皮膚,只需要使用 Chrome 自帶的 Elements' sidebar 便可,它和 React and Vue 開發者工具一樣強大。
工具由土耳其大神 F 親自操刀打造。你可以 從 Chrome 應用商店安裝。
omi-cli
安裝
$ npm i omi-cli -g # install cli
$ omi init your_project_name # init project, you can also exec 'omi init' in an empty folder
$ cd your_project_name # please ignore this command if you executed 'omi init' in an empty folder
$ npm start # develop
$ npm run build # release
複製程式碼
目錄說明:
├─ config
├─ public
├─ scripts
├─ src
│ ├─ assets
│ ├─ elements //存放所有 custom elements
│ ├─ store //存放所有頁面的 store
│ ├─ admin.js //入口檔案,會 build 成 admin.html
│ └─ index.js //入口檔案,會 build 成 index.html
複製程式碼
使用 TypeScript 模板(omi-cli v3.0.3+):
$ npm i omi-cli -g # install cli
$ omi init-ts your_project_name # init project, you can also exec 'omi init-ts' in an empty folder
$ cd your_project_name # please ignore this command if you executed 'omi init' in an empty folder
$ npm start # develop
$ npm run build # release
複製程式碼
Cli 自動建立的專案腳手架是基於單頁的 create-react-app 改造成多頁的,有配置方面的問題可以檢視 create-react-app 使用者指南。
感謝 xcatliu 和 uxu 為 omi-cli 做出的貢獻。
omi-i18n
你可以通過 omi-i18n
開速開發國際化的 Omi 專案:
import { tag, WeElement } from "omi";
import { t } from "omi-i18n";
const catalog = {
welcome: "Welcome to {{name}} using omi-i18n"
};
@tag("my-app")
class MyApp extends WeElement {
render(props, data) {
return (
<i18n-provider locale="en" catalog={catalog}>
<p slot="loading">
<spinner-element />
</p>
<h1 class="app-title">{t("welcome", { name: data.name })}</h1>
</i18n-provider>
);
}
}
複製程式碼
omi-transform
如果你使用過 css3transform, 就知道製作頁面動效是多麼地愜意。現在,你再 Omi 專案裡也可以使用上 css3transform 的優秀的特性並且擁有同樣高效的效能:
import { render, WeElement, tag, observe } from "omi";
import "omi-transform";
@observe
@tag("my-app")
class MyApp extends WeElement {
install() {
this.data.rotateZ = 30
this.linkRef = (e) => {
this.animDiv = e
}
}
installed() {
setInterval(() => {
// 慢,因為直接改變 data 會觸發 update -> render -> diff -> apply diff
// this.data.rotateZ += 2
//快,因為直接操作 dom
this.animDiv.rotateZ += 2
//同步 transform 給 data 防止任何 update
this.data.rotateZ = this.animDiv.rotateZ
}, 16)
}
render(props, data) {
return (
<css3-transform rotateZ={data.rotateZ} translateX={0} perspective={0} >
<div ref={this.linkRef}>
omi-transform
</div>
</css3-transform>
)
}
}
render(<my-app />, "body");
複製程式碼
你可以通過上面展示的簡單小技巧直接操作 DOM 獲取高效的運動效能並且也能應對任何形式的元件更新而不丟失狀態。
omi-page
基於 page.js 的 Omi 路由。
使用:
import { render, tag, WeElement } from 'omi'
import page from 'omi-page'
@tag('my-app')
class MyApp extends WeElement {
installed() {
page('/', this.index)
page('/about', this.about)
page('/contact', this.contact)
page('/contact/:contactName', this.contact)
page('*', this.notfound)
page()
}
render() {
return (
<div>
<ul>
<li><a href="/">/</a></li>
<li><a href="/about">/about</a></li>
<li><a href="/contact">/contact</a></li>
<li><a href="/contact/me">/contact/me</a></li>
<li><a href="/contact/me?a=b">/contact/me?a=b</a></li>
<li><a href="/not-found?foo=bar">/not-found</a></li>
</ul>
<p>
{this.data.path}
</p>
</div>
)
}
index = (ctx) => {
this.data.path = ctx.path
this.update()
}
about = (ctx) => {
this.data.path = ctx.path
this.update()
}
contact = (ctx) => {
this.data.path = ctx.path
this.update()
}
notfound = (ctx) => {
this.data.path = ctx.path
this.update()
}
}
render(<my-app></my-app>, 'body')
複製程式碼
如果你知道 express,page.js 完全受 express 啟發。瞭解 express 你就肯定能夠快速上手 omi-page。
omi-tap
Omi 不僅可以開發 PC 網站,我們拿來開發微信和手機 QQ 的 Web 頁面,也叫 H5 頁面。所以提供了 omi-tap 繫結 tap 事件來解決移動端 click 300ms 延遲的問題,使用方式也是極其簡便:
import { render, WeElement, tag } from "omi"
import "omi-tap"
@tag("my-app")
class MyApp extends WeElement {
onTap = () => {
console.log('tap')
}
render() {
return (
<omi-tap onTap={this.onTap} >
<div>Tap Me!</div>
</omi-tap>
)
}
}
render(<my-app />, "body");
複製程式碼
omi-finger
針對移動端,負責的手勢互動,我們也提供了 omi-finger 手勢互動庫。你可以移動端開啟這個頁面看看 omi-finger 的能力:
使用:
import { render, tag, WeElement, observe } from 'omi'
import 'omi-finger'
@observe
@tag('my-app')
class MyApp extends WeElement {
install() {
this.data.wording = 'Tap or Swipe Me!'
}
handleTap = (evt) => {
this.data.wording += '\r\nTap'
}
handleSwipe = (evt) => {
this.data.wording += '\r\nSwipe-' + evt.direction
}
render() {
return (
<div>
<omi-finger onTap={this.handleTap} abc={{a:1}} onSwipe={this.handleSwipe}>
<div class="touchArea" >
{this.data.wording}
</div>
</omi-finger>
</div>
)
}
}
render(<my-app></my-app>, 'body')
複製程式碼
支援手勢列表:
手勢 |
---|
onTap |
onMultipointStart |
onLongTap |
onSwipe |
onPinch |
onRotate |
onPressMove |
onMultipointEnd |
onDoubleTap |
omi-mobx
Omi 內建的 observe 是通過 proxy 實現的,如果你想要相容 IE11, 你可以使用 omi-mobx 去實現響應式檢視:
import { tag, WeElement } from "omi"
import { observe } from "omi-mobx"
@observe
@tag("my-app")
class MyApp extends WeElement {
install() {
this.data.name = "omi"
}
onClick = () => {
this.data.name = "Omi V4.0"
}
render(props, data) {
return (
<div onClick={this.onClick}>
<h1>Welcome to {data.name}</h1>
</div>
)
}
}
複製程式碼
omi-element-ui
Omi 版本的 element-ui, omi 版本的 weui 也在同步進行當中,期待一下。
你也可以→ 加入進來。
omi 周邊
感謝
非常感謝各位為 Omi 生態的貢獻:
- 土耳其的大神 F
- 韓國的 LeeHyungGeun
- 韓國的 validalias
- 騰訊的 xcatliu
- 騰訊的 vorshen
- 騰訊的 uxu
- 騰訊的 ghostzhang
- 騰訊的 zhengbao
- 中國的 1921622004
- 以色列的 benjamingr
- 還有我 dntzhang
以及其他正在為 Omi 貢獻的人....
我們也會在今年年底舉辦 Omi Conf 開發者大會,門票大概率免費,或者約等於免費用來過濾無效報名者。