【问题标题】:Preserving methods during dart2js minification and tree-shaking在 dart2js 缩小和摇树期间保留方法
【发布时间】:2015-05-01 09:37:18
【问题描述】:

我有一些我用 dart 编写的文件,我想编译为 javascript 并包含在我的 Android 应用程序中运行的一些 html 文件中。

这些文件由一个 main 方法组成,然后是一个 api 层,其中包含 3 个函数,其他 javascript 代码将在运行时调用这些函数。非常重要的是我尽可能少地包含 dart 的库(所以 tree-shaking 是必须的),并且当 tree-shaking/minification 过程发生时,我需要确保 3 api 层函数不会被重命名/优化了,因为它认为它们没有被调用?

我如何告诉 dart2js 保留某些函数的签名,而不是因为它认为它们没有被使用而将它们删掉?

【问题讨论】:

  • 不确定我是否关注。你是不是想用 Dart 写一个库,然后用 dart2js 编译,然后从 javascript 调用编译好的库?
  • @GregLowe 我重新写了这个问题,因为它太混乱了。基本上是的,我在 Dart 中有一个 javascript 库,我想用 dart2js 编译/优化它,然后让其他 javascript(编译器不知道)调用它。
  • 我自己还没有尝试过,但是 dart-js-interop 允许向 JS 公开 Dart 方法,我认为它们应该通过 treeshaking 和缩小来保留。这可能不是那么简单,否则这将是一个官方支持的用例。有人提到了最终支持这种情况的计划,但到目前为止我还没有注意到这方面的任何活动。
  • @spierce7 我同意 Guenter 的观点,该用例目前还没有得到很好的支持。虽然有些库可能有一个相当简单的 api,并且可以通过这种方式实现而不会有太多麻烦 - 所以它真的取决于库。
  • 感谢大家的回复。我想我会在这方面回避飞镖,而只是在 js 中实现。看起来如果有一个图书馆,那就是github.com/dart-lang/js-interop,这就是我认为Gunter 之前所指的。

标签: dart dart2js


【解决方案1】:

您可以使用 dart:js 库的 context 属性,JsObject 允许您将变量和方法从 dart 公开到 JavaScript,并将由 dart2js 保留。在您的 main 方法中,只需包含 context['jsMethodName'] = dartMethodName,然后在您的 JavaScript 中调用它。这是一个例子:

library.dart

import 'dart:js';

void main(){
  print("main called!");
  context['myMethod'] = myMethod;
}

void myMethod(){
  print("My Method Called!");
}

index.html

<script src="library.dart.js"></script>
<script>
  console.log(myMethod());
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2012-04-09
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多