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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM