騰訊AlloyTeam正式發佈omi-cli腳手架 - 創建網站無需任何配置

来源:http://www.cnblogs.com/iamzhanglei/archive/2017/06/05/6944266.html
-Advertisement-
Play Games

omi cli "omi cli" "omi cli命令" "omi框架" 用戶指南 "文件目錄" "npm 腳本" "npm start" "npm run dist" "代碼分割" "相容 IE8" "插入 CSS" "插入組件局部 CSS" "局部CSS使用圖片" "插入 Less" "插入組 ...


omi-cli

用戶指南

文件目錄

執行完omi init my-app,你可以看到會生成如下的基礎目錄結構

my-app/
  config
    project.js
    config.js
  src/
    component
    css
    img
    js
    libs
    page
      index
      page-b
    favicon.ico
  • config里的文件是webpack打包配置以及cdn、webserver,埠、route配置
  • src目錄是我們的項目邏輯代碼目錄

npm 腳本

npm start

當你執行 npm start 會自動打開 http://localhost:9000/。現在你可以開始開發和調試,修改代碼並且保存,瀏覽器會自動刷新顯示最新的結果。

npm run dist

當你執行 npm run dist 之後,會創建一個dist目錄,所有要發佈的文件都在裡面:

my-app/
  dist/
    chunk
    component
    css
    img
    js
    libs
    favicon.ico
    index.html
    page-b.html

component會保留其依賴的某些資源文件,chunk會輸出分割出來的模板,怎麼分割請往下看。

代碼分割

為了優化性能,用戶不需要一次性載入所有網頁的依賴,可以在需要使用的時候再進行載入,所以這部分可以進行分割成單獨的模塊。
如下麵的a.js:

import logo from '../../img/omi.png'

module.exports = { src: logo }

通過require.ensure進行按需使用,在用戶點擊事件觸發之後才會進行載入a.js以及a.js的所有依賴,如下麵代碼所示:

class Hello extends Omi.Component {
  constructor(data, option){
      super(data, option)
  }

  handleClick(){
    require.ensure(['./a.js'], function() {
      var a = require("./a.js")
      document.body.innerHTML+=`<img src="${a.src}">`
    })
  }

  render() {
    return `
      <div class="App">
        <div class="App-header">
          <img src='${logo}' onclick="handleClick" class="App-logo" alt="logo" />
          <h2>Welcome to Omi</h2>
        </div>
        <p class="App-intro">
          To get started, edit <code>src/component/hello.js</code> and save to reload.
        </p>
         <p class="App-intro">
          {{name}}
        </p>
      </div>
    `
  }
}

上面是老的方式,webpack2更加建議使用一種"類函數式(function-like)"的 import() 模塊載入語法。如:

import("./a.js").then(function(moduleA) {
  console.log(moduleA);
  document.body.innerHTML+=`<img src="${moduleA.src}">`
});

這樣也能達到同樣的效果,當然你也可以使用async/await

相容 IE8

Omi框架是可以相容IE8的。

由於使用了webpack-hot-middleware, 開發過程不相容IE8,但是沒關係,npm run dist生成的發佈代碼是相容IE8。

需要主要的是,你需要在你的HTML里引用es5-sham或者es5-shim。如:

<!--[if lt IE 9]>
<script type="text/javascript" crossorigin="anonymous" src="//s.url.cn/qqun/xiaoqu/buluo/p/js/es5-sham-es5-sham.min.77c4325f.js"></script>
<![endif]-->

插入 CSS

通過import可以在js依賴相關的css文件,

import './index.css'

index.css會被提取到CSS文件當中,插入到head裡面。

插入組件局部 CSS

import './index.css'

class Hello extends Omi.Component {
  constructor(data, option){
      super(data, option)
  }

  style(){
    return require('./_hello.css')
  }
  ...
  ...
}

Omi框架的style方法返回的字元串會生成為組件的局部CSS,_hello.css文件會在運行時動態插入到head裡面。

需要特別註意的是: 組件的局部CSS必須使用下劃線開頭,如_xxx.css_aaa-bbb.css,不然會被識別成全局CSS插入到head里。

局部CSS使用圖片

當然不是必須require外部的css文件,也可以直接寫在style方法內,組件的依賴的圖片資源也在組件的目錄內:

my-app/
  src/
    component
        hello
            index.js
            pen.png
            pencil.png

對應的index.js如下所示:

class Hello extends Omi.Component {
  constructor(data, option){
      super(data, option)
  }
  
  style(){
    return `
        .icon-pen {
            background-image: url(${require('./pen.png')});
        }
        .icon-pencil {
            background-image: url(${require('./pencil.png')});
        }
    `
  }
  ...
  ...
}

插入 Less

通過import可以在js依賴相關的css文件,

import './xxx.less'

xxx.less會在轉換成CSS,並且被提取到CSS文件當中,插入到head裡面。

插入組件局部 Less


class Intro extends Omi.Component {
  constructor(data, option){
      super(data, option)
  }

  style(){
    return require('./_index.less')
  }

  render() {

    return `
          <p class="app-intro">
          To get started, edit <code>src/component/hello.js</code> and save to reload.
        </p>
    `
  }
}

export default Intro

Omi框架的style方法返回的字元串會生成為組件的局部CSS,_index.css文件會在運行時動態插入到head裡面。

需要特別註意的是: 組件的局部Less必須使用下劃線開頭,如_xxx.css_aaa-bbb.css,不然會被識別成全局CSS插入到head里。

導入組件

如上面一節定義了Intro組件,利用復用。那麼怎麼在其他組件中使用?

import Intro from '../intro/index.js'

Omi.tag('intro',Intro)

class XXX extends Omi.Component {
  constructor(data, option){
      super(data, option)
  }

  render() {

    return `
      <div>
        <div>Hello Omi!</div>
        <intro></intro>
      </div>
    `
  }
}

export default XXX

通過Omi.tag('intro',Intro)把組件Intro生成為可以聲明式的標簽。註意便簽名字要使用小寫,多個單詞使用中劃線,如:my-introapp-header等。

導入圖片、字體、SVG 等文件

如上面的例子:

import logo from './logo.svg'

logo.svg會被動態轉成base64。我們可以為每種類型都對應webpack里的一個loader來處理所有的文件類型。

修改配置

打開 config.js,其位置如下:

my-app/
  config
    project.js
    **config.js**

打開之後可以看到

module.exports = {
    "webserver": "//localhost:9000/",
    "cdn": "",
    "port": "9000",
    "route": "/news/",
};

修改 CDN 地址

module.exports = {
    "webserver": "//localhost:9000/",
    "cdn": "//s.url.cn/",
    "port": "9000",
    "route": "/news/",
};

修改 webserver 和 port

module.exports = {
    "webserver": "//localhost:9000/",
    "cdn": "//s.url.cn/",
    "port": "9001",
    "route": "/news/",
};

修改 route

module.exports = {
    "webserver": "//localhost:9001/",
    "cdn": "//s.url.cn/",
    "port": "9001",
    "route": "/user/",
};

Github

https://github.com/AlloyTeam/omi-cli


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /** * @overview A minimalistic wrapper around React Native's AsyncStorage. * @license MIT */import { AsyncStorage } from 'react-native';import merge f ...
  • jquery仿京東商品頁面 京東頁面大家都很熟悉,進入商品頁面把滑鼠放在圖片上旁邊會出現一個放大的效果,接下來就帶大家看看怎麼實現的!!!! 仿京東商品頁面css的代碼!!! 仿京東商品頁面html的代碼!!! 仿京東商品頁面jquery的代碼!!! 仿京東商品頁面的效果!!! 怎麼樣,當我做出來的 ...
  • 1,下載安裝node 訪問 http://nodejs.org ,然後點擊大大的綠色的 install 按鈕,下載完成後直接運行程式,就一切準備就緒。 npm 會隨著安裝包一起安裝, 2,打開代碼行 node -v //查看node版本,如果顯示版本號,則安裝成功。 npm -v //查看npm版本 ...
  • 之前學習中做的筆記,放在有道雲筆記裡面了,分享出來,一起學習啦。 gulp入門篇: http://note.youdao.com/noteshare?id=f0fae7bae57c9deaaa10d2b51c431d75 gulp進階篇: http://note.youdao.com/notesha ...
  • <ul class="ddd"> <li class="solid active">啦啦啦啦</li> <li class="solid">我哦我我</li> <li class="solid">哦哦哦哦</li> <li class="solid">噢噢噢噢</li> <li class="sol ...
  • 1. 2.雙向數據綁定 3.v-if 4.v-show:也是條件渲染指令,和v-if指令不同的是,使用v-show指令的元素始終會被渲染到HTML(但是使用v-if指令的元素如果表達式為假,則不會被渲染到HTML頁面,這裡要註意v-if和v-show的這個區別),它只是簡單地為元素設置CSS的sty ...
  • 作者 | 劉博(又拍雲多媒體開發工程師) 當前為了滿足比較火熱的移動 Web 端直播需求,一系列的 HTML5 直播技術迅速的發展起來。 常見的可用於 HTML5 的直播技術有 HLS、WebSocket 與 WebRTC。今天我向大家介紹WebSocket 與 MSE 相關的技術要點,併在最後通過 ...
  • 之前一直用js的foreach,只是用來迴圈,也不知道它的定義是什麼,知道今天看到一段js, 裡邊用的方式是第一次見到,於是上網一搜。 才知道foreach原來是這樣的 array1.forEach(callbackfn[, thisArg]) 它還有一個可選的參數 具體用法這裡寫的已經很清楚了 看 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...