[Laya游戏开发]小技巧使Laya构建速度提升10倍

1. 为什么选择Laya引擎

微信小游戏推出以后,不少公司也相应的进入到微信小游戏这个领域,如今市场上的游戏开发引擎,如Cocos、Egret、Laya都对小游戏有了很好的兼容性。目前公司技术栈主要是使用Cocos和Laya,通过几个项目的接触,考量了引擎在IDE上的上手习惯,API的设计上,发现Laya更适合微信小游戏的开发。前端

2. 默认的Laya构建方式

clipboard.png

Laya在使用IDE默认建立项目后(本文选择typescript语言),会在当前项目目录下,新建一个为.laya的文件夹。默认生成的编译配置文件为
默认的laya构建配置
其中compile.js为开发时默认运行文件,这里若是开发者是mac系统,使用F8编译项目后,可能都会报如下错误:node

mac系统下新建项目后的编译报错
经过报错提示,这里若是出错的话,将compile.js名称改成gulpfile.js,而且,将文件内gulp运行的默认task改成'default'。webpack

clipboard.png

经过compile.js文件可知,默认的Laya构建方式是,使用gulp、browserify进行项目构建,tsify编译typscript,vinyl-source-stream用于将tsify构建的node stream转化为gulp能识别的stream文件。因此咱们每次修改ts源码,都须要手动点击编译或者使用F8编译。而且,就Laya的3D示例项目,每次编译的时间基本在1s~2s。git

clipboard.png

3. 改进的Laya构建方式

对于web前端开发,可能都会配置webpack+webpack-hot-middleware之类进行代码热更新,开发web网页的流程基本就是:修改代码 -> 自动编译 -> 自动刷新,假若有两个屏幕,开发者不须要去刷新浏览器、输入命令从新编译等机械重复的行为。既然Laya默认使用了browserify(其实browserify这几年更新已经很慢了),这里咱们能够加入gulp.watch,观察src目录源文件,每当src下文件发生修改时,自动触发编译操做,至关于开发者不须要再按F8编译。github

gulp.task("watch", ['default'], () => {
    gulp.watch("../src/**/*.ts", () => {
        gulp.run("default");
    });
});

可是这种方式,至关于gulp从新进行编译,实际编译速度依然不快。那么问题来了,有没有办法编译对时候,gulp只编译修改的那部分,从而加快编译速度?web

clipboard.png

4. 使用watchify监听文件变化并结合browserify-sync自动刷新网页

经过gulp官网可了解到watchify到相关使用,这里咱们将代码改为,并结合browser-sync,带来自动刷新网页的功能。typescript

const watchedBrowserify = watchify(browserify({
    basedir: workSpaceDir,
    debug: false,
    entries: ['src/Main.ts'],
    cache: {},
    packageCache: {}
}).plugin(tsify));

// 记录watchify编译ts的时候是否出错,出错则不刷新浏览器
let isBuildError = false; 
gulp.task("build", () => {
    return watchedBrowserify
        .bundle()
        .on('error', (...args) => {
           isBuildError = true;
            gutil.log(...args);
        })
        .pipe(source('bundle.js'))
        .pipe(gulp.dest(workSpaceDir + "/bin/js"));
    });

    gulp.task("watch", ['build'], () => {
        // 浏览器开发时自动刷新页面
        browserSync.init({
            port: 3002, // 监听端口,这里注意是否和其余项目冲突
            server: {
                watchFiles: ["../bin/"], // 刷新网页的监控目录
                baseDir: "../bin/"
            } 
    });
    //  watchify监听文件刷新
    watchedBrowserify.on("update", () => {
        isBuildError = false;
        runSequence('build', () => {
            if (!isBuildError) { // 没有编译错误时,刷新浏览器界面
                browserSync.reload();
            }
        });
    });
    // 打印watchify编译日志
    watchedBrowserify.on("log", gutil.log);
});

其中,runSequence用于同步执行gulp任务,屡次实践,这里还须要加入变量isBuildError,在代码编译出错时,不执行browserSync的刷新。gulp

最终效果:浏览器

clipboard.png

编译速度快了近10倍,浏览器也能自动刷新了,开发游戏又更加愉快了~微信

欢迎下载源代码: https://github.com/derickweng...

相关文章
相关标签/搜索