使 ReasonML/Bucklescript 输出 ES5 兼容代码

Making ReasonML/Bucklescript output ES5 compatible code

在使用 ReasonML 和 Bucklescript 时,是否可以配置 Bucklescript 使其不生成 export 语句?如果生成的代码可以在浏览器中使用,即与 ES5(或 ES6)兼容,我更愿意。

编辑:好的,在进一步试用工具链时,我意识到仅关闭 export 是不够的。请参见下面的示例:

function foo(x, y) {
  return x + y | 0;
}

var Test = /* module */[
  /* foo */foo
];

exports.Test = Test;

如果删除 exports,此代码将污染全局命名空间,并且从 ES5 兼容性的角度来看,它只是被破坏了。

编辑2:在Bucklescript的博客上阅读,这似乎是不可能的:

one OCaml module compiled into one JavaScript module (AMDJS, CommonJS, or Google module) without name mangling.

Source.

BuckleScript 可以输出多种不同模块格式的模块,然后可以使用 webpack 或 rollup 等捆绑器将其与其依赖项捆绑在一起。输出并不是真正打算用作独立单元,因为在任何情况下您可以做的事情都相当有限,因为标准库和 运行time 库是单独的模块。甚至像乘法这样微不足道的事情也会涉及到 运行时间库。

你可以配置BuckleScript输出es6模块,只要你的浏览器支持就可以直接在浏览器中运行。但这仍然需要从您的 bs-platform 安装中手动提取标准和 运行time 库。

模块格式通过package-specs 属性 in bsconfig.json配置:

{
  ...
  "packages-specs": ["es6-global"] /* Or "es6" */
}

说了这么多,您实际上 可以 通过将 [@@@bs.config { no_export }] 放在文件顶部来关闭导出。但这是没有记录的,因为由于上述原因,它在实践中的使用非常有限。