寫一份gulp常用配置檔案,構建前端工作流
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
目錄
前言
上回寫了一篇關於《一份gulp的配置檔案》的文章。其中已經提及了簡單專案中gulp的配置。
在使用實踐的過程中,發現這樣的一份配置並不太“友好”,沒有區分開發環境和生產環境。在實際中,開發過程中並不需要把所有東西都做到面面俱到,如:必須壓縮CSS、JS檔案等操作。我們可以在真正釋出到生產環境的時候再進行這樣的操作。在這裡,讀者可以先參考《入門:十分鐘自動化構建——jack_lo》一文。
建立專案
初始化專案
進入到專案目錄,使用如下命令初始化專案:
npm init
- 1
當然,也可以直接建立一個package.json檔案,內容如下:
{ "name": "Gulp-Workflow", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "gulp dev", "dev": "gulp dev", "clean": "rimraf dist", "build": "rimraf dist && gulp build" }, "author": "", "license": "ISC", "devDependencies": { "browser-sync": "^2.18.6", "gulp": "^3.9.1", "gulp-autoprefixer": "^3.1.1", "gulp-concat": "^2.6.1", "gulp-cssnano": "^2.1.2", "gulp-imagemin": "^3.1.1", "gulp-jshint": "^2.0.4", "gulp-rename": "^1.2.2", "gulp-sass": "^3.0.0", "gulp-uglify": "^2.0.0", "jshint": "^2.9.4" }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
其中scripts
中定義的是當前專案下的一些npm指令碼操作,後續將要提及。而devDependencies
則顯然是該專案所需的依賴。
通過如下命令下載依賴:
npm install
- 1
建立目錄結構
我們在專案中建立一個src
目錄,作為專案的源。而建立dist
目錄作為原始檔打包後存放的位置,建立build
目錄放置gulp的另外一些配置檔案。如下:
- project |- build |- dist // 打包資料夾 |- src // 原始檔夾 | |- assets // 放置一些第三方檔案,如bootstrap | |- css | | `- index.css | |- images | |- js | | `- index.js | |- sass | | `- index.scss |- gulpfile.js `- package.json
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
編寫Gulp配置
建立gulp的config檔案
我們在build資料夾中可以建立一個 gulpfile.config.js 檔案,主要用途為儲存專案的目錄配置,如原始檔存放的路徑,打包後文件存放的路徑等,可以進行靈活配置。同時將Config對應暴露出來供其他檔案引用。
gulpfile.config.js
var SRC_DIR = './src/'; // 原始檔目錄 var DIST_DIR = './dist/'; // 檔案處理後存放的目錄 var DIST_FILES = DIST_DIR + '**'; // 目標路徑下的所有檔案 var Config = { src: SRC_DIR, dist: DIST_DIR, dist_files: DIST_FILES, html: { src: SRC_DIR + '*.html', dist: DIST_DIR }, assets: { src: SRC_DIR + 'assets/**/*', // assets目錄:./src/assets dist: DIST_DIR + 'assets' // assets檔案build後存放的目錄:./dist/assets }, css: { src: SRC_DIR + 'css/**/*.css', // CSS目錄:./src/css/ dist: DIST_DIR + 'css' // CSS檔案build後存放的目錄:./dist/css }, sass: { src: SRC_DIR + 'sass/**/*.scss', // SASS目錄:./src/sass/ dist: DIST_DIR + 'css' // SASS檔案生成CSS後存放的目錄:./dist/css }, js: { src: SRC_DIR + 'js/**/*.js', // JS目錄:./src/js/ dist: DIST_DIR + 'js', // JS檔案build後存放的目錄:./dist/js build_name: 'build.js' // 合併後的js的檔名 }, img: { src: SRC_DIR + 'images/**/*', // images目錄:./src/images/ dist: DIST_DIR + 'images' // images檔案build後存放的目錄:./dist/images } };module.exports = Config;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
建立gulp的dev檔案
在build資料夾下建立gulpfile.dev.js檔案,該檔案放置的時開發環境下呼叫的任務,同時使用browser-sync實現編寫程式的時候瀏覽器自動重新整理的功能。
gulpfile.dev.js
var gulp = require('gulp');var autoprefixer = require('gulp-autoprefixer'); // 處理css中瀏覽器相容的字首 var rename = require('gulp-rename'); //重新命名 var cssnano = require('gulp-cssnano'); // css的層級壓縮合並var sass = require('gulp-sass'); //sassvar jshint = require('gulp-jshint'); //js檢查 ==> npm install --save-dev jshint gulp-jshint(.jshintrc:https://my.oschina.net/wjj328938669/blog/637433?p=1) var uglify = require('gulp-uglify'); //js壓縮 var concat = require('gulp-concat'); //合併檔案 var imagemin = require('gulp-imagemin'); //圖片壓縮 var browserSync = require('browser-sync').create();var reload = browserSync.reload;var Config = require('./gulpfile.config.js');//======= gulp dev 開發環境下 ===============function dev() { /** * HTML處理 */ gulp.task('html:dev', function () { return gulp.src(Config.html.src).pipe(gulp.dest(Config.html.dist)).pipe(reload({ stream: true })); }); /** * assets資料夾下的所有檔案處理 */ gulp.task('assets:dev', function () { return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist)).pipe(reload({ stream: true })); }); /** * CSS樣式處理 */ gulp.task('css:dev', function () { return gulp.src(Config.css.src).pipe(gulp.dest(Config.css.dist)).pipe(reload({ stream: true })); }); /** * SASS樣式處理 */ gulp.task('sass:dev', function () { return gulp.src(Config.sass.src).pipe(sass()).pipe(gulp.dest(Config.sass.dist)).pipe(reload({ stream: true })); }); /** * js處理 */ gulp.task('js:dev', function () { return gulp.src(Config.js.src).pipe(jshint('.jshintrc')).pipe(jshint.reporter('default')).pipe(gulp.dest(Config.js.dist)).pipe(reload({ stream: true })); }); /** * 圖片處理 */ gulp.task('images:dev', function () { return gulp.src(Config.img.src).pipe(imagemin({ optimizationLevel: 3 , progressive: true , interlaced: true })).pipe(gulp.dest(Config.img.dist)).pipe(reload({ stream: true })); }); gulp.task('dev', ['html:dev', 'css:dev', 'sass:dev', 'js:dev', 'assets:dev', 'images:dev'], function () { browserSync.init({ server: { baseDir: Config.dist } , notify: false }); // Watch .html files gulp.watch(Config.html.src, ['html:dev']); // Watch .css files gulp.watch(Config.css.src, ['css:dev']); // Watch .scss files gulp.watch(Config.sass.src, ['sass:dev']); // Watch assets files gulp.watch(Config.assets.src, ['assets:dev']); // Watch .js files gulp.watch(Config.js.src, ['js:dev']); // Watch image files gulp.watch(Config.img.src, ['images:dev']); });}//======= gulp dev 開發環境下 ===============module.exports = dev;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
在該檔案中建立瞭如html:dev
、css:dev
、sass:dev
等幾個任務(具體任務實現了什麼功能,聰明的你應該看得出來~),這幾個任務被放置在dev
函式中,並且將dev
函式暴露出去。至於為啥這麼做嘛,後面會知道的。
其中一個主要的gulp任務 dev
(同時也是生產環境下沒有的gulp任務),開啟了一個browserSync伺服器,同時監聽各個資原始檔的變化,當檔案發生變化後通知瀏覽器進行重新重新整理。
使用gulp dev
命令就可以進入開發模式咯~~(當然現在還不行,你騙我呢。因為dev方法還未被呼叫。)
建立gulp的prod檔案
在build資料夾下建立gulpfile.prod.js檔案,用於放置生產環境下執行的任務。其中在生產環境下,我們並不需要使用到什麼瀏覽器自動重新整理的功能,只要進行如壓縮CSS、JS檔案等操作即可。
gulpfile.prod.js
var gulp = require('gulp');var autoprefixer = require('gulp-autoprefixer'); // 處理css中瀏覽器相容的字首 var rename = require('gulp-rename'); //重新命名 var cssnano = require('gulp-cssnano'); // css的層級壓縮合並var sass = require('gulp-sass'); //sassvar jshint = require('gulp-jshint'); //js檢查 ==> npm install --save-dev jshint gulp-jshint(.jshintrc:https://my.oschina.net/wjj328938669/blog/637433?p=1) var uglify = require('gulp-uglify'); //js壓縮 var concat = require('gulp-concat'); //合併檔案 var imagemin = require('gulp-imagemin'); //圖片壓縮 var Config = require('./gulpfile.config.js');//======= gulp build 打包資源 ===============function prod() { /** * HTML處理 */ gulp.task('html', function () { return gulp.src(Config.html.src).pipe(gulp.dest(Config.html.dist)); }); /** * assets資料夾下的所有檔案處理 */ gulp.task('assets', function () { return gulp.src(Config.assets.src).pipe(gulp.dest(Config.assets.dist)); }); /** * CSS樣式處理 */ gulp.task('css', function () { return gulp.src(Config.css.src).pipe(autoprefixer('last 2 version')).pipe(gulp.dest(Config.css.dist)).pipe(rename({ suffix: '.min' })).pipe(cssnano()) //執行壓縮 .pipe(gulp.dest(Config.css.dist)); }); /** * SASS樣式處理 */ gulp.task('sass', function () { return gulp.src(Config.sass.src).pipe(autoprefixer('last 2 version')).pipe(sass()).pipe(gulp.dest(Config.sass.dist)).pipe(rename({ suffix: '.min' })) //rename壓縮後的檔名 .pipe(cssnano()) //執行壓縮 .pipe(gulp.dest(Config.sass.dist)); }); /** * js處理 */ gulp.task('js', function () { return gulp.src(Config.js.src).pipe(jshint('.jshintrc')).pipe(jshint.reporter('default')).pipe(gulp.dest(Config.js.dist)).pipe(rename({ suffix: '.min' })).pipe(uglify()).pipe(gulp.dest(Config.js.dist)); }); /** * 合併所有js檔案並做壓縮處理 */ gulp.task('js-concat', function () { return gulp.src(Config.js.src).pipe(jshint('.jshintrc')).pipe(jshint.reporter('default')).pipe(concat(Config.js.build_name)).pipe(gulp.dest(Config.js.dist)).pipe(rename({ suffix: '.min' })).pipe(uglify()).pipe(gulp.dest(Config.js.dist)); }); /** * 圖片處理 */ gulp.task('images', function () { return gulp.src(Config.img.src).pipe(imagemin({ optimizationLevel: 3 , progressive: true , interlaced: true })).pipe(gulp.dest(Config.img.dist)); }); gulp.task('build', ['html', 'css', 'sass', 'js', 'assets', 'images']);}module.exports = prod;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
同樣在gulpfile.prod.js檔案中將所有的任務放置在了prod函式中,同時暴露該函式供外部呼叫。
使用gulp build
命令就可以實現資源的打包咯~~(當然現在還不行,你又騙我呢。因為prod方法還未被呼叫。)
呼叫dev和prod方法
在真正的gulp配置檔案gulpfile.js中,引入gulpfile.dev.js和gulpfile.prod.js檔案,並呼叫dev和prod方法,這樣對應環境下的各個任務即被創建出來了。
gulpfile.js
/** * Created by DreamBoy on 2017/1/8. */var prod = require('./build/gulpfile.prod.js');var dev = require('./build/gulpfile.dev.js');prod();dev();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
執行gulp
這個時候,我們可以使用gulp dev
命令進行開發模式,此時會監聽專案src中檔案的變化,執行對應的任務,與此同時會通知瀏覽器進行重新整理,及時響應。
而使用gulp build
命令則可以針對生產環境的要求打包資原始檔,用於生產。
定義指令碼scripts
注意到,我們在gulp build
命令之前並沒有執行什麼刪除原來dist目錄的檔案的操作,這樣實在不太好呀。(如果沒有先進行刪除操作的話,可能在開發環境下生成了許多不需要的檔案,此時進行打包仍會保留到這些檔案。)並且有些時候,我們需要有一個clean的能力——清除所有打包後的檔案。
這還不簡單,直接到dist目錄下,手動把所有檔案都刪除就行啦。呃,這種方式給旁邊的妹紙看到會覺得很low嘞。
那我們換種炫酷一點的方式。注意到之前package.json檔案中的scripts
嗎?在這裡就是定義指令碼的地方。如:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "gulp dev", "dev": "gulp dev", "clean": "rimraf dist", "build": "rimraf dist && gulp build"}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
其中,主要的有:
1. 定義了start指令碼,用於執行gulp dev
命令;
2. 定義了dev指令碼,同樣用於執行gulp dev
命令;
3. 定義了clean指令碼,用於執行rimraf dist
命令(刪除dist目錄下的所有檔案);
4. 定義了build指令碼,用於執行rimraf dist
命令,還有gulp build
命令,實際上就是先刪除dist目錄下的所有檔案,然後再打包生成各資原始檔。
需要rimraf
,我們必須先進行全域性安裝:
npm install rimraf -g
- 1
這樣我們在實際裝逼使用過程中:
1. 使用npm start
命令將對應執行gulp dev
命令;
2. 使用npm run dev
命令將對應執行gulp dev
命令;
3. 使用npm run clean
命令將刪除所有生成後的檔案;
4. 使用npm run build
命令可以先刪除生成後的檔案,再重新打包生成。
附錄
另外在gulp中建立了一個js和js:dev任務,其中使用jshint對js進行了校驗,需要在專案根目錄下建立 .jshintrc
檔案,檔案內容如下:
{ "es5": true, "node": true, "bitwise": false, "camelcase": false, "curly": false, "eqeqeq": false, "forin": true, "strict": false, "freeze": true, "immed": true, "indent": 4, "latedef": true, "newcap": true, "noarg": true, "noempty": false, "nonbsp": true, "nonew": true, "plusplus": false, "undef": true, "trailing": true, "debug": false, "funcscope": true, "laxcomma": false, "loopfunc": true, "onevar": false, "unused": true}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
自動建立基礎目錄結構
(2017-10-10 應博友問題,補充初始化專案目錄結構的實現)
初始目錄和檔案
- project |- build | |- gulpfile.config.js | |- gulpfile.dev.js | |- gulpfile.init.js | |- gulpfile.prod.js |- gulpfile.js `- package.json
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
安裝mkdirp
外掛
使用mkdirp
外掛來建立目錄,先該外掛:
cnpm install mkdirp --save-dev
- 1
安裝成功後,package.json 如下:
{ "name": "Gulp-Workflow", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "gulp dev", "dev": "gulp dev", "clean": "rimraf dist", "build": "rimraf dist && gulp build" }, "author": "", "license": "ISC", "devDependencies": { "browser-sync": "^2.18.6", "gulp": "^3.9.1", "gulp-autoprefixer": "^3.1.1", "gulp-concat": "^2.6.1", "gulp-cssnano": "^2.1.2", "gulp-imagemin": "^3.1.1", "gulp-jshint": "^2.0.4", "gulp-rename": "^1.2.2", "gulp-sass": "^3.0.0", "gulp-uglify": "^2.0.0", "jshint": "^2.9.4", "mkdirp": "^0.5.1" }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
補充配置,建立初始化任務
修改gulp.config.js檔案中的配置,新增dir
屬性 ,用來宣告不同檔案所在目錄的路徑。如下:
var SRC_DIR = './src/'; // 原始檔目錄 var DIST_DIR = './dist/'; // 檔案處理後存放的目錄 var DIST_FILES = DIST_DIR + '**'; // 目標路徑下的所有檔案 var Config = { src: SRC_DIR, dist: DIST_DIR, dist_files: DIST_FILES, html: { dir: SRC_DIR, src: SRC_DIR + '*.html', dist: DIST_DIR }, assets: { dir: SRC_DIR + 'assets', src: SRC_DIR + 'assets/**/*', // assets目錄:./src/assets dist: DIST_DIR + 'assets' // assets檔案build後存放的目錄:./dist/assets }, css: { dir: SRC_DIR + 'css', src: SRC_DIR + 'css/**/*.css', // CSS目錄:./src/css/ dist: DIST_DIR + 'css' // CSS檔案build後存放的目錄:./dist/css }, sass: { dir: SRC_DIR + 'sass', src: SRC_DIR + 'sass/**/*.scss', // SASS目錄:./src/sass/ dist: DIST_DIR + 'css' // SASS檔案生成CSS後存放的目錄:./dist/css }, js: { dir: SRC_DIR + 'js', src: SRC_DIR + 'js/**/*.js', // JS目錄:./src/js/ dist: DIST_DIR + 'js', // JS檔案build後存放的目錄:./dist/js build_name: 'build.js' // 合併後的js的檔名 }, img: { dir: SRC_DIR + 'images', src: SRC_DIR + 'images/**/*', // images目錄:./src/images/ dist: DIST_DIR + 'images' // images檔案build後存放的目錄:./dist/images } };module.exports = Config;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
在前面的初始化目錄和檔案中,我們可以發現,多了一個檔案gulpfile.init.js
,用來定義init
任務。
gulpfile.init.js,如下:
var gulp = require('gulp');var mkdirp = require('mkdirp');var Config = require('./gulpfile.config.js');//======= gulp init 初始化專案結構 ===============function init() { /** * 初始化專案結構 */ gulp.task('init', function () { var dirs = [Config.html.dir, Config.assets.dir, Config.css.dir, Config.sass.dir, Config.js.dir, Config.img.dir]; dirs.forEach(dir => { mkdirp.sync(dir); }); });}module.exports = init;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
呼叫init任務
修改gulpfile.js
檔案,呼叫init
任務,如下:
/** * Created by DreamBoy on 2017/1/8. */var init = require('./build/gulpfile.init.js');var prod = require('./build/gulpfile.prod.js');var dev = require('./build/gulpfile.dev.js');init();prod();dev();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
執行初始化
執行如下命令後,我們可以發現專案下自動建立了對應src目錄結構。
gulp init
- 1