背景现在EggJS被很多开发团队采用。基于商业知识产权的考虑,一些团队经常会问一个问题:是否可以在EggJS中编译打包代码,然后对代码进行ugl化?为什么EggJS这种模块编译机制不能方便的实现编译特性呢?在EggJS中,代码文件是通过约定代码的位置来组织和加载的。也就是说,代码文件放在约定的目录结构中,EggJS在启动系统时,会在约定的位置扫描并加载约定的代码文件。因此,在这种机制下,编译特性无法轻易实现。CabloyJS是如何实现编译功能的?EggJS作为企业级框架提供了足够灵活的机制,例如允许上层框架提供自定义加载器。CabloyJS基于EggJS的机制实现了一套自定义加载器。在CabloyJS中,模块中的代码文件是通过require明确组织和加载的。这种加载机制为模块内部的源代码文件提供了明确的调用依赖,这样我们就可以使用Webpack来完成编译打包,模块编译达到丑化代码的意义。模块复用与生态建设:模块可以单独编译,从而可以单独发布、部署、升级,从而促进整个CabloyJS生态的繁荣,进一步加速实际业务的发展。知识产权:模块可以单独编译,也可以满足保护商业代码的需要。如何编译模块#进入模块所在目录$cd/path/to/module#编译模块的前端代码$npmrunbuild:front#编译模块的后端代码$npmrunbuild:backend编译参数所有模块使用默认编译参数,当然也可以提供自定义编译参数,以模块test-party为例:src/module/test-party/build/config.jsmodule.exports={前端:{productionSourceMap:false,uglify:true,},后端:{productionSourceMap:false,uglify:true,},};name表示productionSourceMap是否生成SourceMap文件,uglify,uglify代码模块加载约定。在模块目录下,既有src源代码文件,也有dist包文件。那么什么时候加载src什么时候加载dist呢?有两种类型的模块:全局模块和本地模块。这两类模块有不同的加载约定:全局模块:位于项目的node_modules目录下,系统一直加载全局模块的dist包文件本地模块:位于项目的src/module目录下,系统首先搜索src目录,加载模块,如果没有找到源码,则加载本地模块的dist包文件。了解全局模块和本地模块之间的代码加载协议。)最佳实践(模块前端)在部署的时候,项目的前端总是需要整体编译,将所有全局模块和本地模块的前端源码和资源打包,然后输出到项目的dist目录。如果模块作为本地模块存在,则无需考虑模块前端的编译过程。如果要将模块发布为全局模块,则必须首先执行模块前端编译(模块后端)的最佳实践。不需要考虑模块编译的环节。部署时,直接加载源码作为partialmodule运行即可2.编译模块如果要编译模块,部署时有两种选择:作为partialmodule,模块仍然位于src/项目的module目录模块编译完成后,在生产环境中,删除模块的src源码目录,将其作为全局模块使用。模块编译好后,发布到公司私有仓库。在项目中,将模块作为全局模块安装到node_modules目录中。如果没有私有仓库,也可以使用npm链接机制安装为全局模块模块发布当项目中的模块代码稳定后,可以将模块公开发布,贡献给开源社区。也可以在公司内部搭建一个npm私有仓库,然后将模块发布到私有仓库,形成公司资产,方便复用$cd/path/to/module$npmrunbuild:front$npmrunbuild:backend$npmpublish由于发布到npm仓库的模块会作为全局模块使用,所以编译前需要先编译模块的前后端效果图(模块后端编译)源码结构以及编译后的输出文件相关链接官网:https://cabloy.com/GitHub:https://github.com/zhennann/cabloy
