creator2.3 以来,npm包代码显示警告DevTools failed to parse SourceMap: ...

很多类似于:
DevTools failed to parse SourceMap: http://localhost:7456/preview-scripts/__node_modules/rxjs/index.js.map

rxjs是我要用的npm包。

在creator2.2里面没有问题。

对比temp文件夹下2.3的quick-scripts里面分成了dst 和 src。对应的js代码没有.map文件。

2.2里面quick-scripts相关代码都存在.map文件。
是不是 2.3creator 的npm包功能还没有完善啊?

看到说2.3早期版本的npm不能用,我用的最新2.3.2。还是有这个问题。运行时就先一大堆警告。

当然了,去chrome的devtools设置里面关闭sourcemap是屏蔽这些警告。
但是自己的代码也无法用到sourcemap特性时,调试起来时候的那一大堆代码很丑陋啊。
我想问这个问题还有在官方在跟踪么?或者说有没有仅关闭npm里面代码的sourceMap的方法呢?

这个问题后来怎么解决

很早的问题了,并没有解决npm的使用,但是我想要用rxjs,还是有办法。现在使用2.4.4,刚刚2.4.6。


rxjs不要用npm了,使用里面的提供的umd.min文件,自己导入导出即可。
我也试过3.x,直接用rxjs源码,稍微修改一下,主要是去掉一些引用就行了,ts的代码提示什么的都完美。还能把rxjs这部分放到assetbundle里面。

请问你有这个myrxja文件可以给大家分享一下如何设置吗?

rxjs.rar (30.6 KB)
这个就是上面rxjs目录的打包。也请你们引擎组看一下,有没有啥潜在问题或者建议。(其实我并不精通这些基础的语法,凭感觉写的,发现能用就这么一直用着的)
我做的就是简单的导入导出。而且已经在公司的项目里面使用挺长时间了。
另外,我习惯上,ts代码里面的引用方式这样的

import { Observable, generate, Subscription, empty, Observer, EMPTY, asap, timer, merge, async } from "../rxjs/myrxjs";
import { map, filter, switchMapTo } from "../rxjs/myrxjsoperators";
import ReactiveCommand from "./ReactiveCommand";

早期也有很多js代码在使用,是这样引用的

const { Observable } = require('myrxjs');

好的非常非常感谢你的支持啦!我们最近也有人反馈这个问题,我们会试用新版本的rxjs看看有没有更加官方简便的方法解决这类问题。

嗯嗯。
起初我从Unity过来,它里面是有个UniRx的,里面封装了对UGUI的各种绑定方法。还有相关计时器的方法。我入门就是这么入的,这个东西一旦用上了,整个编码习惯就改了,各种语言的编写可能都会先去找有没有相关的rx方式。尤其是游戏开发,几乎处处都在与“过程”打交道,有过程意味着异步。那这个东西,就是用来处理“异步过程”。(当然了,同步的操作也可以认为是一个0时间的“过程”,都可以融合进来)
构建轻量级mvp架构的基础就很方便,我几乎已经离不开它了,比如自己来个 ReactiveProperty。
另外,它为一个个动画过程或者逻辑上的时间多callback过程形成了代码描述。(比如一段“过程”(动画)就是一个Observable,你可以按照意愿去观察这个过程的都各个阶段,在处理各种复杂的叠加播放的“过程”(动画)时不要太爽。
再者,可以与promise的相互转化,也为网络异步的“过程”归入其管理提供了方便。
比如:
它里面的计时器相关部分核心可以封装一个采用引擎schedule的,就能做带类似 CCNextFrame().Subscribe(_ =>{});这样的计时器。
再比如封装creator的animation,那就更方便了,可以这样:

            CCBindAnimationWithEvent(technicNode.getComponent(cc.Animation), null, null, ['over']).subscribe(_ => {
                if (_.state == 'event') {
                    if (_.eventName == 'over') {
                        this.isKOLastTimeUp = true;
                    }
                } else if (_.state == 'finished') {
                    PoolManager.getInstance().putNodeByKey('Technic_Surrender', technicNode);
                }
            });

再比如用引擎的tween+来造序列发射器

let CCTweenFloat = (duration: number, easing: { easing: any } = null) => {
    return new Observable((observer: Observer<number>) => {
        let obj = new Proxy({ t: 0 }, {
            set: (target, key, value, receiver) => {
                observer.next(value);
                return Reflect.set(target, key, value, receiver);
            }
        });
        let tween = cc.tween(obj).to(duration, { t: 1 }, easing).call(() => {
            observer.complete();
        }).start();
        return () => {
            tween.stop();
            tween = null;
            obj = null;
        };
    });
}

到最后发现rxjs用的越来越多,过程都变成了一个一个的Observable,就一利用rxjs的各种api给他们处理,比如处理成类似sequence,处理成类似spawn,可以筛选等等。

1赞

太感谢您的分享了,这些背景对我们很有帮助,我们会持续优化希望能尽快有更优雅的解决方案解决这个问题