【问题标题】:How to build a single ES6 module from several TypeScript files (for a frontend library)如何从多个 TypeScript 文件构建单个 ES6 模块(用于前端库)
【发布时间】:2016-10-02 12:26:08
【问题描述】:

我的前端库的代码被拆分成几个源文件。

例子:

// a.ts
function a() {}

// b.ts
function b() {}

// main.ts
const myLib = {
    a: a,
    b: b
}

我需要构建一个仅导出 myLib 的 ES6 模块(即一个 JavaScript 文件),作为默认导出。

我看到两个选项。第一个:

  1. 运行tsc将每个文件编译成JavaScript;
  2. 将所有生成的JS文件拼接成一个文件my-lib.js;
  3. 附加 ES6 所需的代码 (export …)。

第二个:

  1. 将所有 TypeScript 文件连接成一个文件 my-lib.ts;
  2. 附加导出:export default myLib;
  3. 对连接的文件运行tsc

这两个选项都很难看,并且会丢失 map 文件。

有更好的方法吗?

【问题讨论】:

    标签: typescript ecmascript-6 es6-modules


    【解决方案1】:

    我添加一个答案是因为今天前端库的正确方法是使用 Rollup

    首先,编写 ES6 模块,importexport 他们:

    // file-a.ts
    export function a() {}
    
    // file-b.ts
    export function b() {}
    
    // main.ts
    export { a } from "./file-a"
    export { b } from "./file-b"
    

    然后,使用 tsc 将代码编译为 JavaScript,并将选项 module 设置为 "es6"

    然后,让 Rollup 从 JavaScript 代码构建一个平面包。对于上面的代码,Rollup 会生成这个包:

    function a() {}
    function b() {}
    export { a, b };
    

    另见:

    注意:构建定义文件 (.d.ts) 的definitive solution 尚未实施(2018 年 3 月)。 I still concatenate files 使用 Node.js 脚本在单个 TypeScript 定义文件中生成导出的类型。

    【讨论】:

      【解决方案2】:

      正确的方法是创建一个桶文件来重新导出模块。

      // foo/a.ts
      export function a() {}
      
      // foo/b.ts
      export function b() {}
      
      // foo/index.ts
      export {a} from './a';
      export {b} from './b';
      

      然后在你的消费者中:

      import {a, b} from './foo';
      
      a();
      b();
      

      【讨论】:

      • 桶文件会使用gulp-umd等任何工具自动创建还是我们需要手动创建?
      • @AniruddhaDas:我验证了这个答案,因为我认为这是当前标准和工具唯一可能的答案。但我仍然使用我丑陋的程序(我的第二个问题)。如果有人找到更好的解决方案,我仍然很感兴趣。
      猜你喜欢
      • 2020-01-26
      • 2014-12-25
      • 2010-12-09
      • 2015-07-05
      • 1970-01-01
      • 2013-09-25
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多