由於先前作過一個使用阿里的ant design的項目,可是因爲ant design中有不少組件還遺留着坑,問題是這些坑,還找不到解決的方法(或者我太low,方法可能有,只是我沒找到),既然解決不了,那用起來確定就會很難受,只能想各類方法來解決這些,從而就致使出現了一些爛代碼,好吧,我也被我本身給噁心到了,後來想着,看看能不能本身開發出一套組件來(忽然以爲那時候的想法好宏偉),這樣,什麼坑徹底操縱在本身手裏,多爽,因而就有了如今的這個項目:https://git.oschina.net/meichao/React-webpack 好吧,廢話太多,直入主題吧css
開發出一套組件,目前主要是用於PC端,後期將完善到移動端,由於還要對組件有API等介紹,因此須要配套網站。html
react,node,webpack,react-router,es6,react-redux(目前還未引入)node
這是個人webpack的配置內容react
1:extract-text-webpack-plugin:用於把css樣式加到相應的css文件中,由於先前沒有加的時候,css樣式所有寫在html頁面裏面,實在是忍受不了webpack
2:entry: ['webpack/hot/dev-server', path.resolve(__dirname, './app/routes')] 入口文件地址,./app/routes,routes文件時個jsx格式的,這裏不須要加是由於在resolve裏面進行了設置,會進行後綴名的自動補全git
3: plugins: webpack.optimize.UglifyJsPlugin() 用於代碼壓縮es6
webpack.HotModuleReplacementPlugin() 熱替換,當你在代碼中有修改的時候,頁面上的內容會自動更新,而無需你手動去刷新頁面web
webpack.optimize.CommonsChunkPlugin('common.js') 把全部入口節點的公共代碼提取出來,生成一個common.js文件中(注意,若是沒有在plugins中設置HtmlWebpackPlugin的話,須要在手動去建立common.js文件,css亦是如此,而後再index.html文件中去引入)redux
ExtractTextPlugin("[name].css") 將css代碼抽出來到相應的css文件中,和js文件同樣,也須要手動建立相應的css文件瀏覽器
設置了模板文件和目標文件,inject的做用是將css文件和js文件插入到body的底部去,hash:true,是在css和js文件後面加hash值,解決了緩存問題(若是使用了HtmlWebpackPlugin,相應的css文件和js文件會自動生成,而無需咱們手動去建立),具體頁面效果:
由此看到,生成了相應的css文件和js文件,而且在文件後面會有一串hash值,這就是webpack配置裏面作到的一系列效果。
1:
組件的文件目錄以下:
將通用化組件放到common文件夾下面,其他組件則放在components下面,另外,在MConponent.jsx文件中,以下:
這樣,咱們就既能夠對組件進行單個調用,也能夠統一接口調用,方便管理。
2:
組件中用到了iconfont,先前的作法是:在相應的組件裏使用iconfont的對應class,而後在index.html裏面引入iconfont.css,寫到後來發現不對勁,若是把iconfont.css的引入,放到了目標文件(即index.html)裏面,這樣到時候組件的通用性就會變得不好,每一個項目引入的時候,都須要人爲的本身去引入一遍iconfont.css,這是很不科學的,因而就把iconfont.css的引入集成到了jsx文件裏面,可是引入的時候又報了以下錯誤:
引入eot.svg.woff這些文件出錯,解決的方案只須要在webpack配置項裏面進行以下配置:
這樣就完美解決了引入格式的問題。
目前寫的樣式是scss(起始是sass語法很不習慣,less沒怎麼看),配置以下:
會將scss語法自動編譯成css,autoprefixer會自動補全瀏覽器前綴,省去了不少的麻煩
路由配置以下:
Router裏面的history 暫時使用 hashhistory 進行開發,由於使用 browserHistory 是服務器渲染,頁面刷新時會出現404,hashhistory雖然不會出現404,可是頁面跳轉過程當中url中會出現 」/?_k=h8c26r「這樣的flag,因此hashhistory僅限與開發過程當中,正式上線,會改用 browserHistory。在這裏說下嵌套路由,只須要在Route裏面嵌套Route,而後再相應的頁面裏面進行操做:
使用 this.props.children,子路由的內容會自動的替換掉它,從而達到二級,三級等多級路由嵌套的效果。
1:MButton
2:MInput
3:MTooltip
4:MBackTop
3:MIcon
已經項目只有本身一我的在作,組件的全部可能出現的狀態,狀況都得本身考慮,因此不免會有一些組件內的狀況沒有考慮全,並且,如今由於僅僅是起步階段,組件量比較少,邏輯都是組件內部,尚未系統的數據交互邏輯出現,因此目前尚未使用redux來管理state。
雖然項目纔開始沒多久,可是確確實實的學到了不少東西,例如webpack的一系列的輔助效果,react-router的路由機制,es6的語法糖,react的語法糖及內部的狀態維護等等,獲益匪淺,我相信這樣持續下去,會學到更多的東西,雖然期間會踩到不少不少的坑。