環境要求:javascript
1.安裝nodejs,gulp和webpack都須要使用nodejs來運行。nodejs安裝很簡單這裏無需贅述css
2.安裝gulp的安裝請參考http://my.oschina.net/u/1760791/blog/668431,gulp的使用demo請下載gulpTesthtml
3.安裝webpack,其實基於gulp有一個組件叫gulp-webpack,因爲最終將使用gulp-webpack,所以能夠不用安裝webpackjava
先安裝nodejs就能夠,其餘兩個根據下面實例一步一步的進行就能夠node
一.關於gulp+webpack+react+es6整合實例react
開始本實例以前,最後建一個workspace專門用於作react的相關demowebpack
1.進入本身的workspacees6
$ cd [your workspace]web
$ mkdir gulp-webpack //新建一個gulp-webpack的項目npm
$ cd gulp-webpack //進入項目根目錄
$ npm init //經過npm初始化項目,自動生成package.json
$ vim package.json
在package.json中輸入如下內容並保存退出
{ "name": "webpack", "version": "1.0.0", "description": "a webpack test", "main": "main.js", "scripts": { "test": "a test command" }, "keywords": [ "test", "webpack" ], "author": "sunyu", "license": "ISC", "devDependencies": { "css-loader": "^0.17.0", "gulp": "^3.9.0", "gulp-clean": "^0.3.2", "gulp-concat": "^2.6.0", "gulp-less": "^3.0.5", "gulp-md5-plus": "^0.2.5", "gulp-webpack": "^1.5.0", "jsx-loader": "^0.13.2", "path": "^0.11.14", "style-loader": "^0.12.3" } }
$ vim Gulpfile.js //在項目根目錄新建gulp入口文件
而後在Gulpfile.js中輸入如下內容
var gulp = require('gulp'); var webpack = require("gulp-webpack"); var webpackConfig = require("./webpack.config.js"); var clean = require('gulp-clean'); var md5 = require('gulp-md5-plus'); var less = require('gulp-less'); var concat = require('gulp-concat'); //拷貝html文件到目標頁面 gulp.task('copy:html', function (done) { gulp.src(['src/app/*.html']) .pipe(gulp.dest('dist/app')) .on('end', done); // .pipe(connect.reload()) }); //將圖片拷貝到目標目錄 gulp.task('copy:images', function (done) { gulp.src(['src/images/**/*']).pipe(gulp.dest('dist/images')).on('end', done); }); //壓縮合並css, css中既有本身寫的.less, 也有引入第三方庫的.css gulp.task('lessmin', function (done) { gulp.src(['src/css/main.less', 'src/css/*.css']) .pipe(less()) //這裏能夠加css sprite 讓每個css合併爲一個雪碧圖 //.pipe(spriter({})) .pipe(concat('style.min.css')) .pipe(gulp.dest('dist/css/')) .on('end', done); }); //將js加上10位md5,並修改html中的引用路徑,該動做依賴webpack gulp.task('md5:js', ['webpack'], function (done) { gulp.src('dist/js/*.js') .pipe(md5(10, 'dist/app/*.html')) .pipe(gulp.dest('dist/js')) .on('end', done); }); //清空輸出目錄 gulp.task('clean', function (done) { gulp.src(['dist']) .pipe(clean()) .on('end', done); }); //使用webpack打包js gulp.task('webpack', function () { var myConfig = Object.create(webpackConfig); return gulp .src('') .pipe(webpack(myConfig)) .pipe(gulp.dest('./dist/js')); }); // 註冊缺省任務 gulp.task('default', ['copy:html','copy:images','lessmin','webpack']); //部署任務 gulp.task('deploy', ['copy:html','copy:images','md5:js']);
$ vim webpack.config.js //在項目根目錄新建webpack的配置文件
var webpack = require('webpack'); var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin"); var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin; var path = require('path'); var fs = require('fs'); var srcDir = path.resolve(process.cwd(), 'src'); function getEntry() { var jsPath = path.resolve(srcDir, 'js'); var dirs = fs.readdirSync(jsPath); var matchs = [], files = {}; dirs.forEach(function (item) { matchs = item.match(/(.+)\.js$/); console.log("item:"+item); console.log(matchs); if (matchs&&item != 'App.js') { files[matchs[1]] = path.resolve(srcDir, 'js', item); } }); console.log(JSON.stringify(files)); return files; } // 配合使用gulp打包 module.exports = { devtool: false, entry:{ index:'./src/js/index.js', main:'./src/js/main.js' }, output: { filename: "[name].js" }, module: { loaders: [ //.css 文件使用 style-loader 和 css-loader 來處理 { test: /\.css$/, loader: "style!css" }, //.js 文件使用 jsx-loader 來編譯處理 { test: /\.js$/, loader: "babel",query:{presets:['es2015','react']} } ] }, resolve: { extensions: ['', '.js', '.jsx'] }, plugins:[ new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.NoErrorsPlugin(), new CommonsChunkPlugin("common.js"), new webpack.DefinePlugin({ 'process.env': { //產品模式會減小js的體積 'NODE_ENV': JSON.stringify('production'), } }), new uglifyJsPlugin({ compress: { warnings: false } }) ] };
關與webpack.config.js配置文件的說明: devtool//指定是否開啓開發模式 entry//指定入口文件,對於單頁面app的entry指定一個就能夠,例如
entry:'./entry.js'//app應用的入口文件
output是指定構建打包輸出文件配置,若是將output中的filename指定爲具體的名字,則webpack會將js文件全體打包到指定的js文件中,例如將上面的webpack配置文件output爲以下,則main.js和index.js將被打包合併到bundle.js中
output: { filename: "bundle.js" },
module屬性中的配置尤其重要,尤爲是module中loader的配置直接決定着項目可否成功編譯react代碼和使用es6編寫的代碼
resolve配置webpack解析處理,resolve中extensions用於指明webpack自動補全識別哪些後綴,
注意一下, extensions 第一個是 空字符串 ! 對應不須要後綴的狀況
plugins配置項是用於添加一些額外的插件來編譯打包優化代碼等,若是不指定webpack編譯的代碼體積將很大。
例如:使用CommonsChunkPlugin插件來提取公共代碼,使用uglifyJsPlugin插件對代碼進行壓縮,DefinePlugin插件能夠用於定義任意類型的變量,demo中使用definePlugin定義爲production頗有意義,這會減小打包代碼的體積,固然在開發階段無需指定產品模式
$ mkdir src //在項目根目錄下建立一個src的文件夾用於存放項目源代碼
$ cd src //轉到src目錄
$ mkdir js //js目錄專門用戶存放js源代碼
$ cd js //轉到js目錄
$ vim App.js //開始編寫react組件
//使用了es6的語法進行導入 import React from 'react'; class App extends React.Component{ render(){ return(<div> Hello World</div>); } } export default App;
$ vim main.js //
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js';//依賴於上面的App.js ReactDOM.render(<App/>,document.getElementById('content'));//將App組件的Hello world輸出到一個id爲content元素
$ vim index.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App/>,document.getElementById('app'));
返回到src目錄,繼續往下面
$ mkdir app //新建一個app的文件專門用戶存放html文件
$ cd app //轉到app目錄建立html頁面
$ vim index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> <div id="app"></div> <script src="../js/index.js"></script> </body> </html>
$ vim main.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>main</title> </head> <body> <div id="content"></div> <script src="../js/main.js"></script> </body> </html>
繼續退回到src目錄,新建兩個文件目錄css和images ,因爲本例未涉及css和圖片,能夠隨便放的css文件或者image到相應目錄。
返回根目錄運行以下命令安裝相關依賴
npm install --save-dev gulp npm install gulp-webpack --save-dev npm install gulp-clean --save-dev npm install gulp-concat --save-dev npm install gulp-md5-plus --save-dev npm install babel-core --save-dev npm install babel-loader --save-dev npm install babel-preset-es2015 --save-dev npm install babel-preset-react --save-dev npm install gulp-less --save-dev npm install react --save-dev npm install react-dom --save-dev
下載的例子也要運行以上命令
$ gulp //經過gulp執行默認的任務將src下的資源處理後拷貝到生dist目錄並將內容放置到dist下
經過瀏覽器打開dist下app中的html即可看到效果