Как я могу переместить MyNewClass в MyExistingModule таким образом, чтобы модуль мог работать как в среде браузера, так и в среде сервера (узла)? Я начал с написания нового класса непосредственно в HTML.
Код: Выделить всё
import { MyExistingClass1 } from './MyExistingModule.js'
const PNG = png.PNG;
class MyNewClass {
#myPng;
constructor() {
this.#myPng = new PNG();
// Do things that a MyNewClass does.
}
}
У меня есть другой модуль, который используется только на сервере, который в настоящее время использует pngjs, и, насколько я могу судить, PNG выше неотличим от PNG ниже.
Код: Выделить всё
import { PNG } from 'pngjs/browser'
class SomeThirdClass {
// Actual code replaced with a trivial example for illustration purposes.
makeNewPng(w, h) {
const newPng = new PNG();
newPng.width = w;
newPng.height = h;
// Do things that a SomeThirdClass does.
}
}
Код: Выделить всё
// How do I "import" pngjs here so that it works in both environments? Or at least doesn't interfere with the web CDN version?
class MyExistingClass {
static ignoreScaleMisalignmentErrors = false;
static suggestedMaximumTileSheetColorCount = 8;
static get CURRENT_VERSION() { return ("1.0.0") };
}
Связанные вопросы, которые я вижу, либо очень старые, либо описывают другую проблему, и я хотел бы знать,
какие, если таковые имеются, канонические решения этой проблемы. Я относительно неопытен в современном JavaScript и хочу, чтобы мой код JavaScript пах как современный код JavaScript. Один из вариантов, который я вижу, — это динамический импорт (я искал его отдельно), но понятия не имею, как он работает. Другой вариант — создать MyNewClassBrowserImpl и MyNewClassServerImpl, каждый в своих собственных модулях, причем первый предполагает, что PNG уже находится в глобальном масштабе, а другой выполняет тот же импорт, что и в случае SomeThirdClass. Третий вариант — использовать какой-то служебный метод, в который вы передаете конструктор PNG, но он раскрывает то, что на самом деле является деталями реализации MyNewClass, и для меня это пахнет антишаблоном.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... y-on-pngjs