是否可以从nodejs服务器端的其他简单javascript文件中请求fay编译的模块?那太好了。也许编译器中有一些选项可以产生与commonjs兼容的模块?

最佳答案

这可能不是一个好主意,因为它很大程度上取决于fay生成的代码的特性。

请注意以下几点:

  • 不管编译模块的名称如何,fay实例化到变量main中。
  • 在node.js下,require的返回值是模块的modules.export(最初与export是同一对象,但不一定要保持这种状态)。
  • 在使用var声明其作用域之前,可以使用变量。引用的变量是相同的。它不关心其源顺序,也不关心运行时发生的一切。
  • 默认情况下,Fay(即不使用--library)可以实例化对象并执行main

  • 值得注意的是,这意味着我们可以在main内修改module.exportsexports以导出收费代码。当然,我们必须使用ffi,但这很简单。以下内容在没有--library的情况下进行了编译(是的,这有点违反直觉,并且确实使人相信这是一个讨厌的hack的假设,不是吗),在某种程度上可以起作用:
    import FFI
    
    main :: Fay ()
    main = ffi "module.exports = main"
    

    当从节点开始require时,返回的对象具有以下作用:
    { 'Main$main':
       { forced: true,
         value: { value: [Circular] } },
      _: [Function: Fay$$_],
      '$': [Function: Fay$$$],
      '$fayToJs': [Function: Fay$$fayToJs],
      '$jsToFay': [Function: Fay$$jsToFay] }
    

    掌握了Fay的内部表示形式后,就可以(尽管可能会花费很多精力)编写一个JavaScript包装程序来应对所有的重击。

    (我们可以做更多的事情-实际上,通过做更多的ffi工作,我们可以将所有绑定(bind)编写为ffi代码。不过,这样做有点愚蠢。)

    08-24 17:40