const path = require('path');
const egg = require('egg');
const EGG_PATH = Symbol.for('egg#eggPath');
const EGG_LOADER = Symbol.for('egg#loader');
class YadanAppWorkerLoader extends egg.AppWorkerLoader {
constructor(opt) {
super(opt);
// 自定义初始化
}
loadConfig() {
super.loadConfig();
// 对 config 进行处理
}
load() {
super.load();
// 自定义加载其他目录
// 或对已加载的文件进行处理
}
}
class Application extends egg.Application {
get EGG_PATH {
return path.resolve(__dirname, '../../../');
}
// 覆盖 Egg 的 Loader,启动时使用这个 Loader
get EGG_LOADER {
return YadanAppWorkerLoader;
}
}
理论上Egg官网上说这样是可以覆盖Egg当前的Loader机制,但是我看到app.loader.loadConfig等目录加载的方法还是执行了,影响了我想设计的目录结构,比如Egg目录为app/middleware/xxxxx.js 我设计的是server/middleware/xxxxx.js, config最为致命,所以这块我在服务启动的时候 阻止不了 Egg 本体的Loader,求解
断点跟踪下吧。
PS:如果是想区分 server / client 目录的话,其实不建议修改 loader,因为涉及面有点广,有可能会导致你用不了社区的一些插件。
可以换个思路:封装一个 cli 来去个各个目录来执行对应的启动脚本。蚂蚁那边的 TWA 是这么实践的。
@atian25 是的 修改成client + server 这种;涉及面不广,就是1个loader/minx,Egg 的插件生态可以用;
嗯 我们的方案 除了BFF 其他的 和TWA 是一样的;
Egg Router 这里修改了,之前是有问题,就是中间件 执行顺序,现在是app.beforestart 是OK的
你还是整理下你期望是怎么样的规范,现在 egg 内置的有什么问题,为什么要改?
然后我们再讨论看看
@atian25 谢谢,我的期望是 能够升级 历史项目,很多都是server+client这样的组合,迁移成本大,所以改的目录结构,目前我搭建+调试 遇到了 能进入我的新Loader,但是覆盖不了之前的Loader,config受影响,除非我命名类似appConfig这样的,但是多加载了1份目录,早晚会出事;
但你改成这样未来还是要改的,不如考虑写 codemod 来用 jscodeshift 自动升级旧代码?
@atian25 我再想想办法,除非 。。。在 抛弃egg-core, 加载一份复制版的新Loader的egg-core,我试试
@atian25 Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本;
@atian25 搞定了,我把Apploader和Agentloader改写了,不走Egg的Loader直接走我们自己的Loader机制了,不容易哈哈~
@atian25 我再想想办法,除非 。。。在 抛弃egg-core, 加载一份复制版的新Loader的egg-core,我试试
@atian25 Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本;
毕竟你是在魔改底层了,egg 的插件和生态在升级的时候,不会兼容到你的改动。
egg-core 是最核心的底层了,我们的孕育指的是上层框架。你如果这层都改掉的话,就相当于 iojs 那样的分支了,基本上很难融入生态,这点你要自己考虑好。
@Andiedie 我还是建议你按我们 RFC 的方式,描述清楚你的意图和改动的概要方案,这样至少我这边还能帮你 Review 下思路。如果是合理的需求,未必不能在 egg 层面进行扩展支持。
@atian25 你们RFC方案是什么?具体的?
@atian25 嗯好的