【发布时间】:2015-01-25 02:09:06
【问题描述】:
我正在将一个相当大的打字稿项目从内部模块转移到外部模块。我这样做是因为我想创建一个核心包,如果需要,它可以加载其他包。我要记住的第二个要求是,我希望能够使用 nodeJS 在服务器上运行捆绑包(如果需要,可以进行一些修改)。
我第一次尝试使用 AMD 和 require.js 来构建核心包,但我遇到了循环依赖的问题。在阅读完这与 require.js 很常见之后,commonJS 更常被建议用于大型项目,我尝试过。但是现在它与 browserify 一起设置,当我运行编译的包时,我在完全相同的位置出现了 exact 相同的问题。
我有 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) 将所有循环依赖的基类放在一个文件中。
这意味着它将成为一个地狱般的文件。而且导入总是需要别名:
import core = require('core');
import BaseA = core.BaseA;
2) 使用内部模块
当我使用内部打字稿模块和参考文件时,核心包运行良好(具有循环依赖项)。但是,如果我想创建单独的包并在运行时加载它们,我将不得不对所有带有 require.js 的模块使用垫片。
虽然我不太喜欢所有的别名,但我想我现在会尝试选项 1,因为如果它有效,我可以继续使用 CommonJS 和 browserify,稍后我还可以更轻松地在节点中运行服务器上的所有内容.如果 1 不起作用,我将不得不求助于选项 2。
Q1:有没有我没有提到的可能的解决方案?
Q2:对于具有 1 个核心捆绑包的 typescript 项目的最佳设置是什么,该捆绑包可按需加载其他捆绑包(基于核心构建)。这似乎无法绕过循环依赖。并且最好可以在客户端和服务器上运行。
或者我只是在寻求不可能的事情? :)
【问题讨论】:
标签: typescript circular-dependency browserify commonjs