cocos creator模块系统
代码多了,要组织代码的话,就需要使用模块系统了
常见的就两种esm, commonjs
1:cocos creator 中ts支持导入js文件吗?
是支持的,并且支持esm和common.js两种形式, 例子说明
// getName.js esm形式 function getName() { return 'honghong' } module.exports = getName // getName.js esm形式 function getName() { return 'honghong' } export default getName // test.ts import * as getName from './getName' //只能使用这种形式 const {ccclass, property} = cc._decorator; @ccclass export default class NewClass extends cc.Component { @property(cc.Label) label: cc.Label = null; start () { this.label.string = getName() } }
// getName.js esm形式 exports.getName = function() { return 'honghong' } module.exports = getName // getName.js esm形式 export function getName() { return 'honghong' } // test.ts import {getName} from './getName' //只能使用这种形式 const {ccclass, property} = cc._decorator; @ccclass export default class NewClass extends cc.Component { @property(cc.Label) label: cc.Label = null; start () { this.label.string = getName() } }
getName: [function(t, e, o) {
"use strict";
cc._RF.push(e, "b66a1LXyMVE2Zx7M80Prh6Y", "getName"),
o.__esModule = !0,
o.default = void 0;
o.default = function() {
return "honghong"
},
e.exports = o.default,
cc._RF.pop()
}
可见export default默认导出 最后还是会被转化成命名导出。并且名字是关键字default
所以import getName from './getName'
getName并不是想要的结果,必须加个default, getName.default
为什么ts导入ts可以,因为ts转js的时候,给转码了
问题来了,为什么ts可以,js 不可以?请对比编译之后的代码,发现他们的生产文件有所不同
为什么ts没问题,因为ts是所谓的强类型, 而用require是会报错的
是不是官方的本意 ts文件用es6形式, js用commonjs形式?
建议不要用默认导出, 用命名导出(很有名的开源2d游戏引擎pixi.js也是用的命名导出)
基本上都是用ts脚本的,为什么还要了解js脚本?
因为编译出来的代码是js文件,如果你了解此机制的话,就能做些文章了
作者直白点告诉你,反编很有用
总结: cocos creator js脚本 commonjs和es6都支持,
ts脚本只支持es6
cocos creator导出的是命名导出,如果是export default 则会弄成 exports['default']
commonjs不是标准,es6才是标准