Open grz0zrg opened 4 years ago
Unfortunately I have no idea about web workers. This answer suggests that your suggested code change won't work very well. And I couldn't find out what that self
is. I'll leave this open until somebody provides a reliable alternative.
In the script of Web Workers, the self
property returns WorkerGlobalScope
object (the Worker
global scope).
I reference the solution from the other library:
// Environment detection
if (
typeof module === "object" && module && typeof module.exports === "object"
) {
// Node.js
module.exports = msgpack;
} else {
// Global object
var g;
if (typeof window !== "undefined") {
g = window;
} else if (typeof global !== "undefined") {
g = global;
} else if (typeof self !== "undefined") {
g = self;
} else {
g = this;
}
g[g.msgpackJsName || "msgpack"] = msgpack;
}
https://caniuse.com/?search=globalThis https://mathiasbynens.be/notes/globalthis has discussion on polyfills
Based on the above, pass the globalThis into your IIFE like this:
(function (_global) { //bind globalThis to _global
...
// Environment detection
if (typeof module === "object" && module && typeof module.exports === "object") {
// Node.js
module.exports = msgpack;
}
else if (_global) {
// Global object
_global[_global.msgpackJsName || "msgpack"] = msgpack;
}
)(globalThis || this || self || window);
Notes:
globalThis
from the context you call the IIFE.globalThis
will be defined and that's what will be usedthis
.
this
is not defined, so the next fallbacks are self || window
self || window
is undefined... or someone could have done var self=something
so first fallback is this
.this
was undefined from the context msgpack.js was imported, the fallbacks self || window
will work if some unexpected value wasn't bound to them. It's a risk that someone may have defined var self=something
in the context of the import, but it would be unusual; especially if the previous globalThis
and this
were not defined.There won't be any perfect solution to polyfill globalThis
... but this is decent I think.
Another option is to not define global.mspack
. and instead just support commonJS and expect browsers to use an applicable module loader that supports commonjs.
When the library is used in a web worker there is an issue with undefined
window
so i suggest adding Web Workers detection such as :