詳解 Gulp4 和 Gulp3 的區別

来源:https://www.cnblogs.com/carver/archive/2023/01/29/17072881.html
-Advertisement-
Play Games

最近在開發幾個網站,為了優化一下前端代碼,就複習一下gulpjs,之前工作gulp用的版本比較老,但是今天看了新的版本,新的語法出了一下,但是為了時間,我決定使用之前gulp3的舊版本,後面發現自己環境的node的版本是最新的,所以不得讓我來瞭解一下gulp的新版本,裡面用到的最多就是commonj ...


最近在開發幾個網站,為了優化一下前端代碼,就複習一下gulpjs,之前工作gulp用的版本比較老,但是今天看了新的版本,新的語法出了一下,但是為了時間,我決定使用之前gulp3的舊版本,後面發現自己環境的node的版本是最新的,所以不得讓我來瞭解一下gulp的新版本,裡面用到的最多就是commonjs的模塊化,解釋如下:

gulp4的官網地址: https://www.gulpjs.com.cn/

gulp3的官網地址: https://v3.gulpjs.com.cn/

 

 下麵代碼瞭解新語法:

const { src, dest, watch, task, series, parallel } = require('gulp');//gulp的文件流API
const rename                                       = require('gulp-rename');//文件重命名的插件
const uglify                                       = require('gulp-uglify');//壓縮JS文件的插件
const cleanCss                                     = require('gulp-clean-css');//壓縮CSS文件的插件
const connect                                      = require('gulp-connect');//熱更新的插件
const webserver                                    = require('gulp-webserver');//熱更新的插件
const clean                                        = require('gulp-clean');//刪除文件的插件
const fileInclude                                  = require('gulp-file-include'); //公共代碼復用的插件
const htmlmin                                      = require('gulp-htmlmin');//壓縮HTML文件的插件

//設置源文件和輸出文件的目錄配置
const path = {
    'html'           : './src/',
    'css'            : './src/css/',
    'js'             : './src/js/',
    'lib'            : './src/lib/',
    'component'      : './src/component/',
    'html_dist'      : './dist/',
    'css_dist'       : './dist/css/',
    'js_dist'        : './dist/js/',
    'lib_dist'       : './dist/lib/',
    'component_dist' : './dist/component/'
};


//設置HTML壓縮任務
task('html', function () {
    var options = {
        removeComments                : true, //清除HTML中的註釋
        collapseWhitespace            : true, //去除HTML中的空格
        collapseBooleanAttributes     : true, //省略布爾屬性的值<input type="checkbox" checked="true"> 壓縮後為 <input type="checkbox" checked>
        removeEmptyAttributes         : true, //刪除所有空格作屬性值<input type="checkbox" id=""> 壓縮後為 <input type="checkbox">
        removeScriptTypeAttributes    : true, //刪除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes : true, //刪除<style>和<link>的type="text/css"
        minifyJS                      : true, //壓縮頁面JS
        minifyCSS                     : true //壓縮頁面CSS
    };
    return src(path.html + '*.html')
        .pipe(htmlmin(options))
        .pipe(dest(path.html_dist));
})

//設置CSS壓縮任務
task('css', function () {
    return src(path.css + '*.css')
        .pipe(cleanCss())
        .pipe(rename({
            'suffix' : '.min'//添加尾碼名
        }))
        .pipe(dest(path.css_dist));
});

//設置JS壓縮任務
task('js', function () {
    return src(path.js + '*.js')
        .pipe(uglify())
        .pipe(rename({
            'suffix' : '.min'//添加尾碼名
        }))
        .pipe(dest(path.js_dist));
});

//設置第三方依賴任務 => [無需合併和壓縮等操作,直接輸出到指定目錄]
task('lib', function () {
    return src(path.lib + '*.js')
        .pipe(dest(path.lib_dist));
})

//設置公共代碼復用的任務 => [相當於組件的封裝]
task('fileInclude', function () {
    return src(path.component + '*.html')
        .pipe(fileInclude({
            prefix   : '@@',
            basepath : '@file'
        }))
        .pipe(dest(path.component_dist));
});

//設置刪除上一次創建的dist文件夾的任務 => [在打包之前,一般需要先清空原來的文件,保證當前文件是最新的]
task('clean', function () {
    return src('dist', {
        allowEmpty : true
    }).pipe(clean());//清除dist目錄
});


// 創建熱載入任務
task('reload', function () {
    return src('dist')
        .pipe(connect.reload());
})


//設置實時監控任務[熱載入]
task('watch', function () {
    watch(path.html, series('html', 'reload'));//監控HTML任務
    watch(path.css + '*.css', series('css', 'reload'));//監控CSS任務
    watch(path.js + '*.js', series('js', 'reload'));//監控JS任務
    watch(path.lib + '*.js', series('lib', 'reload'));//監控第三方JS任務
    watch(path.component + '*.html', series('fileInclude', 'reload'));//監控復用代碼文件的任務 => [相當於封裝組件]
});


//設置後臺服務任務【 -----   ⭐ ️方式一 ️ ----- 】
// task('server', function (done) {
//     connect.server({
//         root       : 'dist',//設置後臺服務訪問的預設目錄
//         port       : 8888,//設置後臺預設的訪問埠
//         livereload : true//開啟熱載入
//     });
//     done();//執行該服務
// });


//設置後臺服務任務【 -----   ⭐ ️方式二 ️ ----- 】
task('server', function () {
    return src('dist')
        .pipe(webserver({
            host             : 'localhost',//預設訪問的地址【功能變數名稱或者ip】
            port             : 8023,//預設訪問的埠號
            path             : '/',//訪問當前訪問目錄的根目錄 例如:表示為 dist/
            livereload       : true,//開啟熱載入
            directoryListing : false,//true 設置為false時,訪問預設的index.html
            fallback         : 'index.html',//預設訪問的入口文件 相對於設置的path路徑來說
            open             : true,//是否自動打開瀏覽器
            /**
             *@desc 代理配置 如下:
             *      proxies: [
             *          {
             *              source: '/api', target: 'http://backend.api/api'
             *
             *          }
             *      ]
             */
            proxies          : []//代理配置
        }));
})


//執行所有任務 => [gulp3]
// task('default', series(
//     'clean',//刪除上一次的文件夾,來保持當前為最新的數據
//     parallel([ 'html', 'css', 'js', 'lib', 'fileInclude' ]),//並行執行所有任務
//     'server',//啟動服務任務
//     'watch'//啟動監視任務
// ));

//執行所有任務 => [gulp4]
module.exports.default = series(
    'clean',
    parallel([ 'html', 'css', 'js', 'lib', 'fileInclude' ]),
    'server',
    'watch'
);

/**
 * @desc 總結 gulp4 的series() 和 parallel() 兩個新方法
 *  說明如下:
 *          1. series(任務1,任務2,...) => 使任務按順序執行,第一個任務完成,才會執行下一個任務,簡單來說相當於一個隊列。
 *          2. parallel(任務1,任務2,...) => 以最大併發來運行的任務,任務同時執行。
 *
 * @desc 總結 gulp-connect() 和 gulp-webserver() 方法
 *   說明如下:
 *          1. gulp-connect()  => 內部connect.server()返回的是一個對象,
 *             所以不能直接返回,只能在處理完成之後,直接返回當前傳入的參數,該參數為該函數本身。
 *          2. gulp-webserver() => 該插件的特點是可以設置代理,當前處理的管道函數最後直接返回就好了,但是反應相對比較慢
 *
 * @desc 總結 gulp3【本章任務的處理方式哦】 和 gulp4 處理任務的方式:
 *          1. gulp3 處理任務方式是:gulp.task(任務名,處理函數)
 *          2. gulp4 處理任務方式是:module.exports.任務名 = 任務名(可以是一個匿名函數或者是函數名)
 *              寫法如下:
 *              const test = function(done) {
 *                          done();
 *                    };
 *              或者
 *                   function test(done) {
 *                      done();
 *                   }
 *              最後執行方法:module.exports.test = test
 *              後臺執行命令為:gulp test
 */

 

本文來自博客園,作者:Carver-聽風,轉載請註明原文鏈接:https://www.cnblogs.com/carver/p/17072881.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 引入 考慮實現一種機械泵控制項。 機械泵是工業中通常用來製造真空的一類設備,我們在繪製界面UI時希望可以生動形象地來表述一個機械泵,下麵講述了一種簡單的實現。 二 MechanicalPumpControl 聲明一個MechanicalPumpControl的自定義控制項,它繼承自Control類。 ...
  • 前言 Keil C51 是 51 系列相容單片機 C 語言軟體開發系統,支持 8051 微控制器體繫結構的 Keil 開發工具,適合每個階段的開發人員,不管是專業的應用工程師,還是剛學習嵌入式軟體開發的學生。 本篇博主將詳細介紹嵌入式集成開發環境 Keil C51 的安裝與註冊方法,以及國產 STC ...
  • xz是什麼 高壓縮率的工具,它使用 LZMA2 壓縮演算法,生成的壓縮文件比傳統使用的 gzip、bzip2 生成的壓縮文件更小, 不過xz也有一個壞處就是壓縮時間比較長,比7z壓縮時間還長一些。不過壓縮主要用於歸檔,不介意的可以忽略。 擅長壓縮文本和日誌文件,針對這塊的壓縮率,是目前我發現效率最高的 ...
  • Docker的常用命令 幫助命令 docker version # docker版本 docker info # 顯示docker的系統信息,包括鏡像和容器的數量 docker [命令] --help # 查看某個具體的命令 鏡像命令 查看下載的所有鏡像 # docker images REPOSI ...
  • 一:背景 1. 講故事 大家都知道資料庫應用程式 它天生需要圍繞著數據文件打轉,諸如包含數據的 .mdf,事務日誌的 .ldf,很多時候深入瞭解這兩類文件的合成原理,差不多對資料庫就能理解一半了,關於 .mdf 的合成前面的文章已經有所介紹,這篇我們來聊一下 .ldf 的一些內部知識,比如 LSN。 ...
  • props props簡單使用 class Person extends React.Component { render() { return ( <ul> <li>姓名:{this.props.name}</li> <li>年齡:{this.props.age}</li> <li>性別:{thi ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 需求描述 目前大多數PC端應用都有配套的移動端APP,如微信,淘寶等,通過使用手機APP上的掃一掃功能去掃頁面二維碼圖片進行登錄,使得用戶登錄操作更方便,安全,快捷。 思路解析 PC 掃碼原理? 掃碼登錄功能涉及到網頁端、伺服器和手機端, ...
  • 一、文件上傳 1、普通文件上傳 JavaScript 可以使用表單提交來實現文件上傳。首先,在 HTML 中創建一個文件輸入框: <input type="file" id="fileInput"> 然後,在 JavaScript 中獲取文件輸入框的引用,併在其上設置事件監聽器,如下所示: var ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...