GithubHelp home page GithubHelp logo

Bindings with requires about gen_js_api HOT 6 CLOSED

lexifi avatar lexifi commented on August 30, 2024
Bindings with requires

from gen_js_api.

Comments (6)

jchavarri avatar jchavarri commented on August 30, 2024 3

I picked up the branch in #68 and updated it with latest master to explore the generated code for require attributes. One challenge is that in development mode, gen_js_api (in particular, these changes in ojs.ml) produces the following output after running through jsoo:

var internal_require=require;
function require$0(name){return internal_require(name.toString())}

This is a no-go for most common JavaScript bundlers like Webpack, that need the string passed to require to be a literal so it can be resolved at bundling time.

If I compile using the --profile=prod flag in Dune, then all these map functions like .toString get inlined so the expressions are resolved with literals, but I wonder if there's a way to "move forward" this expression generation so the resulting code can contain the string literal already?

Aside: I can create a PR with the updated branch if it helps.

from gen_js_api.

alainfrisch avatar alainfrisch commented on August 30, 2024

First, even with the manual encoding, you could use gen_js_api to produce a binding for:

  type a_module = Ojs.t
  val foo_internal: a_module -> string -> int

and then simply define the user-visible foo in term of this foo_internal:

  let a = lazy (...)
  let foo x = foo_internal (Lazy.force a) x

Now, assuming that a Javascript global variable A_module is bound to the result of require("A") (either with manual JS code, or through gen_js_api), you can also directly expose:

  val foo: string -> int [@@js.global "A_module.foo"]

One could also design some built-in gen_js_api support for this scheme, perhaps bound to OCaml modules:

module A : sig
  val foo: string -> int
end [@@js.require]

within a module marked with the js.require attribute, all functions would implicitly be assumed to be on the object resulting from a call to require (by default, with a name derived from the module binding, with a way to override that).

from gen_js_api.

Aaylor avatar Aaylor commented on August 30, 2024

Thanks for your answer !
I wrote the ml file instead of the mli using an internal representation, allowing me to hide the internal module with the mli file:

module A_internal : sig
  type a_internal = Ojs.t
  val foo : a_internal ->int -> int
end

let mod_a = lazy (Helpers.require "a")
let foo i = A_internal.foo mod_a i

Implementing such an attribute could be a great idea to avoid code duplication or errors. Would you see this in gen_js_api ? I could give a try to add this attribute.

from gen_js_api.

alainfrisch avatar alainfrisch commented on August 30, 2024

Would you see this in gen_js_api ? I could give a try to add this attribute.

Yes, absolutely! If some "small" additions to the tool simplify supporting common idioms in bindings, they are very much welcome.

from gen_js_api.

Lupus avatar Lupus commented on August 30, 2024

Writing quite some Node bindings - and it's annoying to bind modules to some globals and then reference those in @js.global. It's still not bundler friendly, but I have to do it manually...

from gen_js_api.

mlasson avatar mlasson commented on August 30, 2024

Closing due to inactivity.

from gen_js_api.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.