Comments (6)
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.
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.
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.
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.
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.
Closing due to inactivity.
from gen_js_api.
Related Issues (20)
- calling new on a dynamic value HOT 4
- Conversion functions not included in module signature HOT 1
- js.global with payload doesn't work with js.scope HOT 1
- Change Ojs_exn to Ojs.Exn HOT 2
- Make a new release HOT 2
- [question] How to define mutually recursive types including both JS-able types and non-JS-able types (with custom `of_js` and `to_js`)?
- Codegen change for functions named "get" and "set"; was this intentional? HOT 5
- Resolve the ocaml-migrate-parsetree < "2.0.0" constraint HOT 2
- Recursive type definitions generate invalid `let-rec` definitions
- [@@js.new] can infer empty class names
- js.* attributes on val declarations fail to compile in 1.0.7 HOT 3
- Ignore @js.dummy attribute for the spuriousness check HOT 1
- Add visual feedback of executed JavaScript code HOT 1
- Contravariant type parameter 'a is not allowed
- Inherit JS class, override method and pass new class back to JS? HOT 1
- Support ad-hoc object types to map to JS objects
- Unions based on JS class name and typeof?
- "js.union without way to discriminate values" for union in callback argument type HOT 1
- Dots in js.scope HOT 3
- Using polymorphic types with `js.custom` and `js.call` gives weak polymorphism error HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gen_js_api.