从TypeScript文件中收集引用依赖关系树

时间:2013-02-01 12:13:11

标签: caching typescript ondemand

问题:

关于编译TypeScript代码服务器端,有没有办法获取单个.ts文件的所有引用路径的列表 - 或者更好,整个编译(从单个.ts文件开始)?按顺序,最好是。

如果可能,我更愿意使用现有的解析器,而不是使用新代码解析文件。

上下文

由于我认为它不存在,我想写:

  1. 服务器端Web用户控件,它采用.ts路径并生成指向
  2. 的缓存清除脚本标记
  3. 一个HttpHandler,它在第一次请求时编译请求的.ts文件ONCE,然后将CacheDependencies添加到所有引用依赖项路径。当文件发生更改时,生成脚本的Web用户控件会更新后续请求的缓存后缀。
  4. 所以在发布模式下,<tsb:typescript root="app.ts" runat="server" />会产生

    <script type="text/javascript" src="app.ts?32490839"></script>
    

    其中提供的脚本是按需缓存的单文件脚本。

    在调试模式下,未修改的标签会产生:

    <script type="text/javascript" src="dependency1.ts?32490839"></script>
    <script type="text/javascript" src="dependency2.ts?32490839"></script>
    <script type="text/javascript" src="app.ts?32490839"></script>
    

    据我所知,TypeScript Visual Studio插件或任何Optimizer捆绑器都不支持这种操作模式。捆绑包接近我要求的,但是它们没有缓存 - 它们没有单文件编译而没有烦人的显式捆绑文件。

    在编译脚本时,我不介意在第一个请求时遇到任何性能损失。除此之外,也许有一个非常好的理由是这个设置不应该存在或不存在。如果不能或不能做到这一点,我也会欣赏这方面的答案。

    我已经在StackOverflow上看到了其他问题,这些问题在我的解释中围绕着这种愿望而跳跃,但没有一个如此明确,没有相关答案。

    谢谢!

    另外,在不同的进程中执行tsc.exe是我的HttpHandler在运行时编译的最佳方式,还是有一个灵活,安全,简单的方法来进行此过程?

2 个答案:

答案 0 :(得分:1)

如果您启用优化并使用捆绑包HTML帮助程序,则捆绑包会为JavaScript执行此操作,并将捆绑包添加到页面中。 cache-bust URL是JavaScript文件的简短哈希,因此如果更改了bundle中的任何脚本,新哈希会将其从客户端缓存中分离出来。

我的建议是捆绑已编译的JavaScript并使Bundler minify和cache-bust。您可以使用out标志让TypeScript生成包含所有依赖项的单个文件...

tsc --out final.js app.ts

您的捆绑包现在只需要包含final.js - 这可以节省明确列出所有文件并稍后添加新文件。

你仍然可以在运行时编写一些内容来拦截和编译。我倾向于在运行时之前完成这项工作,因为TypeScript的一个好处是编译时检查 - 如果客户端要求脚本,您将如何处理编译错误。即使你在运行时这样做,我仍然会将JavaScript引用添加到页面,而不是.ts文件。

答案 1 :(得分:0)

您可以以交互方式或在节点中使用 Madge

另见:How can I see the full nodejs "require()" tree starting at a given file?