騰訊AlloyTeam正式發布omi-cli腳手架 - 創建網站無需任何配置
2017-06-05 12:06 【當耐特】 閱讀(3114) 評論(6) 收藏 舉報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="http://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": "http://localhost:9000/",
"cdn": "",
"port": "9000",
"route": "/news/",
};
修改 CDN 地址
module.exports = {
"webserver": "http://localhost:9000/",
"cdn": "http://s.url.cn/",
"port": "9000",
"route": "/news/",
};
修改 webserver 和 port
module.exports = {
"webserver": "http://localhost:9000/",
"cdn": "http://s.url.cn/",
"port": "9001",
"route": "/news/",
};
修改 route
module.exports = {
"webserver": "http://localhost:9001/",
"cdn": "http://s.url.cn/",
"port": "9001",
"route": "/user/",
};
浙公網安備 33010602011771號