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-intro
、app-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