【问题标题】:Bundler using TypeScript使用 TypeScript 的捆绑器
【发布时间】:2019-06-05 19:52:56
【问题描述】:

TypeScript API 在几个版本之前公开了customTransformer API。

我想创建一个转换器来处理导入语句(可能也需要)来解决包依赖关系,例如 webpackbrowserifyparcel 做。

幸运的是,TypeScript 本身已经将 customTransformer API 用于非常相似的目的:

transformAMDModule at src/compiler/transformers/module/module.ts line 120

但是,该代码依赖于许多内部字段/API(并没有完全满足这里的需要)。

这个任务可以在公共 API 中完成吗?即使是简化/部分版本。


澄清:这是关于捆绑应用程序的外部依赖项(例如reactmomentlodash和应用程序代码 拼成一大块JS。尽管TypeScript 目前支持--outFile 参数,但它只会将应用程序代码组装在一起,依赖项。

附:通过Twitter/486timetable 提出相同的问题,并将在此处反映任何有用的更新以供搜索。

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

    没有官方答案,但这里是 GitHub 上的my own exploration

    1. 您无法仅使用自定义转换器来实现它。需要在发射/转换阶段之前做很多前期工作。
    2. 第一阶段是收集模块依赖关系。这就是 findDependencies 在这里所做的:获取 ts.Programts.TypeChecker 对象并从 AST 中嗅出模式。理想情况下,它需要捕获:
      • import ... from "a-module" 声明
      • require("a-module")同步通话
      • import("a-module") 异步调用
      • AMD define 语法
      • AMD require 异步调用(行为不同于全局同步 require
      • 也许 - 重定向选择加入的全局变量,如 React --> import React from "react"
      • 旧语法 TypeScript import 语句
    3. 外部依赖项——捆绑(递归)。
    4. 最后,启动发射和处理/别名依赖:
      • 如果在代码内部,只需在本地解析
      • 注入外部预捆绑的

    并不完全简单,但实际上是可行的。希望#TypeScript 团队的人能纠正任何错误?

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2018-08-23
      • 2013-06-27
      • 2013-12-06
      • 2020-06-18
      • 2017-09-13
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多