After compilation to js and run it in the browser I see in developer tools that window object has many variables. You can also detect them in https://nim-lang.org/docs/theindex.html
I've heard global variables are bad.
https://yuiblog.com/blog/2006/06/01/global-domination/
Is it possible to avoid it?
I am generally wrapping the generated JS code in several steps but essentially, it's:
(function(){
// generated nim code
})();
This way, most of the assignments in the generated code create variables local to this anonymous function (since there declarations are starting with var). There are a few exceptions, such as
if (typeof Int8Array === 'undefined') Int8Array = Array;
But I find that typed arrays are available on the environments I run JS anyway. On Chrome today, the expression
Object.keys(window).length
evaluates to 195 (for this forum website) before and after running a minimal echo "Hello, World!" that I cross-compiled to JS and wrapped with the pattern above.
In my actual project, I am using webpack and a suffix in the form of
exports.funcA ==funcA;
...
to declare proper CommonJS modules. With that, I get not only proper guards against pollution of the global scope but also benefits such as tree shaking and magnification "for free".
This is my command in the run section of my package.json
"nim": "nim js -d:release --noMain --lineDir:on --embedsrc --nimCache:src/nim_generated src/nim/game.nim 2>&1 && echo \"exports.init = game_init; exports.update = game_update; exports.render = game_render;\" >>src/nim_generated/game.js",
The resulting JS code is pretty compact :)