上節課中我提到了,在gulpfile中編寫task編譯js和sass的task。javascript
而後在項目中使用時發現,當項目內容越寫越多時,編譯速度會愈來愈久。css
看了一下編譯過程。上次gulpfile中的定義是當監聽文件改變時就執行編譯所有js文件。html
查閱資料--gulp編譯加速java
在出來的結果中首條信息是博客園的如何在Gulp中提升Browserify的打包速度node
看了下教程沒怎麼明白,按照連接點擊去看了他的源代碼,一個文檔裏面寫了看起來很像加速的東西,可是我並不知道怎麼加到本身的項目中。react
而後該教程中提到了watchify,因而就查了gulpwatchify,第一條信息是gulp中文網的git
當一個 browserify 項目開始變大的時候,編譯打包的時間也會慢慢變得長起來。雖然開始的時候可能只需花 1 秒,而後當你的項目須要創建在一些流行的大型項目的基礎上時,它頗有可能就變成 30 秒了。github
這就是爲何 substack 寫了 watchify 的緣由,一個持續監視文件的改動,而且 只從新打包必要的文件 的 browserify 打包工具。用這種方法,第一次打包的時候可能會仍是會花 30 秒,可是後續的編譯打包工做將一直保持在 100 毫秒如下 —— 這是一個極大的提高。web
watchify 並無一個相應的 gulp 插件,而且也不須要有:你可使用 vinyl-source-stream 來把你的用於打包的 stream 鏈接到 gulp 管道中。gulp
頁面提供的源代碼寫的很好,我在裏面增長了註釋說明。
'use strict'; var watchify = require('watchify'); var browserify = require('browserify'); var gulp = require('gulp'); var source = require('vinyl-source-stream'); var buffer = require('vinyl-buffer'); var gutil = require('gulp-util'); var sourcemaps = require('gulp-sourcemaps'); var assign = require('lodash.assign'); //這個模塊是用來鏈接對象的好比var a = {a_p:1} var b = {b_p:2} var c = assign{{},a,b} 則對象c其實是{a_p:1,b_p:2} //項目中使用object-assign代替,用習慣了而已,沒有爲何要換 // 在這裏添加自定義 browserify 選項 var customOpts = { entries: ['./src/index.js'],//<span style="font-family: Arial, Helvetica, sans-serif;">browserify </span><span style="font-family: Arial, Helvetica, sans-serif;">主入口</span> debug: true }; var opts = assign({}, watchify.args, customOpts);//把watchify的屬性和browserify的屬性鏈接起來 assign的用法看上面註釋 var b = watchify(browserify(opts));定義一個使用watchify監聽的browserify事件(<span style="font-family: Arial, Helvetica, sans-serif;">或者說對象</span><span style="font-family: Arial, Helvetica, sans-serif;">)。</span> // 在這裏加入變換操做 // 好比: b.transform(coffeeify); gulp.task('js', bundle); // 這樣你就能夠運行 `gulp js` 來編譯文件了 b.on('update', bundle); // 當任何依賴發生改變的時候,運行打包工具 b.on('log', gutil.log); // 輸出編譯日誌到終端 function bundle() { return b.bundle() // 若是有錯誤發生,記錄這些錯誤 .on('error', gutil.log.bind(gutil, 'Browserify Error')) .pipe(source('bundle.js')) // 可選項,若是你不須要緩存文件內容,就刪除 .pipe(buffer()) // 可選項,若是你不須要 sourcemaps,就刪除 .pipe(sourcemaps.init({loadMaps: true})) // 從 browserify 文件載入 map // 在這裏將變換操做加入管道 .pipe(sourcemaps.write('./')) // 寫入 .map 文件 .pipe(gulp.dest('./dist')); }
var watchify = require('watchify'); var gutil = require('gulp-util'); var assign = require('object-assign');
gulp.task('watchSource', bundle);
// 在這裏添加自定義 browserify 選項 var customOpts = { entries: ['./source/app.js'], debug: true };三、加入變換操做,react項目中須要加入presets,如今的項目加了會報錯。本次demo中沒加,後續用到的時候,再添加進去。
b.transform(babelify,{presets:["react"]});四、修改build函數
function bundle() { return b.bundle() // 若是有錯誤發生,記錄這些錯誤,按照教程寫的bind並不能用 .on('error', gutil.log)
// 刪掉了沒有用到的buffer和sourcemaps等內容
// 增長壓縮代碼uglify,在下方的pipe,當須要壓縮代碼是取消下方的註釋
.pipe(source('oni.js')) //須要壓縮就打開 //.pipe(streamify(uglify())) .pipe(gulp.dest('./build')); }執行
var gulp = require('gulp'); var browserify = require('browserify'); var babelify = require('babelify'); var source = require('vinyl-source-stream'); var sass = require('gulp-sass'); var plumber = require('gulp-plumber');//事件 var notify = require('gulp-notify');//錯誤 var uglify = require('gulp-uglify');//壓縮 var streamify = require('gulp-streamify'); var webserver = require('gulp-webserver');//服務 var watchify = require('watchify'); var gutil = require('gulp-util'); var assign = require('object-assign'); // 在這裏添加自定義 browserify 選項 var customOpts = { entries: ['./source/app.js'], debug: true }; var opts = assign({}, watchify.args, customOpts); var b = watchify(browserify(opts)); // 在這裏加入變換操做 // 好比: b.transform(coffeeify); b.transform(babelify); gulp.task('watchSource', bundle); // 這樣你就能夠運行 `gulp watchSource` 來編譯文件了 b.on('update', bundle); // 當任何依賴發生改變的時候,運行打包工具 b.on('log', gutil.log); // 輸出編譯日誌到終端 function bundle() { return b.bundle() // 若是有錯誤發生,記錄這些錯誤,按照教程寫的bind並不能用 .on('error', gutil.log) // 刪掉了沒有用到的buffer和sourcemaps等內容 // 增長壓縮代碼uglify,在下方的pipe,當須要壓縮代碼是取消下方的註釋 .pipe(source('oni.js')) //須要壓縮就打開 //.pipe(streamify(uglify())) .pipe(gulp.dest('./build')); } gulp.task('buildCSS', function () { gulp.src('./style/app.scss') .pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')})) .pipe(sass()) .pipe(gulp.dest('./build')) }); gulp.task('watchStyle', function () { gulp.watch('./style/**/*',['buildCSS']) }) gulp.task('webserver', function () { gulp.src('build').pipe(webserver({ port:8897, fallback: 'index.html', open:true //host:'172.16.9.68' 可設置成本機ip供聯網調試 })) }); gulp.task('default',['watchSource','watchStyle','webserver']);