编写具有Web程序集依赖关系的Typescript库?

时间:2019-05-23 20:25:26

标签: javascript typescript browser webassembly

我正计划编写一个用于分发的打字稿库,这将取决于cephes

为了在浏览器中使用Web程序集,我们必须像这样编译它:

const cephes = require('cephes'); // Browser
await cephes.compiled;

我不确定如何为包装cephes的Typescript库实现此方法。

例如,库将提供一个NormalDistribution,可以这样导入:

import { NormalDistrbution } from 'cephesdistributions';

如果我们摇摇欲坠,那么NormalDistribution可能是软件包中唯一包含的导入内容。因此,我们是否需要在await cephes.compiled提供的所有模块中都包含cephesdistributions

1 个答案:

答案 0 :(得分:1)

我认为您应该尽可能简单明了。由于您的消费者无法真正解决必须await的问题,因此建议您将其留给await cephes.compiled的消费者。

如果要捆绑cephes,则可能要从库中重新导出cephes.compiled,以便用户可以只使用您的库:

const cephes = require('cephes');

export const compiled = cephes.compiled;

export class NormalDistribution {
  public mean: number;
  public sd: number;

  constructor(mean = 0, sd = 1) {
    this.mean = mean;
    this.sd = 1;
  }

  cdf(x: number): number {
    // If this gets called before someone has `await`:ed `compiled`
    // there will be trouble.
    return cephes.ndtr(x);
  }
}

这意味着您导出的类将立即具有其类型,即使它们调用得太早也会崩溃。由于您的使用者像您一样依赖cephes.compiled的解决,因此您可以考虑在适当的时候存储编译状态和“保护”。例如,

const cephes = require('cephes');

let isCompiled = false;
export function assertIsCompiled() {
  if (isCompiled) {
    return;
  }

  throw new Error('You must wait for `cephesdistributions.compiled` to resolve');
}

export const compiled = cephes.compiled.then(() => { isCompiled = true });

export class NormalDistribution {
  public mean: number;
  public sd: number;

  constructor(mean = 0, sd = 1) {
    assertIsCompiled();

    this.mean = mean;
    this.sd = 1;
  }

  cdf(x: number): number {
    return cephes.ndtr(x);
  }
}