author:mucjgm
转载请注明出处。
版本:cocos2dx 3.10
需求:由于默认的打包方式打出来的game.min.js文件比较大。服务器方面要求我分成几个文件打包。
研究:
1.首先根据打包命令cocos compile -p web -m release找到打包入口。位于引擎目录下
cocos2d-x-3.10/tools/cocos2d-console/plugins/plugin_compile/project_compile.py
2.在文件中找到web的打包函数。build_web。
3.发现他是用谷歌的closure-compiler打包的。于是去github查看源码。https://github.com/google/closure-compiler
4.wiki显示只支持单文件打包。于是想分成多次compiler。然后在index.html里面多次加载。
5.找到web的关键函数gen_buildxml。位于
cocos2d-x-3.10/tools/cocos2d-console/plugins/plugin_compile/build_web/__init__.py
6.开始修改。我的修改方式是根据根据里面现成的module生成多个js文件。修改后的gen_buildxml函数代码如下。
def gen_buildxml(project_dir, project_json, output_dir, build_opts):
# get engine dir (not real)
engineDir = project_json["engineDir"]
# get real engine dir
engine_dir = os.path.normpath(os.path.join(project_dir, engineDir))
# get real publish dir
publish_dir = output_dir
# get tools dir
if getattr(sys, 'frozen', None):
tools_dir = os.path.realpath(os.path.dirname(sys.executable))
else:
tools_dir = os.path.realpath(os.path.dirname(__file__))
# download the binary files
compiler_1_6 = os.path.join(tools_dir, "bin", "compiler-1.6.jar")
compiler_1_7 = os.path.join(tools_dir, "bin", "compiler-1.7.jar")
if not os.path.exists(compiler_1_6) or not os.path.exists(compiler_1_7):
download_cmd_path = os.path.join(tools_dir, os.pardir, os.pardir, os.pardir)
subprocess.call("python %s -f" % (os.path.join(download_cmd_path, "download-bin.py")), shell=True, cwd=download_cmd_path)
try:
f = open(os.path.join(engine_dir, "moduleConfig.json"))
print os.path.join(engine_dir, "moduleConfig.json")
module_cfg = json.load(f)
finally:
f.close()
ccModuleMap = module_cfg["module"]
modules = project_json.get("modules", ["core"])
renderMode = project_json.get("renderMode", 0)
mainJs = project_json.get("main", "main.js")
ccJsList = [module_cfg["bootFile"]]
userJsList = project_json.get("jsList", [])
if renderMode != 1 and "base4webgl" not in modules:
modules[0:0] = ["base4webg