发布的时候,插件脚本不能自己转换为ES5规范的?

现在用3.0写插件的时候遇了这个问题。
好像是在编辑器中插件脚本必须使用ES2015。
但是发布后,又需要插件脚本为ES5的。
所以需要发布的时候把ES2015的转换为ES5的。
这个过程会自己转换吗?我这边报了个错

[Build] [BABEL] Note: The code generator has deoptimised the styling of dragonBones.js as it exceeds the max of 500KB

最终好像没有转换。
求引擎组的大佬解决下, @jare

1赞

我很久以前在用1.9.3的时候就遇到过,如果一个脚本设置为插件的话。里边的es6语法不会转换成es5的。因此如果你写let关键字,那么打包Native的时候这个脚本会报错。所以需要注意插件脚本里不要有let和箭头函数这些关键字。最好别用es6特性来写

主要是如果编译为es5版本,编辑器中又运行不了。

运行不了是报什么错?

插件脚本里面有个 SceneBase 类继承了 cc.Component。
在游戏中定义了个组件脚本

@ccclass('GameScene')
export class GameScene extends lcc.SceneBase {}

如果插件脚本是ES2015,那么调试是没有问题的。
但是发布后,错误如下;

Class constructor SceneBase cannot be invoked without 'new' TypeError: Class constructor SceneBase cannot be invoked without 'new'

锁定错误位置:

_export("GameScene", GameScene = (_dec = ccclass('GameScene'), _dec2 = property(Prefab), _dec3 = property(Node), _dec4 = property(Node), _dec5 = property(Camera), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function (_lcc$SceneBase) {
        _inheritsLoose(GameScene, _lcc$SceneBase);

        function GameScene() {
          var _this;

          for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
            args[_key] = arguments[_key];
          }
          
         // 就是这一句代码
          _this = _lcc$SceneBase.call.apply(_lcc$SceneBase, [this].concat(args)) || this;

          _initializerDefineProperty(_this, "cube", _descriptor, _assertThisInitialized(_this));

初步判断因为,插件脚本是ES2015的,所以必须使用new的方式构造。
如果发布后把插件脚本换ES5版本的,就一切正常了。
这样就有一个很麻烦的问题, 编辑器里面需要使用ES2015的, 发布后需要使用ES5的,就想问问,能在构建的时候自动转换吗?

这个版本是没有办法了,因为插件脚本的定义就是我们不会转换里面的内容(除了加一点头和尾)。3.0 RC 会上线 NPM 支持(或者更精确地说,支持不是 ES6 模块的脚本),届时可以试着将这个脚本不设置成插件脚本使用。

这样的话看来只有把插件脚本裁剪的功能提前做了,在构建后使用裁剪后的ES5版本插件脚本替换。

最新发布的3.0,预览的时候脚本是不是改成ES5了啊?
刚把3.0预览版调通了,但是,现在这个冲突问题我这边是解决不了了。
我这个是框架脚本,需要在编辑器里面执行,所以现在好像只有插件脚本可以实现。
3.0预览版的时候,编辑器和预览的时候都是ES6,发布后是ES5。这个时候可以在开发的时候导入ES6插件脚本,然后在发布裁剪的时候使用ES5版本的替换。
但是现在3.0版本出问题了,编辑器里面是ES6,预览的时候是ES5。这样完全没有其他办法了
。。。 要不插件脚本都使用ES6吧, 预览和发布的时候你们来转格式吧

大佬麻烦解决下啊,要不几个月的成果就要打水漂了

你的插件脚本必须要es5吗?

不是要ES5, 这个插件是要在编辑器,预览,和发布的时候都要用。
以前编辑器和预览是ES6,我就可以在开发的时候使用ES6,发布的时候构建替换为ES5的,
但是现在编辑器是ES6,预览又是ES5。预览的时候我又不能处理插件脚本为ES5的。
我的意思是,你们可以在编辑器,预览里面统一版本, ES5,ES6都可以。或者你们就来转插件脚本的格式吧,内部我也不可能操作

明白了,那是否能作为普通脚本呢?

我们确实不会去编译插件脚本,非插件脚本我们会按照如下规则编译:编辑器内按照electron的版本(非常新),预览时编译为es5,原生构建时也会编译为适配原生v8的新版本。

普通脚本无法直接在编辑器里面执行的吧。在编辑器里面就无法使用框架的一些扩展功能了,框架不只是涉及到代码。

只要你不掉用编辑器接口是可以在编辑器运行的

怎么操作的啊,我把框架脚本放进去后,编辑器没有出现框架里面的组件啊。
还有这样的话,我好像无法裁剪框架了吧

可以提供个最小demo吗?裁剪我没懂是怎样个裁剪

demo工程已经通过私信发了

链接失效了,看下私信

问题已重现。

问题性质

BUG

问题原因

BUG:所有 CommonJS 模块的代码没有去编译,导致和 ESM 模块代码语法不一致。

预计解决版本

3.0.1(内部已解决,待发布)

现版本解决方案

暂无简易的解决方案。发布成 ESM 是一种解决方式。

2赞

十分感谢。