成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

gulp排除已壓縮文件思路

Aklman / 2546人閱讀

摘要:默認(rèn)排除語(yǔ)法的弊端有個(gè)時(shí)候我們需要時(shí)用排除已經(jīng)壓縮過(guò)的,等。主要用兩個(gè)屬性來(lái)描述文件,它們分別是路徑及內(nèi)容。判斷函數(shù)接受一個(gè)文件對(duì)象,返回一個(gè)值。官方例子僅壓縮符合條件的文件,丹斯所有文件包括不符合條件的都會(huì)被發(fā)送到目錄。

gulp默認(rèn)排除語(yǔ)法的弊端

有個(gè)時(shí)候我們需要時(shí)用gulp排除已經(jīng)壓縮過(guò)的js,css等。如果以壓縮文件是以".min.js"之類命名規(guī)范的還好,如果不是呢?而且還有其他一些場(chǎng)景也會(huì)有需要。
gulp默認(rèn)支持glob格式,排除語(yǔ)法為!
舉幾個(gè)例子:
排除目錄

gulp.src([
    baseDir + "/**",                              // Include all
    "!" + baseDir + "/excl1{,/**}",               // Exclude excl1 dir
    "!" + baseDir + "/excl2/**/!(.gitignore)",    // Exclude excl2 dir, except .gitignore
], { dot: true });

排除文件:

gulp.src(["css/**/!(ignore.css)*.css"])
gulp.src([
      "!css/ignnore.css",
      "css/*.css"
    ])

這確實(shí)能夠排除一些文件。但是還不算強(qiáng)大,不能滿足一些復(fù)雜的場(chǎng)景。
而且還存在這樣一個(gè)問(wèn)題:當(dāng)我有一個(gè)jquery.min.js,在壓縮js時(shí),我不想對(duì)它進(jìn)行壓縮,但同時(shí)我又想將其輸出到dist目錄下。單純采用上面這種方式需要"曲線救國(guó)",場(chǎng)景如下:

gulp.task("jsmin", function (cb) {
        return gulp.src([SRC_DIR+"/**/*.js",,"!"+SRC_DIR+"/**/*.min.js"])
        .pipe(sourcemaps.init())
        .pipe(uglify({mangle: {except: ["require" ,"exports" ,"module" ,"$"]}})) //排除混淆關(guān)鍵字
        .pipe(sourcemaps.write("."))
        .pipe(gulp.dest(DEST_DIR));

});

很遺憾地告訴你,*.min.js并沒(méi)有被拷貝到DEST_DIR,當(dāng)然曲線救國(guó)可以如下:

gulp.task("copy", () =>{
    return gulp.src([SRC_DIR+"/**/*.min.js"])
        .pipe(gulp.dest(DEST_DIR));
    }
);

但是,這不是很優(yōu)雅。而且上面我們也說(shuō)了只是采用glob語(yǔ)法對(duì)文件進(jìn)行排除不適用于復(fù)雜的場(chǎng)景。

Vinyl文件系統(tǒng)

詳細(xì)說(shuō)明,請(qǐng)參考探究Gulp的Stream
現(xiàn)在這里貼出,后面會(huì)說(shuō)明其目的。
雖然Gulp使用的是Stream,但卻不是普通的Node Stream,實(shí)際上,Gulp(以及Gulp插件)用的應(yīng)該叫做Vinyl File Object Stream。
這里的Vinyl,是一種虛擬文件格式。Vinyl主要用兩個(gè)屬性來(lái)描述文件,它們分別是路徑(path)及內(nèi)容(contents)。具體來(lái)說(shuō),Vinyl并不神秘,它仍然是JavaScript Object。Vinyl官方給了這樣的示例:

var File = require("vinyl");
var coffeeFile = new File({
  cwd: "/",
  base: "/test/",
  path: "/test/file.coffee",
  contents: new Buffer("test = 123")
});

從這段代碼可以看出,Vinyl是Object,path和contents也正是這個(gè)Object的屬性。

解決方案描述:

可以采用gulp插件來(lái)實(shí)現(xiàn)更為強(qiáng)大的排除。主要有以下幾個(gè)插件:
gulp-ignore,支持通過(guò)boolean,stat對(duì)象,函數(shù)來(lái)判斷是否排除與包含。判斷函數(shù)接受一個(gè)Vinyl文件對(duì)象,返回一個(gè)boolean值。
gulp-filter,支持glob模式、函數(shù)過(guò)濾,以及過(guò)濾后恢復(fù)
gulp-if,支持條件判斷(支持函數(shù)條件)來(lái)控制相關(guān)流程。
下面具體說(shuō)明如何使用

gulp-ignore:

API
exclude(condition [, minimatchOptions])
Exclude files whose file.path matches, include everything else
include(condition [, minimatchOptions])
Include files whose file.path matches, exclude everything else
參數(shù)說(shuō)明:
condition:類型可以為 boolean or stat object or function
當(dāng)為函數(shù)是接受一個(gè)vinyl file返回boolean值

下面貼出官方例子:

var gulpIgnore = require("gulp-ignore");
var uglify = require("gulp-uglify");
var jshint = require("gulp-jshint");

var condition = "./gulpfile.js";

gulp.task("task", function() {
  gulp.src("./**/*.js")
    .pipe(jshint())
    .pipe(gulpIgnore.exclude(condition))
    .pipe(uglify())
    .pipe(gulp.dest("./dist/"));
});
var gulpIgnore = require("gulp-ignore");
var uglify = require("gulp-uglify");
var jshint = require("gulp-jshint");

var condition = "./public/**.js";

gulp.task("task", function() {
  gulp.src("./**/*.js")
    .pipe(jshint())
    .pipe(gulpIgnore.include(condition))
    .pipe(uglify())
    .pipe(gulp.dest("./dist/"));
});

實(shí)現(xiàn):

var condition = function(f){
    if(f.path.endswith(".min.js")){
        return true;
    }
    return false
};

gulp.task("jsmin", function (cb) {
        return gulp.src([SRC_DIR+"/**/*.js"])
        .pipe(gulpIgnore.exclude(condition))
        .pipe(sourcemaps.init())
        .pipe(uglify({mangle: {except: ["require" ,"exports" ,"module" ,"$"]}})) //排除混淆關(guān)鍵字
        .pipe(sourcemaps.write("."))
        .pipe(gulp.dest(DEST_DIR));

});

優(yōu)點(diǎn):很明顯,你可以在條件函數(shù)中做你想做的任何事情,包括使用正則表達(dá)式等。
缺點(diǎn):和默認(rèn)情況一樣,不支持被排除文件的拷貝

gulp-if

和gulp-ignore作者是同一個(gè)人
API:
gulpif(condition, stream [, elseStream, [, minimatchOptions]])
gulp-if will pipe data to stream whenever condition is truthy.
If condition is falsey and elseStream is passed, data will pipe to elseStream
這就類似于三目運(yùn)算符,功能用偽代碼表示就是if condition then stream(data) else elseStream(data)
After data is piped to stream or elseStream or neither, data is piped down-stream.

參數(shù)說(shuō)明:
condition 與gulp-ignore一致。
Type: boolean or stat object or function that takes in a vinyl file and returns a boolean or RegularExpression that works on the file.path

stream
Stream for gulp-if to pipe data into when condition is truthy.

elseStream
Optional, Stream for gulp-if to pipe data into when condition is falsey.

minimatchOptions
Optional, if it"s a glob condition, these options are passed to minimatch.

官方例子:

var gulpif = require("gulp-if");
var uglify = require("gulp-uglify");

var condition = true; // TODO: add business logic

gulp.task("task", function() {
  gulp.src("./src/*.js")
    .pipe(gulpif(condition, uglify()))
    .pipe(gulp.dest("./dist/"));
});

Only uglify the content if the condition is true, but send all the files to the dist folder
僅壓縮符合條件的文件,丹斯所有文件(包括不符合條件的)都會(huì)被發(fā)送到dist目錄。

實(shí)現(xiàn):

var condition = function(f){
    if(f.path.endswith(".min.js")){
        return false;
    }
    return true;
};

gulp.task("jsmin", function (cb) {
        return gulp.src([SRC_DIR+"/**/*.js"])
        .pipe(sourcemaps.init())
        .pipe(gulpif(condition, uglify({mangle: {except: ["require" ,"exports" ,"module" ,"$"]}}))) //排除混淆關(guān)鍵字
        .pipe(sourcemaps.write("."))
        .pipe(gulp.dest(DEST_DIR));

});
gulp-filter

API
filter(pattern, [options])
Returns a transform stream with a .restore object.
參數(shù)說(shuō)明:
pattern
Type: string, array, function
Accepts a string/array with globbing patterns which are run through multimatch.
如果是函數(shù),則應(yīng)該接受一個(gè) vinyl file object作為第一個(gè)參數(shù),return true/false whether to include the file:

filter(file => /unicorns/.test(file.path));

選項(xiàng)options
Type: object
Accepts minimatch options.
Note: Set dot: true if you need to match files prefixed with a dot (eg. .gitignore).

options.restore
Type: boolean
Default: false
Restore filtered files.

options.passthrough
Type: boolean
Default: true

When set to true filtered files are restored with a PassThrough stream, otherwise, when set to false, filtered files are restored as a Readable stream.

官方例子:

const gulp = require("gulp");
const uglify = require("gulp-uglify");
const filter = require("gulp-filter");

gulp.task("default", () => {
    // create filter instance inside task function
    const f = filter(["**", "!*src/vendor"], {restore: true});

    return gulp.src("src/**/*.js")
        // filter a subset of the files
        .pipe(f)
        // run them through a plugin
        .pipe(uglify())
        // bring back the previously filtered out files (optional)
        .pipe(f.restore)
        .pipe(gulp.dest("dist"));
});
gulp.task("defaultmulti", () => {
    const jsFilter = filter("**/*.js", {restore: true});
    const lessFilter = filter("**/*.less", {restore: true});

    return gulp.src("assets/**")
        .pipe(jsFilter)
        .pipe(concat("bundle.js"))
        .pipe(jsFilter.restore)
        .pipe(lessFilter)
        .pipe(less())
        .pipe(lessFilter.restore)
        .pipe(gulp.dest("out/"));
});

實(shí)戰(zhàn):

var condition = function(f){
        if(f.path.endswith(".min.js")){
            return false;
        }
        return true;
    };
const jsFilter = filter(condition, {restore: true});
   
    gulp.task("jsmin", function (cb) {
            return gulp.src([SRC_DIR+"/**/*.js"])
            .pipe(jsFilter)
            .pipe(sourcemaps.init())
            .pipe(uglify({mangle: {except: ["require" ,"exports" ,"module" ,"$"]}})) //排除混淆關(guān)鍵字
            .pipe(sourcemaps.write("."))
            .pipe(jsFilter.restore)
            .pipe(gulp.dest(DEST_DIR));
    
    });

部分文件被壓縮,所有文件都會(huì)被發(fā)送到DEST_DIR

小結(jié)

如何選擇?
gulp-if:可以完美解決問(wèn)題,且足夠優(yōu)雅。
gulp-filter:可以完美解決問(wèn)題,但是相比gulp-if略顯麻煩。更復(fù)雜的場(chǎng)景下用gulp-filter比gulp-if方便。
gulp-ignore:更為強(qiáng)大的過(guò)濾,在僅僅只是過(guò)濾而不拷貝的情況下首推。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91330.html

相關(guān)文章

  • gulpJs使用總結(jié)

    摘要:通常情況下我們不需要用到。為任務(wù)名請(qǐng)不要在名字中使用空格是當(dāng)前定義的任務(wù)需要依賴的其他任務(wù),為一個(gè)數(shù)組。為要監(jiān)視的文件匹配模式,規(guī)則和用法與方法中的相同。 1.gulp安裝 1.首先確保你已經(jīng)正確安裝了nodejs環(huán)境。然后可以全局方式安裝gulp: $ npm install -g gulp 我們可以檢查一下gulp版本 $ gulp -v 這樣就完成了對(duì)全局的安裝2.如果想在安裝的...

    ideaa 評(píng)論0 收藏0
  • gulpJs使用總結(jié)

    摘要:通常情況下我們不需要用到。為任務(wù)名請(qǐng)不要在名字中使用空格是當(dāng)前定義的任務(wù)需要依賴的其他任務(wù),為一個(gè)數(shù)組。為要監(jiān)視的文件匹配模式,規(guī)則和用法與方法中的相同。 1.gulp安裝 1.首先確保你已經(jīng)正確安裝了nodejs環(huán)境。然后可以全局方式安裝gulp: $ npm install -g gulp 我們可以檢查一下gulp版本 $ gulp -v 這樣就完成了對(duì)全局的安裝2.如果想在安裝的...

    chadLi 評(píng)論0 收藏0
  • gulpJs使用總結(jié)

    摘要:通常情況下我們不需要用到。為任務(wù)名請(qǐng)不要在名字中使用空格是當(dāng)前定義的任務(wù)需要依賴的其他任務(wù),為一個(gè)數(shù)組。為要監(jiān)視的文件匹配模式,規(guī)則和用法與方法中的相同。 1.gulp安裝 1.首先確保你已經(jīng)正確安裝了nodejs環(huán)境。然后可以全局方式安裝gulp: $ npm install -g gulp 我們可以檢查一下gulp版本 $ gulp -v 這樣就完成了對(duì)全局的安裝2.如果想在安裝的...

    zhaochunqi 評(píng)論0 收藏0
  • Gulp入門(mén)教程

    摘要:本教程分為兩個(gè)部分先講解的使用及參數(shù)說(shuō)明,后以一個(gè)實(shí)際項(xiàng)目案例作為演練?;蜃詣?dòng)監(jiān)視文件變化并執(zhí)行指定的任務(wù)。項(xiàng)目代碼下載其他文獻(xiàn)官方接口文檔很多演示項(xiàng)目代碼其它教程文章 Gulp介紹 Gulp是一個(gè)前端開(kāi)發(fā)的自動(dòng)化構(gòu)建工具。前端開(kāi)發(fā)往往需要把LESS/SCSS文件進(jìn)行編譯成CSS文件,JavaScript多文件合并成一個(gè)文件并壓縮以及一些其他需要重復(fù)性操作的工作。而Gulp就是通過(guò)簡(jiǎn)單...

    levius 評(píng)論0 收藏0
  • 如何gulp壓縮,丑化代碼

    摘要:其中使用代碼如下部分丑化代碼注意路徑的寫(xiě)法合并所有到壓縮后的文件名丑化代碼,相當(dāng)加密排除關(guān)鍵字注意路徑的寫(xiě)法 為什么使用 最近在迭代公司的項(xiàng)目,發(fā)現(xiàn)項(xiàng)目有如下缺點(diǎn): 代碼沒(méi)有壓縮,js文件,內(nèi)存大,放在服務(wù)器上占空間; 源代碼沒(méi)有混淆或者丑化處理,本公司的程序員寫(xiě)出來(lái)的代碼和高質(zhì)量邏輯容易被其他公司的程序員盜用; js,css 文件數(shù)量多,瀏覽器加載起來(lái)會(huì)手忙腳亂和生氣。 這個(gè)小項(xiàng)...

    linkin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<