
gulp-if API完整參考condition、elseStream與minimatchOptions全解析【免費下載鏈接】gulp-ifConditionally run a task項目地址: https://gitcode.com/gh_mirrors/gu/gulp-if在 gulp 構建流程中如何讓某個處理任務有條件地執行gulp-if 正是為此而生的條件流插件。本文是一份面向初學者的gulp-if API 完整參考將逐一拆解condition、elseStream與minimatchOptions三個核心參數并結合源碼幫你徹底搞懂 gulp-if 的用法。讀完你就能用 gulp-if 寫出像 if/else 一樣清晰的構建管道。什么是 gulp-if三分鐘認識這個條件處理插件gulp-if 的本質是一個三元插件它像 JavaScript 里的if...else一樣根據condition的判斷結果把每個 vinyl 文件送往不同的下游流。官方描述只有一句話——Conditionally run a task條件化執行任務但它在實際構建腳本里的價值遠超想象按環境壓縮代碼、按文件類型分流處理、跳過測試文件……全靠它。它的實現非常精巧核心代碼只有 20 多行位于 index.js。依賴gulp-match條件匹配與ternary-stream三元分流兩個庫邏輯清晰、易于維護。30秒快速上手安裝與第一個 gulp-if 用法先安裝依賴npm install gulp-if最經典的場景只有發布環境才壓縮 JS 代碼。var gulpif require(gulp-if); var uglify require(gulp-uglify); var condition process.env.NODE_ENV production; gulp.task(build, function () { return gulp.src(./src/*.js) .pipe(gulpif(condition, uglify())) .pipe(gulp.dest(./dist/)); });是不是很像口語化的如果滿足條件就執行壓縮接下來我們進入正題逐個解析 gulp-if API 的四個參數。gulp-if API 簽名四個參數一次看懂gulp-if 的完整調用形式是gulpif(condition, stream [, elseStream [, minimatchOptions]])下面用一張官方流程圖直觀展示數據的流向input輸入→ condition 判斷 → 命中則走 stream未命中則跳過或走 elseStream → 最終匯聚到 output。各參數職責如下參數是否必填作用condition必填判斷條件決定文件流向stream必填條件為真時文件流入的流elseStream可選條件為假時文件流入的流minimatchOptions可選當 condition 為 glob 時傳給 minimatch 的選項condition 參數詳解gulp-if 支持哪4種判斷方式condition是 gulp-if 的靈魂它支持 4 種類型布爾值、函數、正則表達式、glob 字符串。布爾值 condition最簡單的開關直接傳true或false適用于構建參數、環境變量這類全局開關。源碼中對布爾類型做了特殊優化——直接返回對應分支的流根本不會加載另一條流性能最優if (typeof condition boolean) { return condition ? trueChild : (falseChild || through2.obj()); }函數 condition最靈活的判斷函數接收當前 vinylfile對象返回布爾值。適合按文件內容、路徑做精細判斷var condition function (file) { return file.path.indexOf(min.js) -1; };在 test/fn.js 中可以看到函數 condition 會為每一個文件調用一次因此也可以實現同一批文件中部分處理、部分跳過的效果。正則表達式 condition按路徑匹配正則作用于file.path命中即走主分支。例如只壓縮src目錄下的文件var condition /^src\//;glob 字符串 condition最常用的寫法直接傳*.js、!node_modules/**這樣的 glob 模式底層交給gulp-match完成匹配。這也是能觸發minimatchOptions的唯一方式下一節會詳細展開。stream 與 elseStream 參數if/else 雙分支怎么配stream是必填參數條件為真時文件進入它處理。而elseStream是點睛之筆——它讓 gulp-if 從單分支 if升級為真正的三元 if/else。經典用法壓縮版與非壓縮版分流處理。var condition function (file) { return !file.path.endsWith(.min.js); }; gulp.src(./src/**/*.js) .pipe(gulpif(condition, uglify(), beautify())) .pipe(gulp.dest(./dist/));滿足條件走uglify()壓縮否則走beautify()美化最后一起輸出。如果不傳elseStream未命中的文件會原樣透傳不會丟失。minimatchOptions 參數glob 匹配的精細控制當condition傳入 glob 字符串時minimatchOptions會把選項透傳給 minimatch 庫用于控制匹配細節。常見配置包括dot: true— 允許匹配以.開頭的隱藏文件nocase: true— 忽略大小寫matchBase: true— 只按文件名匹配不關心目錄層級var options { dot: true }; gulp.src(./src/**) .pipe(gulpif(*.js, uglify(), null, options)) .pipe(gulp.dest(./dist/));需要提醒的是minimatchOptions只在 condition 為 glob 字符串時生效布爾值、函數、正則條件都會忽略它。進階技巧gulp-if 與 lazypipe 的完美配合當條件分支需要串聯多個流時直接寫會又長又亂。配合lazypipe可以先把分支管道封裝成函數再塞進 gulp-ifvar lazypipe require(lazypipe); var lintChannel lazypipe() .pipe(jshint) .pipe(jshint.reporter, fail); gulp.task(scripts, function () { return gulp.src(paths.scripts.src) .pipe(gulpif(linting, lintChannel())) .pipe(gulp.dest(paths.scripts.dest)); });注意lazypipe 會緩存函數參數所以 gulp-if 的流參數必須在管道內部即時實例化通常用一個匿名函數包一層即可。常見報錯與注意事項報錯 child action is requiredstream參數是必填的缺失時 gulp-if 會直接拋出這個錯誤見 index.js。布爾條件性能最佳布爾值不會逐文件判斷也不會加載另一條流能用就用。與行為異常的插件搭配時某些插件在被跳過/切換分支時表現異常這通常不是 gulp-if 的鍋而是插件自身對流的處理不規范。徹底排除文件用 glob想在源頭就過濾掉文件如node_modules建議直接在gulp.src([./*.js, !./node_modules/**])里排除比進流后再丟棄更高效。總結gulp-if 用極簡的 API 解決了 gulp 構建中最常見的條件分流需求condition決定去向stream與elseStream定義兩條分支minimatchOptions精細調控 glob 匹配。配合流程圖理解數據流向再參照 test/ 下的測試用例動手實踐你很快就能在真實項目中游刃有余地使用它。【免費下載鏈接】gulp-ifConditionally run a task項目地址: https://gitcode.com/gh_mirrors/gu/gulp-if創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考