webpack+gulp 構(gòu)建react項(xiàng)目

@拭目以待:首發(fā)于webpack+gulp 構(gòu)建react項(xiàng)目

背景

GirdManager首頁,使用 React 實(shí)現(xiàn)。

需要實(shí)現(xiàn)功能
  1. jsx 轉(zhuǎn)換為 js
  2. es6 轉(zhuǎn)換為 es5
  3. 對文件進(jìn)行合并、壓縮
  4. 生成可供發(fā)布的zip包
  5. 單個頁面只引入當(dāng)前使用到的資源文件
為什么要將 webpack gulp 配合使用

webpack 在使用過程中, 并不能很好的解決文件相關(guān)的操作。所以采用 gulp 進(jìn)行配合。

webpack 與 gulp 各自實(shí)現(xiàn)的功能如下:

webpack

  1. jsx transform js
  2. es6 transform es5

gulp

  1. 文件操作
  2. 壓縮html css js
  3. 生成發(fā)布所需zip包
實(shí)現(xiàn)源碼

gulpfile.js

/*
* 文件操作
* 壓縮html css
* 對js相關(guān)的操作使用webpack
* */
const gulp = require('gulp');
const htmlmin = require('gulp-htmlmin');
const minifyCss = require('gulp-minify-css');
const uglify = require('gulp-uglify');
const gulpIf = require('gulp-if');
const gulpUtil = require('gulp-util');
const zip = require('gulp-zip');
const del = require('del');
var miniHtmlOptions = {
    removeComments: true,  //清除HTML注釋
    collapseWhitespace: true,  //壓縮HTML
    collapseBooleanAttributes: false,  //省略布爾屬性的值 <input checked="true"/> ==> <input checked />
    removeEmptyAttributes: true,  //刪除所有空格作屬性值 <input id="" /> ==> <input />
    removeScriptTypeAttributes: true,  //刪除<script>的type="text/javascript"
    removeStyleLinkTypeAttributes: true,  //刪除<style>和<link>的type="text/css"
    minifyJS: true,  //壓縮頁面JS
    minifyCSS: true  //壓縮頁面CSS
};
// 構(gòu)建項(xiàng)目目錄
var buildPath = 'GridManager';
// 打包后的名稱
var zipName = 'GridManagerSite.zip';
var webpack = require('webpack');
var webpackConfig = require('./webpack.config.js');
// 默認(rèn)執(zhí)行
gulp.task('default', ['develop']);
// 構(gòu)建開發(fā)包
gulp.task('develop', ['webpack:build']);
// 構(gòu)建上線包
gulp.task('production', ['uglify'], function(){
    // gulp.start('uglify');
});
// 構(gòu)造前: 刪除原有構(gòu)建包
gulp.task('clean', function() {
    del.sync([buildPath + '/*']);
});
// 構(gòu)造前: 先刪除之前的.zip
gulp.task('cleanzip', function(){
    del.sync(zipName);
});
// 移動文件,除jsx以外
gulp.task('movefile', ['clean', 'cleanzip'], function () {
    return gulp.src(['src/*app*/*/*', 'src/*assets*/*/*', 'src/index.html', '!src/**/*.js*'])
        .pipe(gulp.dest(buildPath));
});
// 壓縮
gulp.task('uglify', ['webpack:build'], function(){
    return gulp.src([buildPath + '/**/*'])
        .pipe(gulpIf('*.html', htmlmin(miniHtmlOptions).on('error', gulpUtil.log)))
        .pipe(gulpIf('*.js', uglify().on('error', gulpUtil.log)))
        .pipe(gulpIf('*.css', minifyCss()))
        .pipe(gulp.dest(buildPath));
});
// 使用webpack 對jsx進(jìn)行處理
gulp.task('webpack:build', ['movefile'], function(callback) {
    // modify some webpack config options
    var myConfig = Object.create(webpackConfig);
    // run webpack
    webpack(myConfig, function(err, stats) {
        if(err) throw new gutil.PluginError('webpack:build', err);
        gulpUtil.log('[webpack:build]', stats.toString({
            colors: true
        }));
        callback();
    });
});
//打包為GridManagerSite.zip
gulp.task('GridManagerSite', function() {
    console.log('GridManagerSite');
    return gulp.src([buildPath + '/**/*.*'])
        .pipe(zip(zipName))
        .pipe(gulp.dest(''));
});
/**
 * 命令所對應(yīng)功能:
 * gulp: 構(gòu)建未壓縮的項(xiàng)目
 * gulp develop: 構(gòu)建未壓縮的項(xiàng)目
 * gulp production: 構(gòu)建壓縮的項(xiàng)目, 并生成zip包
 * */

webpack.config.js

/*
* webpack只對js進(jìn)行控制
* jsx transform js
* es6 transform es5
* 注意:
* html,css 及打包壓縮等使用gulp實(shí)現(xiàn)
* */
var webpack = require('webpack');
var path = require('path');
var buildPath = 'GridManager';
module.exports = {
    entry: {
        'index': ['./src/app/model.js', './src/app/index.jsx'],
        'about': './src/app/about/index.jsx',
        'api': './src/app/api/index.jsx',
        'demo': ['./src/app/demo/model.js', './src/app/demo/index.jsx'],
        'faq': './src/app/faq/index.jsx',
        'version': './src/app/version/index.jsx',
        'common': ['./src/common/header.jsx', './src/common/footer.jsx', './src/common/tool.js']
    },
    output: {
        path: path.join(__dirname, buildPath),
        filename: '[name].build.js',
        publicPath: '/' + buildPath + ''
    },
    module: {
        loaders: [
            {
                test: /.js?$/,
                loaders: ['babel?{"presets":["es2015"]}'],
                exclude: /(node_modules|bower_components)/,
                include: [path.join(__dirname, 'src')]
            },
            {
                test: /.jsx$/,
                loader: 'babel-loader!jsx-loader?harmony'
            },
            {
                test: /.html$/,
                loader: 'file?name=[path][name]-[hash:20].[ext]',
                exclude: [/(node_modules|bower_components)/],
                include: [path.join(__dirname, 'src/app')]
            }
        ]
    }
};
注意事項(xiàng)

1.在 gulpfile.js 中調(diào)用 webpack

gulp.task('webpack:build', function(callback) {
    // webpackConfig 為 webpack.config.js 中的內(nèi)容
    var myConfig = Object.create(webpackConfig);
    // run webpack
    webpack(myConfig, function(err, stats) {
        if(err) throw new gutil.PluginError('webpack:build', err);
        gulpUtil.log('[webpack:build]', stats.toString({
            colors: true
        }));
        callback();
    });
});

2.存在js的壓縮時, 必須在壓縮前先執(zhí)行 webpack 。以保證在執(zhí)行壓縮時, 已經(jīng)將全部的 jsx 轉(zhuǎn)換為 js

gulp.task('uglify', ['webpack:build'], function(){
    return gulp.src([buildPath + '/**/*'])
        .pipe(gulpIf('*.html', htmlmin(miniHtmlOptions).on('error', gulpUtil.log)))
        .pipe(gulpIf('*.js', uglify().on('error', gulpUtil.log)))
        .pipe(gulpIf('*.css', minifyCss()))
        .pipe(gulp.dest(buildPath));
});

@拭目以待

個人站點(diǎn):www.lovejavascript.com
表格管理插件:gridmanager.lovejavascript.com && github地址
QQ交流群 (452781895):How To Make Love
微信公眾賬號:loveJavascript

《野生前端工程師》專輯中所有文章均為@拭目以待 原創(chuàng),轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,659評論 1 32
  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始逐漸滲...
    彬_仔閱讀 25,807評論 21 139
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,326評論 40 247
  • -- 1. Gulp VS webpack 比較 Gulp 是一個任務(wù)管理工具,讓簡單的任務(wù)更清晰,讓復(fù)雜的任務(wù)易...
    慢清塵閱讀 3,669評論 7 16
  • 同屬江南 跟水鄉(xiāng)一樣有詩意 徽州又有著自己的味道。 慢節(jié)奏 是這個時代難能可貴的秉性 順勢就在快中解放出來 小巷深...
    補(bǔ)拙莫如勤LV閱讀 291評論 0 2

友情鏈接更多精彩內(nèi)容