Повторное использование кода JS между браузером и сервером с зависимостью от pngjsJavascript

Форум по Javascript
Ответить
Anonymous
 Повторное использование кода JS между браузером и сервером с зависимостью от pngjs

Сообщение Anonymous »

Как я могу переместить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»