我正在将一个相当大的打字稿项目从内部模块移动到外部模块.我这样做是因为我想创建一个核心捆绑包,如果需要,可以加载其他捆绑包.我要记住的第二个要求是,我希望能够在nodeJS服务器上运行捆绑包(如果需要,可以进行一些修改).
我第一次尝试使用AMD& require.js构建核心包,但我遇到了循环依赖的问题.在阅读了这与require.js相同之后,commonJS更经常被建议用于大型项目我试过了.但是现在它与browserify一起设置,当我运行编译的bundle时,我在同一个地方出现了完全相同的问题.
我有类似10个基类的东西,它们相互依赖并形成多个循环依赖.我没有看到任何方法来删除所有这些.
一个简化的设置来解释为什么我认为我不能删除循环依赖项:
- Triples are made of 3 Resources (subject,predicate,object)
- Resource has TripleCollections to keep track of which triples its used in
- Resource has multiple functions which rely on properties of Triple
- Triple has some functions which handle TripleCollections
- TripleCollection has multiple functions which uses functions of Triple
- TripleCollection.getSubjects() returns a ResourceCollection
- ResourceCollection.getTriples() returns a TripleCollection
- Resource keeps track of the objects of its triples in ResourceCollections
- ResourceCollection uses multiple functions of Resource
我已经在SO上阅读了多个相关问题(this one最有帮助),从我可以收集的内容中我只有几个选项:
1)将所有具有循环依赖关系的基类放在1个文件中.
这意味着它将成为一个文件的地狱.而且导入总是需要别名:
- import core = require('core');
- import BaseA = core.BaseA;
2)使用内部模块
当我使用内部打字稿模块和参考文件时,核心包工作正常(具有循环依赖性).但是,如果我想在运行时创建单独的bundle并加载它们,我将不得不使用带有require.js的所有模块的填充程序.
虽然我不太喜欢所有别名,但我想我现在会尝试选项1,因为如果它可以工作,我可以继续使用CommonJS和browserify,稍后我也可以更轻松地在节点上运行服务器上的所有内容.如果1没有成功,我将不得不求助于选项2.
Q1:我有没有提到过一些可能的解决方案?
Q2:具有1个核心捆绑包的打字稿项目的最佳设置是什么,它根据需要加载其他捆绑包(构建在核心上).这似乎无法绕过循环依赖.最好能在客户端和服务器上运行.
或者我只是要求不可能的?