godotjs / javascript

Javascript binding for godotengine
https://godotjs.github.io/
MIT License
980 stars 82 forks source link

Global pollution #187

Open Hadaward opened 10 months ago

Hadaward commented 10 months ago

I personally don't really like global pollution, you could take advantage of the javascript module system to export godot methods, utilities and classes without needing to register the godot namespace into the global. If you are wondering how this would work, it is quite simple, the first thing needed would be a d.ts documentation file for intellisense to work. And then we can consume the godot api using import syntax:

import { Node2D, print } from "godot";

export class Main extends Node2D {
  _ready() {
    print("Hi from Javascript Main class");
  }
}

This is literally the only thing I dislike about this api, the godot api is simply thrown into the global scope.

snatvb commented 5 months ago

I think this is limited engine - C++ <-> JS, you can bind data into JS from C++ only in global object. Actually another languages with runtime has similar behaviour

Hadaward commented 4 months ago

I think this is limited engine - C++ <-> JS, you can bind data into JS from C++ only in global object. Actually another languages with runtime has similar behaviour

Hmm, I don't know what to say about this because I've already found libraries in C#, for example, that allowed running javascript engines and exporting objects as modules to be imported. So i dunno if there's a lib like that in C++

nmerget commented 1 month ago

@Hadaward at the moment godot is registered in the global context in this file.

I'm not comfortable enough to do some changes at this point and I'm not sure if we can build an own object somehow.

I personally don't like global pollution, as well. But there is some workaround for TS.

You could create a new file godot.ts where you wrap everything like this:

 // @ts-nocheck
export class Node extends godot.Node {}

export const DEBUG_ENABLED: boolean = godot.DEBUG_ENABLED;

export const register_class = (target: godot.GodotClass, name: string) =>
  godot.register_class(target, name);

...

You need to map everything you need then you are able to use it as module for now. We should generate the godot.ts file via editor as well in the future as an alternative for godot.d.ts.