ccc对webpack、gulp等工具的支持方法。及一点建议

今天为打包一个用户工具集,想把它用gulp或webpack打包成bound文件。再在项目中引入。
发现打好包的bound不能被引入,引进来是undefined。

于是研究了一下cocos的脚本加载机制。

creator会在引入脚本时,自动在脚本首尾加入一段代码:

(function() {“use strict”;var __module = CC_EDITOR ? module : {exports:{}};var __filename = ‘preview-scripts/assets/script/gloabs/gloabs/glbconfs.js’;var __require = CC_EDITOR ? function (request) {return cc.require(request, require);} : function (request) {return cc.require(request, __filename);};function __define (exports, require, module) {“use strict”;
cc._RF.push(module, ‘ce550pb6KVNvLm/8sud4+PP’, ‘glbconfs’, __filename);

。。。。
这里是用户脚本内容
。。。

cc._RF.pop();

** })();**

也就是说,用户脚本是包在一个闭包里的,webpack等工具打包出来的文件结构基本上如下:
(function(){
return webpack_require(webpack_require.s = 15);
})
也是在一个闭包里。所以webpack引用的module 对象不是顶层的哪个module,
也就是webpack把结果传给了一个上层闭包传递的module,非顶层module对象
所以以至于未能正确返回结果,从而出现undefined

解决方法是,在打好包的文件中,在最前面加上一段:

module.exports = (function(){
return webpack_require(webpack_require.s = 15);
})

也就是得手动让顶层module接收 webpack的结果。。。
这,确实有些蛋疼。
对第三方包的支持不应该如此不开放

这还不算完
如果你的包里,有cc.class的脚本,将无法被识别
cc.class{
}
这当然是没办法,在打包时候,cc.class肯定引用不到;
这是你需要像个办法让打包过程暂时识别。。
cc= {class: o=> return o}
再在 你用到这段脚本时候 将他转换成真是的cc的class

这就更蛋疼了
强烈建议cc官方出相应的插件,以支持用户的这些需求。。

1赞