首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Browserify + Watchify + Tsify + Gulp的性能问题

Browserify + Watchify + Tsify + Gulp的性能问题
EN

Stack Overflow用户
提问于 2015-11-20 09:03:31
回答 1查看 2.3K关注 0票数 9

我有一个“中等”的类型记录应用程序(就像在其他较小的库中一样,不是琐碎的,但也不是企业级的,数千行),它依赖于jQuery、React和SocketIO。

我现在的吞咽文件是:

代码语言:javascript
复制
var gulp = require("gulp"),
    $ = require("gulp-load-plugins")(),
    _ = require("lodash"),
    tsify = require("tsify"),
    browserify = require("browserify"),
    source = require("vinyl-source-stream"),
    debowerify = require("debowerify"),
    watchify = require("watchify"),
    lr = require("tiny-lr"),
    buffer = require("vinyl-buffer");

var lrServer = lr();

var config = {
    scripts: {
        base: __dirname + "/Resources/Scripts",
        main: "Application.ts",
        output: "App.js"
    },

    styles: {
        base: __dirname + "/Resources/Styles",
        sheets: ["Application.less", "Preload.less"],
        autoprefixer: ["last 2 version", "safari 5", "ie 8", "ie 9", "opera 12.1", "ios 6", "android 4"]
    },

    publicPath: __dirname + "/wwwroot"
};

function printError(err) {
    $.util.log($.util.colors.red.bold(err.type + " " + err.name + ":"), $.util.colors.white(err.message));
    this.emit("end");
}

function buildScripts(watch, debug) {
    var bundler = browserify({
            basedir: config.scripts.base,
            debug: false,
            entries: [config.scripts.base + "/" + config.scripts.main],
            cache: {},
            packageCache: {}
        })
        .plugin(tsify, {
            module: "commonjs",
            target: "es5",
            jsx: "react"
        })
        .transform(debowerify);

    function build() {
        return bundler.bundle()
            .on("error", printError)
            .pipe(source(config.scripts.output))
            .pipe($.if(!debug, buffer()))
            .pipe($.if(!debug, $.uglify()))
            .pipe(gulp.dest(config.publicPath + "/" + "scripts"));
    }

    if (!watch)
        return build();

    bundler
        .plugin(watchify)
        .on("update", function () {
            $.util.log($.util.colors.grey("Building scripts..."));
            build();
        })
        .on("time", function (timeMs) {
            $.util.log(
                $.util.colors.grey("Finished"),
                $.util.colors.cyan("'dev.scripts.watch' after"),
                $.util.colors.magenta(timeMs.toLocaleString() + " ms"));
        });

    return build();
}

gulp.task("prod.scripts", function() {
    return buildScripts(false, false);
});

gulp.task("dev.scripts", function () {
    return buildScripts(false, true);
});

gulp.task("dev.scripts.watch", function () {
    return buildScripts(true, true);
});

gulp.task("prod.styles", function () {
    return gulp
        .src(_.map(config.styles.sheets, function (sheet) { return config.styles.base + "/" + sheet; }))
        .pipe($.less())
        .on("error", printError)
        .pipe($.autoprefixer(config.styles.autoprefixer))
        .pipe($.uglifycss())
        .pipe(gulp.dest(config.publicPath + "/styles/"));
});

gulp.task("dev.styles", function () {
    return gulp
        .src(_.map(config.styles.sheets, function (sheet) { return config.styles.base + "/" + sheet; }))
        .pipe($.sourcemaps.init())
        .pipe($.less())
        .on("error", printError)
        .pipe($.autoprefixer(config.styles.autoprefixer))
        .pipe($.sourcemaps.write())
        .pipe(gulp.dest(config.publicPath + "/styles/"));
});

gulp.task("dev.styles.watch", ["dev.styles"], function () {
    return gulp.watch(config.styles.base + "/**/*.{css,less}", ["dev.styles"]);
});

gulp.task("dev.watch", ["dev.scripts.watch", "dev.styles.watch"], function () {
    lrServer.listen(35729);

    gulp.watch(config.publicPath + "/styles/**").on("change", function(file) {
        lrServer.changed({ body: { files: [file.path] } });
    });
});

gulp.task("dev", ["dev.styles", "dev.scripts"]);
gulp.task("prod", ["prod.styles", "prod.scripts"]);

但是,一切都如预期的那样工作,但是,当使用watch任务时,构建时间需要很多秒。奇怪的是,我的任务报告说,脚本的重新编译发生在500 my以下( "time“事件的事件处理程序),但是如果我在头脑中计算,它要到3到4秒之后才能完成。

请注意,在粘贴现有的TypeScript代码之前,我正在加载/捆绑jQuery、React、other和其他快速使用的库。因此,我不认为使用单独的供应商包会加快速度。此外,不编写源代码地图似乎也不会影响性能。

在我切换到浏览器化之前,我使用了gulp类型的文本进行编译,并使用了对模块加载的要求。这些建筑花了不到一秒钟的时间。然而,需求是由其他原因引起的问题-和任何一种方式,我想从AMD转移到CommonJS。

就目前而言,这并不是什么大问题,但随着项目的发展,它肯定会导致我的开发流程出现问题。对于一个只有这么大的项目,需要多长时间才能处理更大的项目?

此外,它还会导致Visual出现问题。这是一个ASP.NET 5应用程序,Visual显然坚持每次修改绑定的JavaScript文件时都重新加载/重新解析,每次更改后都会在IDE中延迟1-2秒:在重新编译自己所需的3-4秒之上。脚本正在呈现到我的wwwroot文件夹中,似乎没有办法用ASP.NET 5工具“排除”脚本子文件夹。

我知道我在某个地方遗漏了什么。一个可能的问题是tsify没有使用TypeScript的"project“特性来实现重载,导致TypeScript编译器对每个文件进行重新处理。

不管怎么说,我不可能是唯一一个在玩具项目之外使用这些工具的人,所以我在这里问是否有人有更好的解决方案,因为除了这个问题,一切都很好。

编辑

好吧,我得吃了我自己的话。构建现在大约是一秒,因为我将第三方库捆绑到它们自己的包中。下面是我更新的gulpfile (注意新的dev.scripts.vendor任务和buildScripts函数中的.external调用)

代码语言:javascript
复制
var gulp = require("gulp"),
    $ = require("gulp-load-plugins")(),
    _ = require("lodash"),
    tsify = require("tsify"),
    browserify = require("browserify"),
    source = require("vinyl-source-stream"),
    debowerify = require("debowerify"),
    watchify = require("watchify"),
    lr = require("tiny-lr"),
    buffer = require("vinyl-buffer");

var lrServer = lr();

var config = {
    scripts: {
        base: __dirname + "/Resources/Scripts",
        main: "Application.ts",
        output: "App.js",
        vendor: ["react", "jquery", "moment", "socket.io-client", "lodash", "react-dom"]
    },

    styles: {
        base: __dirname + "/Resources/Styles",
        sheets: ["Application.less", "Preload.less"],
        autoprefixer: ["last 2 version", "safari 5", "ie 8", "ie 9", "opera 12.1", "ios 6", "android 4"]
    },

    publicPath: __dirname + "/wwwroot"
};

function printError(err) {
    $.util.log($.util.colors.red.bold(err.type + " " + err.name + ":"), $.util.colors.white(err.message));
    this.emit("end");
}

function buildScripts(watch, debug) {
    var bundler = browserify({
            basedir: config.scripts.base,
            debug: false,
            entries: [config.scripts.base + "/" + config.scripts.main],
            cache: {},
            packageCache: {}
        })
        .plugin(tsify, {
            module: "commonjs",
            target: "es5",
            jsx: "react"
        });

    if (debug)
        bundler.external(config.scripts.vendor);

    function build() {
        return bundler.bundle()
            .on("error", printError)
            .pipe(source(config.scripts.output))
            .pipe($.if(!debug, buffer()))
            .pipe($.if(!debug, $.uglify()))
            .pipe(gulp.dest(config.publicPath + "/" + "scripts"));
    }

    if (!watch)
        return build();

    bundler
        .plugin(watchify)
        .on("update", function () {
            $.util.log($.util.colors.grey("Building scripts..."));
            build();
        })
        .on("time", function (timeMs) {
            $.util.log(
                $.util.colors.grey("Finished"),
                $.util.colors.cyan("'dev.scripts.watch' after"),
                $.util.colors.magenta(timeMs.toLocaleString() + " ms"));
        });

    return build();
}

gulp.task("prod.scripts", function() {
    return buildScripts(false, false);
});

gulp.task("dev.scripts", ["dev.scripts.vendor"], function () {
    return buildScripts(false, true);
});

gulp.task("dev.scripts.vendor", function() {
    return browserify({
            debug: true,
            cache: {},
            packageCache: {},
            require: config.scripts.vendor
        })
        .bundle()
        .on("error", printError)
        .pipe(source("Vendor.js"))
        .pipe(gulp.dest(config.publicPath + "/" + "scripts"));
});

gulp.task("dev.scripts.watch", ["dev.scripts.vendor"], function () {
    return buildScripts(true, true);
});

gulp.task("prod.styles", function () {
    return gulp
        .src(_.map(config.styles.sheets, function (sheet) { return config.styles.base + "/" + sheet; }))
        .pipe($.less())
        .on("error", printError)
        .pipe($.autoprefixer(config.styles.autoprefixer))
        .pipe($.uglifycss())
        .pipe(gulp.dest(config.publicPath + "/styles/"));
});

gulp.task("dev.styles", function () {
    return gulp
        .src(_.map(config.styles.sheets, function (sheet) { return config.styles.base + "/" + sheet; }))
        .pipe($.sourcemaps.init())
        .pipe($.less())
        .on("error", printError)
        .pipe($.autoprefixer(config.styles.autoprefixer))
        .pipe($.sourcemaps.write())
        .pipe(gulp.dest(config.publicPath + "/styles/"));
});

gulp.task("dev.styles.watch", ["dev.styles"], function () {
    return gulp.watch(config.styles.base + "/**/*.{css,less}", ["dev.styles"]);
});

gulp.task("dev.watch", ["dev.scripts.watch", "dev.styles.watch"], function () {
    lrServer.listen(35729);

    gulp.watch(config.publicPath + "/styles/**").on("change", function(file) {
        lrServer.changed({ body: { files: [file.path] } });
    });
});

gulp.task("dev", ["dev.styles", "dev.scripts"]);
gulp.task("prod", ["prod.styles", "prod.scripts"]);

然而,我仍然有一个奇怪的问题。由于源代码映射被禁用(就速度而言,它现在似乎产生了影响),my on("time",() => {})回调报告了每一个文件更改60-80 as,但它仍然挂起大约一秒钟。第二是我愿意等待的一切,所以我再次担心,随着项目的发展,等待可能也会增加。

当事件报道的时候,你会很感兴趣地看到这额外的一秒时间都花在了什么上面。也许我会开始深入研究来源,因为似乎没有人能马上得到答案。

另一个问题----这只是一个副词,但不再适用于此。当使用debowerify+bower时,它将继续在最终输出中呈现所需的模块,即使该模块列在“外部”列表中。因此,目前这个设置,我只能使用npm模块,除非我可以增加更多的编译时间到我的应用程序包。

此外,我还了解到debowerify将覆盖npm模块,并且它是基于bower_components的目录列表,而不是您的首配置文件。我在npm中安装了jQuery,而且只有bower中的引导程序;但是由于引导将jQuery作为一个依赖项,保龄球jQuery模块被优先加载,而不是NPM jQuery。只是给人一个提示。

EN

回答 1

Stack Overflow用户

发布于 2016-10-16 21:34:58

忘记这一点,只需使用最新的TS + webpack :)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33822663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档