【问题标题】:Access local module.exports with Dart and JS interop使用 Dart 和 JS 互操作访问本地 module.exports
【发布时间】:2020-02-07 14:13:56
【问题描述】:

我的目标是在 JavaScript 中将 Dart 项目中的代码作为库重用,然后将其直接导入 Node.js 或将其作为 CommonJS 捆绑到客户端 JS。

目前 Dart2JS 强制使用全局变量,尤其是在 Node 中不可用的 self

数据从main导出:

@JS('module.exports')
//external NodeModuleExports get nodeModuleExports;
external dynamic get nodeModuleExports;

main() {
  nodeModuleExports.foo = 'foo';
}

这至少行不通,因为 module 被视为全局变量而不是局部变量,nodeModuleExports.foo 被编译为 self.module.exports.foo 而不是 module.exports.foo

我认为node_preamble 应该解决这个问题,但不确定如何将其应用于这种情况。

如何将新属性添加到 Dart 本地的 module.exports JavaScript 中?

【问题讨论】:

    标签: javascript node.js dart commonjs dart-js-interop


    【解决方案1】:

    您使用node_preamble 是正确的。当 Dart2JS 构建你的代码时,它总是会在你的 module.exports.foo 后面加上 self.module.exports.foo。正如你所说,这会阻止函数被导出。

    现在,序言的目的是用简单的exports 覆盖self.exports 以获得所需的行为。你可以在node_preamble这里看到这个:

    image of node_preamble code

    (node_preamble 做了更多的事情,但它们与本文无关)

    要获得解决方案,您可以追加 node_preamble 中的代码,或者(在您的情况下)只需将 self.exports = exports; 添加到生成的 .js 文件的顶部。在我的例子中,我们添加了一个 bash 脚本,它会在我们的代码生成后自动附加我们的自定义序言。

    image of final code that has fixed exports

    【讨论】:

    • 感谢您的回答,它提供了一些启示。请提供代码而不是图片,这将改善帖子。
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多