Написание специфического для ОС кода в Electron

napisanie speczificheskogo dlya os koda v electron

Одним из преимуществ использования Electron является то, что – поскольку он кроссплатформен – нам не нужно беспокоиться об операционной системе, на которой будет запущена наша программа.

Однако иногда нам нужно, чтобы наш код был специфичен для ОС, если, например, мы собираемся использовать командную консоль или нужно получить некоторую информацию о системе.

Приходится писать несколько если каждый раз, когда мы хотим иметь некую функциональность на данной ОС, кажется излишней работой. Он быстро запутывает код, усложняя его понимание и анализ.

Чтобы код оставался чистым и читаемым, мы можем создать небольшой помощник и удалить файл если и любую логику, связанную с ОС.

Внедрение платформ

const os = require('os');

const platforms = {
  WINDOWS: 'WINDOWS',
  MAC: 'MAC',
  LINUX: 'LINUX',
  SUN: 'SUN',
  OPENBSD: 'OPENBSD',
  ANDROID: 'ANDROID',
  AIX: 'AIX',
};

const platformsNames = {
  win32: platforms.WINDOWS,
  darwin: platforms.MAC,
  linux: platforms.LINUX,
  sunos: platforms.SUN,
  openbsd: platforms.OPENBSD,
  android: platforms.ANDROID,
  aix: platforms.AIX,
};

const currentPlatform = platformsNames[os.platform()];

const findHandlerOrDefault = (handlerName, dictionary) => {
  const handler = dictionary[handlerName];

  if (handler) {
    return handler;
  }

  if (dictionary.default) {
    return dictionary.default;
  }

  return () => null;
};

const byOS = findHandlerOrDefault.bind(null, currentPlatform);

// usage
const whatIsHeUsing = byOS({
  [MAC]: username => `Hi ${username}! You are using Mac.`,
  [WINDOWS]: username => `Hi ${username}! You are using Windows.`,
  [LINUX]: username => `Hi ${username}! You are using Linux.`,
  default: username => `Hi ${username}! You are using something different.`,
});

console.log(whatIsHeUsing('Maciej Cieslar')); // => Hi Maciej Cieslar! You are using Mac.

Во-первых, мы видим платформы объект, содержащий имена всех поддерживаемых операционных систем. Сделано только для удобства. Тогда мы можем использовать платформы.WINDOWS вместо того, чтобы набирать текст ‘WINDOWS’ каждый раз в наш объект с обработчиками мы переходим к byOS функция.

Далее обратите внимание на названия платформ объект. Ключи являются результатом вызова os.platform(). The значение – это ключи от платформы объект. Мы просто сопоставляем его с более удобным названием.

Например, когда os.platform() возвращается win32, мы отражаем это платформы.WINDOWS за звонком названия платформ[os.platform()].

в текущая платформа, мы сохраняем платформу, которую мы используем сейчас, чтобы потом мы могли сопоставить ее с заданным объектом с помощью обработчиков.

Внедрение релизов

Можно пойти еще дальше и попытаться различить выпуски определенной ОС, например Windows 7, 8 и 10.

const os = require('os');

const releaseTest = {
  [platforms.WINDOWS]: (version) => {
    const [majorVersion, minorVersion] = version.split('.');

    // Windows 10 (10,0)
    if (majorVersion === '10') {
      return releases.WIN10;
    }

    // Windows 8.1 (6,3)
    // Windows 8 (6,2)
    // Windows 7 (6,1)
    if (majorVersion === '6') {
      if (minorVersion === '3' || minorVersion === '2') {
        return releases.WIN8;
      }

      return releases.WIN7;
    }

    return releases.WIN7;
  },
  [platforms.MAC]: () => releases.ANY,
  [platforms.LINUX]: () => releases.ANY,
};

const currentRelease = releaseTest[currentPlatform](os.release());

const byRelease = findHandlerOrDefault.bind(null, currentRelease);

// usage
const whatWindowsIsHeUsing = byOS({
  [WINDOWS]: byRelease({
    [WIN7]: username => `Hi ${username}! You are using Windows 7.`,
    [WIN8]: username => `Hi ${username}! You are using Windows 8.`,
    [WIN10]: username => `Hi ${username}! You are using Windows 10.`,
  }),
});

console.log(whatWindowsIsHeUsing('Maciej Cieslar')); // => Hi Maciej Cieslar! You are using Windows 7.

Теперь мы можем использовать os.release() чтобы проверить наличие выпуска системы.

Мы можем разделить полученную строку и проверить версию Windows. Полный список можно найти здесь. Что касается Linux/Mac, я не видел, как это может быть полезным, поэтому я оставил это на выпуски. ЛЮБОЙ.

в whatWindowsIsHeUsing Вы можете видеть, что мы проверяем наличие различных выпусков Windows только если мы запускаем приложение в Windows.

Вы можете увидеть код в репозитории.

Спасибо, что читаете! Если у вас есть лучшие идеи по написанию кода для операционной системы, поделитесь ими ниже!

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

Просмотрите мои социальные сети!

Присоединяйтесь к моей рассылке!

Первоначально опубликовано на www.mcieslar.com 28 августа 2018 года.

Добавить комментарий

Ваш адрес email не будет опубликован.