騰訊 Omi 生態釋出

當耐特發表於2018-10-29

寫在前面

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 開發者工具一樣強大。

Omi DevTools

工具由土耳其大神 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 使用者指南

感謝 xcatliuuxu 為 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 路由。

→ demo

使用:

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 的能力:

→ omi-finger demo

使用:

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 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出
騰訊 Omi 生態釋出

感謝

非常感謝各位為 Omi 生態的貢獻:

以及其他正在為 Omi 貢獻的人....

我們也會在今年年底舉辦 Omi Conf 開發者大會,門票大概率免費,或者約等於免費用來過濾無效報名者。

→ 立刻擁抱 Web Components ,加入 Omi

相關文章