gulp自動(dòng)化構(gòu)建思路

1.引入gulp模塊

yarn add gulp --dev

2.添加入口文件gulpfile.js
3.引入gulp批量插件gulp-load-plugins ,減少手動(dòng)引入每一個(gè)gulp插件

yarn add gulp-load-plugins --dev

4.樣式編譯,并對(duì)css文件進(jìn)行編譯

yarn add gulp-sass
const style = () => {
  return src('src/assets/styles/*.scss', { base: 'src' })//通過base確定轉(zhuǎn)換過后的基準(zhǔn)目錄
    .pipe(plugins.sass({ outputStyle: 'expanded' }))//完全展開
    .pipe(dest('temp'))//建立temp时迫,防止邊讀取邊寫入造成文件無法生成問題
}

5.腳本編譯

使用gulp-babel、@babel/core钾麸、@babel/preset-env插件編譯js文件,將es6轉(zhuǎn)換為es5

yarn add gulp-babel @babel/core @babel/preset-env --dev
const script = () => {
  return src('src/assets/scripts/*.js', { base: 'src' })
    .pipe(plugins.babel({ presets: ['@babel/preset-env'] }))
    .pipe(dest('temp'))
}

6.頁面模板編譯

引入gulp-swin插件編譯

yarn add gulp-swig --dev
const page = () => {
  return src('src/*.html', { base: 'src' })
    .pipe(plugins.swig({ data, defaults: { cache: false } })) // 防止模板緩存導(dǎo)致頁面不能及時(shí)更新
    .pipe(dest('temp'))
}

7.圖片和字體文件轉(zhuǎn)換

一般字體不需要壓縮宙帝,主要是圖片壓縮

yarn add gulp-imagemin --dev
const image = () => {
  return src('src/assets/images/**', { base: 'src' })
    .pipe(plugins.imagemin())
    .pipe(dest('dist'))
}

const font = () => {
  return src('src/assets/fonts/**', { base: 'src' })
    .pipe(plugins.imagemin())
    .pipe(dest('dist'))
}

8.其他文件及文件清除

public文件直接拷貝;使用del插件將原先編譯后的文件目錄刪除

yarn add del --dev
const extra = () => {
  return src('public/**', { base: 'public' })
    .pipe(dest('dist'))
}
const clean = () => {
  return del(['dist', 'temp'])
}

9.開發(fā)服務(wù)器

安裝browser-sync插件募闲,當(dāng)代碼修改并保存時(shí)步脓,瀏覽器熱更新,提高開發(fā)效率

yarn add browser-sync --dev
const serve = () => {
  //監(jiān)聽源文件變化
  watch('src/assets/styles/*.scss', style)
  watch('src/assets/scripts/*.js', script)
  watch('src/*.html', page)
  //減少構(gòu)建次數(shù)
  watch([
    'src/assets/images/**',
    'src/assets/fonts/**',
    'public/**'
  ], bs.reload)

  bs.init({
    notify: false,//服務(wù)器提示
    port: 2080,//端口
    // open: false,//默認(rèn)開啟瀏覽器
    // files: 'temp/**',//啟動(dòng)后自動(dòng)監(jiān)聽的文件
    server: {
      baseDir: ['temp', 'src', 'public'],//設(shè)置根目錄
      routes: {//特殊路由浩螺,優(yōu)先basedir從這里尋找文件
        '/node_modules': 'node_modules'     }
    }
  })
}

10.useref文件引用處理及文件壓縮

1.使用 gulp-useref 插件可以將 HTML 引用的多個(gè) CSS 和 JS 合并起來靴患,減小依賴的文件個(gè)數(shù),從而減少瀏覽器發(fā)起的請(qǐng)求次數(shù)要出。gulp-useref 根據(jù)注釋將 HTML 中需要合并壓縮的區(qū)塊找出來蚁廓,對(duì)區(qū)塊內(nèi)的所有文件進(jìn)行合并。需要注意的是厨幻,gulp-useref只負(fù)責(zé)合并,不負(fù)責(zé)壓縮

  1. 使用 gulp-if 插件來判斷讀取流文件類型腿时,并壓縮對(duì)應(yīng)文件
    
yarn add gulp-if --dev
yarn add gulp-htmlmin gulp-uglify gulp-clean-css --dev
yarn add gulp-useref --dev
const useref = () => {
  return src('temp/*.html', { base: 'temp' })
    .pipe(plugins.useref({ searchPath: ['temp', '.'] }))
    .pipe(plugins.if(/\.js$/, plugins.uglify()))
    .pipe(plugins.if(/\.css$/, plugins.cleanCss()))
    .pipe(plugins.if(/\.html$/, plugins.htmlmin({
      collapseWhitespace: true,//刪除空格
      minifyCSS: true,//壓縮行內(nèi)樣式
      minifyJS: true//壓縮行內(nèi)js
    })))
    .pipe(dest('dist'))
}

11.重新梳理構(gòu)建過程及完整代碼

// 實(shí)現(xiàn)這個(gè)項(xiàng)目的構(gòu)建任務(wù)
const { src, dest, parallel, series, watch } = require('gulp')
//建立temp况脆,防止邊讀取邊寫入造成文件無法生成問題
//區(qū)別開發(fā)時(shí)build和上線之前構(gòu)建,建立個(gè)臨時(shí)目錄temp批糟,最終上線用dist
const del = require('del')
// yarn add browser-sync --dev
const browserSync = require('browser-sync')

const loadPlugins = require('gulp-load-plugins')
//自動(dòng)加載插件 yarn add gulp-load-plugins --dev
const plugins = loadPlugins()
//創(chuàng)建開發(fā)服務(wù)器
const bs = browserSync.create()

const data = {
  menus: [
    {
      name: 'Home',
      icon: 'aperture',
      link: 'index.html'
    },
    {
      name: 'Features',
      link: 'features.html'
    },
    {
      name: 'About',
      link: 'about.html'
    },
    {
      name: 'Contact',
      link: '#',
      children: [
        {
          name: 'Twitter',
          link: 'https://twitter.com/w_zce'
        },
        {
          name: 'About',
          link: 'https://weibo.com/zceme'
        },
        {
          name: 'divider'
        },
        {
          name: 'About',
          link: 'https://github.com/zce'
        }
      ]
    }
  ],
  pkg: require('./package.json'),
  date: new Date()
}

const clean = () => {
  return del(['dist', 'temp'])
}

const style = () => {
  return src('src/assets/styles/*.scss', { base: 'src' })//通過base確定轉(zhuǎn)換過后的基準(zhǔn)目錄
    .pipe(plugins.sass({ outputStyle: 'expanded' }))//完全展開
    .pipe(dest('temp'))//建立temp格了,防止邊讀取邊寫入造成文件無法生成問題
}

const script = () => {
  return src('src/assets/scripts/*.js', { base: 'src' })
    .pipe(plugins.babel({ presets: ['@babel/preset-env'] }))
    .pipe(dest('temp'))
}

const page = () => {
  return src('src/*.html', { base: 'src' })
    .pipe(plugins.swig({ data, defaults: { cache: false } })) // 防止模板緩存導(dǎo)致頁面不能及時(shí)更新
    .pipe(dest('temp'))
}

const image = () => {
  return src('src/assets/images/**', { base: 'src' })
    .pipe(plugins.imagemin())
    .pipe(dest('dist'))
}

const font = () => {
  return src('src/assets/fonts/**', { base: 'src' })
    .pipe(plugins.imagemin())
    .pipe(dest('dist'))
}

const extra = () => {
  //拷貝
  return src('public/**', { base: 'public' })
    .pipe(dest('dist'))
}
//初始化服務(wù)器配置
const serve = () => {
  //監(jiān)聽源文件變化
  watch('src/assets/styles/*.scss', style)
  watch('src/assets/scripts/*.js', script)
  watch('src/*.html', page)
  // watch('src/assets/images/**', image)
  // watch('src/assets/fonts/**', font)
  // watch('public/**', extra)
  //減少構(gòu)建次數(shù)
  watch([
    'src/assets/images/**',
    'src/assets/fonts/**',
    'public/**'
  ], bs.reload)

  bs.init({
    notify: false,//服務(wù)器提示
    port: 2080,//端口
    // open: false,//默認(rèn)開啟瀏覽器
    // files: 'dist/**',//指定dist文件發(fā)生改變及時(shí)熱部署
    server: {
      baseDir: ['temp', 'src', 'public'],//設(shè)置根目錄
      routes: {//特殊路由,優(yōu)先basedir從這里尋找文件
        '/node_modules': 'node_modules'     }
    }
  })
}

const useref = () => {
  //yarn add gulp-useref --dev
  return src('temp/*.html', { base: 'temp' })
    .pipe(plugins.useref({ searchPath: ['temp', '.'] }))
    // html js css
    //yarn add gulp-htmlmin gulp-uglify gulp-clean-css --dev
    //yarn add gulp-if --dev
    .pipe(plugins.if(/\.js$/, plugins.uglify()))
    .pipe(plugins.if(/\.css$/, plugins.cleanCss()))
    .pipe(plugins.if(/\.html$/, plugins.htmlmin({
      collapseWhitespace: true,//刪除空格
      minifyCSS: true,//壓縮行內(nèi)樣式
      minifyJS: true//壓縮行內(nèi)js
    })))
    .pipe(dest('dist'))
}

const compile = parallel(style, script, page)

// 上線之前執(zhí)行的任務(wù)
const build =  series(
  clean,
  parallel(
    series(compile, useref),//useref依賴compile
    image,
    font,
    extra
  )
)
//開發(fā)時(shí)執(zhí)行
const develop = series(compile, serve)

module.exports = {
  clean,
  build,
  develop
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徽鼎,一起剝皮案震驚了整個(gè)濱河市盛末,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌否淤,老刑警劉巖悄但,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異石抡,居然都是意外死亡檐嚣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啰扛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎京,“玉大人,你說我怎么就攤上這事隐解“暗郏” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵煞茫,是天一觀的道長帕涌。 經(jīng)常有香客問我摄凡,道長,這世上最難降的妖魔是什么宵膨? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任架谎,我火速辦了婚禮,結(jié)果婚禮上辟躏,老公的妹妹穿的比我還像新娘谷扣。我一直安慰自己,他們只是感情好捎琐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布会涎。 她就那樣靜靜地躺著,像睡著了一般瑞凑。 火紅的嫁衣襯著肌膚如雪末秃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天籽御,我揣著相機(jī)與錄音练慕,去河邊找鬼。 笑死技掏,一個(gè)胖子當(dāng)著我的面吹牛铃将,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哑梳,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼劲阎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸠真?” 一聲冷哼從身側(cè)響起悯仙,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吠卷,沒想到半個(gè)月后锡垄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撤嫩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年偎捎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序攘。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茴她,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出程奠,到底是詐尸還是另有隱情丈牢,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布瞄沙,位于F島的核電站己沛,受9級(jí)特大地震影響慌核,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜申尼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一垮卓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师幕,春花似錦粟按、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至后控,卻和暖如春庙曙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩淘。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工捌朴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人张抄。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓男旗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欣鳖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容