omi-cli是Omi的命令行工具。在v0.1.X以及以前版本中,生成出來的項目腳手架
是基於webpack1的。因爲:css
tree-shaking 做用是移除沒有使用的代碼有效的減少包體積
sass-loader 可讓你把sass轉成css,在omi項目裏能夠把sass轉成組件的局部CSShtml
因此,果斷把omi-cli的項目模板升級爲基於webpack2。感興趣的同窗能夠立馬嘗試下。node
$ npm install omi-cli -g //安裝cli $ omi init your_project_name //初始化項目 $ cd your_project_name //轉到項目目錄 $ npm run dev //開發 $ npm run dist //部署發佈
在升級的過程當中遇到了很多問題,這裏記錄一下。webpack
webpack2中,CommonsChunkPlugin再也不支持上面的傳參形式,必須傳JSON形式。git
webpack2中,不在容許省略-loader的形式標記loader,如:github
{test: /\.html$/, loader: "string"},
都要改爲:web
{test: /\.html$/, loader: "string-loader"},
使用webpack-stream的同窗可能會碰到上面這個錯誤。找了很久發現:npm
在gulp裏要修改下第二個參數,把 null 改爲 require('webpack')。gulp
在傳統的webpack項目腳手架中,都會包含css相關的三個loader:sass
// webpack.config.js module.exports = { ... module: { rules: [{ test: /\.scss$/, use: [{ loader: "style-loader" // creates style nodes from JS strings }, { loader: "css-loader" // translates CSS into CommonJS }, { loader: "sass-loader" // compiles Sass to CSS }] }] } };
那麼問題來了?Omi內部自己組件能夠定義style方法,如:
class Hello extends Omi.Component { ... style () { return ` h1{ cursor:pointer; } `; } ... }
在Omi內部的管線裏面,會把執行style方法,把返回的css轉成局部css,而後插入到頁面的head裏面。因此和webpack三個loader裏的管線有衝突!怎麼解決?去掉一個loader即可!
// webpack.config.js module.exports = { ... module: { rules: [{ test: /\.scss$/, use: [{ loader: "css-loader" // translates CSS into CommonJS }, { loader: "sass-loader" // compiles Sass to CSS }] }] } };
咱們只須要可以在js裏動態獲取到編譯好的css字符串,而後拼在style方法裏即可!兩個管線就打通了!具體代碼:
import Omi from 'omi'; const style = require('./index.scss'); class Header extends Omi.Component { ... style () { return style.toString(); } ... } export default Header;
這裏須要注意require到的style不是字符串對象,須要執行toString才能獲取到css字符串。