process.env.FOO преобразуется в {} .FOO и выдает ошибку «ожидаемое выражение получено». - PullRequest
0 голосов
/ 09 апреля 2020

Я написал модуль TypeScript, который взаимодействует со специфицированным c RESTful API. Модуль никогда нигде не ссылается на process.env (цель - это браузер, возможно, и узел внизу).

Я использую Rollup для переноса в один JS файл. Оттуда вход в Node и require('./build/index') успешен, и я даже могу запустить функции и получить ожидаемые результаты. Таким образом, сам Rollup, кажется, работает.

Но файл содержит много ссылок на такие вещи, как process.env.DEBUG. (Я подозреваю, что Rollup что-то делает для создания регистраторов, которые могут работать как в Node, так и в браузере.)

Теперь я импортирую это в проект пользовательского интерфейса Gatsby, который должен будет подключиться к API с помощью этого модуля:

import { api } from 'my-api'
api.someApiCall()

Проблема в том, что когда Гэтсби компилирует все это (используя Webpack?) В commons.js (какой-то большой JS файл с большим количеством объединенного кода из разных библиотек, включая мой модуль API), он, кажется, преобразуется модуль process.env.DEBUG (например) в {}.DEBUG. Затем браузер жалуется, что «ожидал выражения, получил«. »». Что имеет смысл. Вы не можете получить доступ к {}.DEBUG. Это должно быть ({}).DEBUG или const o = {}; o.DEBUG.

Теперь я уже некоторое время не в мире других языков. Свертывание довольно ново для меня. Гэтсби очень новичок для меня. Какой путь вперед? Должен ли я сказать Rollup через конфиг заменить process.env на ({}) таким образом? Но это исключает возможность использования библиотеки в Node.js и использования process.env.

Нужно ли что-то изменить в Gatsby, чтобы она заменила process.env на ({})?

Редактировать Например, вот мой вывод в моем браузере commons.js:

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete {}.DEBUG;
  } else {
    {}.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return {}.DEBUG;
}

В моем модуле это process.env.DEBUG.

Редактировать 2 Я также пытался поместить gatsby- node.js, содержащий это:

exports.onCreateWebpackConfig = ({
  plugins,
  actions,
}) => {
  const { setWebpackConfig } = actions;

  setWebpackConfig({
    plugins: [
      plugins.define({
        'process.env': "({})",
        '{}.DEBUG': '({}).DEBUG',
      })
    ]
  })
}

Нет эффекта.

...