幾個月前寫了一篇有關gulp和browserify來作前端構建的博客,由於browserify用來作js的打包時可能有些麻煩(特別是在寫React的時候),因此這裏再強烈推薦一款js打包工具-webpack。webpack很強大,不光能夠模塊化加載js,甚至還有jsx,css,圖片等等。能夠看看webpack託管到github的官網,相信你看一眼就能懂webpack的強大之處了。進入webpack官網>>
css
= =說到此處,難免有些尷尬,因爲博主的英文so 通常,對webpack的認識還不夠深,這裏僅僅只作一個大概的講解。一樣的,我也沒有在webpack社區中找到有關css壓縮的插件,因此只能用grunt來作有關css的打包,但grunt與webpack並不衝突並且grunt的社區很是成熟,只要是你能想到的插件在grunt官方都是有滴(並不表明我都用過~)。前端
好,進入正題。由於咱們用到webpack,因此咱們仍是用react框架來配合此次演示,固然咱們css是用grunt來進行合併壓縮的。在編寫代碼前,咱們須要安裝npm,grunt以及webpack。這裏我就再也不多說了,你們能夠移步到npm的官網,上面能夠找到具體的安裝細節。npm社區>>react
第一步先創建一個工做目錄,2016-3-5。而後咱們使用npm init (或者 cnpm init)進行項目的初始化。webpack
第二步就能夠開始編寫js和css文件了。因爲咱們用的是React框架,所以咱們採用jsx語法來書寫,文件固然也得保存爲.jsx的格式,咱們直接引用facebook官方給出的一個小demo(好吧,實際上是博主懶得本身寫了...),保存爲LikeButton.jsx,而後再編寫兩個css文件,用來模擬合併和壓縮,分別保存爲LikeButton1.css和LikeButton2.css。代碼以下:git
LikeButton.jsx:github
1 var React = require('react'); 2 var ReactDOM = require('react-dom'); 3 4 var LinkButton = React.createClass({ 5 getInitialState: function() { 6 return { 7 liked: false 8 }; 9 }, 10 handleClick: function(event) { 11 this.setState({ 12 liked: !this.state.liked 13 }); 14 }, 15 render: function() { 16 var text = this.state.liked ? 'like' : 'haven\'t liked'; 17 return( 18 <p onClick={this.handleClick}> 19 You{text} this. Click to toggle. 20 </p> 21 ); 22 } 23 }); 24 25 ReactDOM.render(<LinkButton/>,document.body);
LikeButton1.css:web
1 *{ 2 margin: 0px; 3 padding: 0px; 4 }
LikeButton2.css:npm
1 p{ 2 width: 500px; 3 background-color: #000; 4 color: #fff; 5 }
哈哈,爲了演示grunt,我也蠻拼的寫了兩個這麼簡短的css。接下來咱們開始配置grunt和webpack的任務。json
grunt的任務須要在根目錄下編寫一個名叫Gruntfile.js的文件,而webpack則須要在根目錄下編寫一個名叫webpack.config.js的文件。先列出代碼,再來進行詳細講解。gulp
Gruntfile.js:
1 module.exports = function(grunt) { 2 3 grunt.initConfig({ 4 pkg: grunt.file.readJSON('package.json'), 5 cssmin: { 6 options: { 7 shorthandCompacting: false, 8 roundingPrecision: -1 9 }, 10 target: { 11 files: { 12 './LikeButton.min.css': [ 13 './LikeButton1.css', 14 './LikeButton2.css' 15 ] 16 } 17 } 18 } 19 }); 20 21 grunt.loadNpmTasks('grunt-contrib-cssmin'); 22 23 grunt.registerTask('default',['cssmin']); 24 }
grunt的配置分三步,第一步是配置任務,即grunt.initConfig({});第二步是加載任務插件;第三步註冊可執行的任務命令。
通常第一步是須要本身手動配置的,grunt有不少不少的插件,而今天介紹的css壓縮合並只用到了grunt-contrib-cssmin的插件。首先看到pkg:grunt.file.readJSON('package.json')這行,有時候咱們須要將一些grunt任務基本信息放在package.json中,就須要將這個文件轉換爲一個js對象,而後能夠用來在這個文件中進行調用。接下來就是一個key: value的形式會一直出現,表明任務名:任務的進本信息。比方說這個cssmin就是grunt的任務名,等會我要壓縮合並文件時就只需在控制檯輸入grunt cssmin。
任務內部應該怎麼寫?這個因爲插件的大不相同可能寫法也不一樣,推薦你們去github或者是npm社區去看官方文檔的寫法。grunt-contrib-cssmin官方文檔>>。
第二步的加載插件,只須要grunt.loadNpmTasks('插件名')便可,記得要npm 這個插件哦。
第三步的任務註冊,grunt.registerTask('default',['cssmin'])。數組寫上全部你在第一步構建的方法,而default則能夠把全部的方法一鍵完成,在命令行只需輸入grunt,則全部任務自行執行完畢。
接下來看看咱們的文件LikeButton.min.css:
咱們的Grunt出色的完成它的任務~哈哈,雖然只是兩個文件,可是當你面對n個文件時,而且進行性能提高,Grunt會成爲你很好的幫手。而React的出現,又使Webpack這款工具不折不扣的火了!
我來講說我爲何要使用webpack把,以前我是使用gulp+browserify來進行構建React的,但是我以爲真的好難配置,特別是前端到了愈來愈注重模塊化開發的時代,什麼圖片,css都要這樣,因此webpack便成爲最好的選擇。廢話很少說,直接進入webpack.config.js的配置!
webpack.config.js:
1 var webpack = require('webpack'); 2 3 module.exports = { 4 entry: { 5 LikeButton: './LikeButton.jsx' 6 }, 7 output: { 8 path: './', 9 filename: '[name].js' 10 }, 11 module: { 12 loaders: [ 13 { 14 test: /\.jsx$/, 15 loader: 'jsx-loader' 16 } 17 ] 18 } 19 }
對於webpack的配置,其實更通俗易懂。entry,做爲入口點,用key-value的格式標明瞭在webpack任務中這個文件的一個引用。後面的output對象,須要指明路徑path以及輸出文件名filename,其中的[name]就是entry中的key。而module中的Loaders數組就是咱們用到的webpack插件,這裏是一個jsx轉換器"jsx-loader",咱們用正則找到全部jsx結尾的文件來進行轉換。
整個webpack的配置很簡單,可是webpack功能不止如此,博主也在學習中,能夠參考webpack在github上的文檔>>.
執行完webpack後控制檯會有一些信息的輸出,這個時候你的jsx文件已經打包爲js文件了,不過...這個文件確實是有點大,由於裏面包含了整個react的框架,可是當多個jsx或者js打包時咱們能夠建立一個common的js來提取公共部分。
webpack和grunt大大提高了開發效率,因此在這裏強力推薦~