Как я могу оценить Node-скрипт во время сборки Webpack и сделать его содержимое доступным для скомпилированного кода? - PullRequest
1 голос
/ 05 апреля 2019

У меня есть скрипт Node, который несколько раз использует fs.readFileSync для чтения различных файлов конфигурации JSON5, существующих в файловой системе.Они считываются, комбинируются, манипулируются, добавляются и т. Д. На основе определенных критериев в переменных ENV.Выходные данные этого файла - это объект JavaScript через module.exports.

. Мне бы хотелось, чтобы этот сценарий оценивался каждый раз, когда я запускаю процесс сборки Webpack, а выходной объект JS становится доступным в комплекте, поэтому, когда мойклиентские скрипты React делают import { foo, bar } from 'config';, эти значения могут быть доступны клиентскому коду.

Это похоже на то, что мог бы решить загрузчик, но я не смог заставить работать ни одно из них.

Как я могу оценить Node-скрипт во время компиляции Webpack и сделать его экспорт доступным для скомпилированного клиентского кода?

1 Ответ

1 голос
/ 06 апреля 2019

Как я уже сказал в комментарии к вашему вопросу, идиоматический способ обработки конфигурации в веб-пакете - это DefinePlugin, так что в вашем случае это будет означать выполнение обработки конфигурации в вашей конфигурации веб-пакета.Затем Webpack автоматически обработает интерполяцию ваших переменных конфигурации на месте, и вам не нужно будет вводить конфигурацию с помощью оператора import.Что-то вроде:

// webpack.config.js
const webpack = require("webpack");
const config = require("./process-config")

module.exports = {
  // ...
  plugins: [
    webpack.DefinePlugin({
      config
    })
  ]
};

// app.js
if (config.SOME_CONFIG_VAR) {
  // do work when SOME_CONFIG_VAR=true
}

Сказав это, еще одним способом, более гармонирующим с тем, что вы ищете, может быть использование val-loader это загрузчик, который

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

[ source ]

Использование val-loader может выглядеть примерно так:

// webpack.config.js
module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /config.js$/,
        use: [{ loader: "val-loader" }]
      }
    ]
  }
}

// config.js
const config = require("./process-config.js");
const JSON = require("json5");

module.exports = {
  code: `module.exports = "${JSON.stringify(config)}"`
}

// app.js
const config = require("./config.js");

if (config.SOME_CONFIG_VAR) {
  // do work when SOME_CONFIG_VAR=truet
}
...