Webpack загрузить конфигурационный файл отдельно - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть приложение NodeJS, которое содержит несколько файлов js и файл конфигурации. Я хотел бы объединить все файлы, кроме файла конфигурации, чтобы его можно было изменить при развертывании. В примерах ниже я использую файл config. json, но я могу использовать файл js или другое расширение, если это облегчает решение.

Это мои основные c файлы. С этой настройкой файл конфигурации связывается с другими. Я сделал несколько неудачных попыток изменить их, чтобы достичь результата, описанного выше. Я использую Webpack 4.42.1.

config. json:

{
"address":{
    "ip": "127.0.0.1",
    "port": 3000
},

"devices": [
    { "name": "device0",     "id": 0 },
    { "name": "device1",     "id": 1 },
    { "name": "device2",     "id": 2 }
  ]
}

webpack.config. js:

const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  mode: 'production',
  devtool: false,
  entry: {
    index: './index.js',
  },
  output: {
    path: path.join(__dirname, 'build'),
    filename: '[name].js'
  },
  target: 'node',
  node: {
    __dirname: false,
    __filename: false,
  },
  externals: [nodeExternals()],
  module: {
   rules: [
      {
        exclude: /node_modules/
      }
   ]
  }
};

Минимальный индекс. js:

'use strict'
const config = require ('./config.json');
console.log(`To run in ${config.address.ip} with ${config.devices.length} devices`)

Что я пробовал:

  1. Непосредственное копирование файла с помощью CopyWebpackPlugin . Это включает в себя файл конфигурации, не измененный в папке сборки, но также связывает его в файле индекса. В результате изменения в файле конфигурации не имеют никакого эффекта.
  2. Добавление правила исключения. Это не имеет никакого эффекта, и я не знаю, должно ли это. Я пытался следовать этому и этому примерам, но согласно этому ответу исключение не исключает связывание кода, а только преобразование кода. Это правило, которое я пробовал:

    {
      test: /\.json$/,
      exclude: [
          path.resolve(__dirname,'config.json')
        ]   
    }
    
  3. Разделение кода. Файл конфигурации можно связать отдельно, но он не будет читаем для изменения пользователем.

  4. Сочетание CopyWebpackPlugin и IgnorePlugin . Однако, как объяснено в комментарии к этого ответа , конфигурация игнорируется не только при связывании, но и во время выполнения. Файл конфигурации не связан, и он не изменен в папку dist, но работает индекс. js возвращает: Error: Cannot find module './config.json'
  5. Конфигурирование как внешнее, как объяснено здесь и здесь . С внешней конфигурацией и CopyWebpackPlugin файл конфигурации не связан и копируется без изменений, но не может быть загружен с помощью. js. Возвращает ошибку: TypeError: Cannot read property 'ip' of undefined

    В файле webpack.config. js:

    externals: {
      'Config': JSON.stringify("./config.json")
    },
    

    В индексе. js: const config = require('Config')

  6. По поводу внешних связей я также нашел этот ответ , но он использует глобальное пространство браузера, и я не знаю, смогу ли я сделать что-то подобное в NodeJS.

  7. Использование file-loader . Приведенное ниже правило позволяет скопировать файл конфигурации без изменений, но с использованием связанного индекса. js возвращает ошибку: TypeError: Cannot read property 'ip' of undefined.

    module: {
      rules: [
          {
            test: /\.json$/,
            loader: 'file-loader',
            type: 'javascript/auto',
            options: {
              name() {
               return '[path][name].[ext]';
             },
           },
         }
      ],
    },
    

Я допустил ошибку и любой из этих параметров должен работать как положено? Есть ли другое возможное решение? Должен ли я анализировать файл конфигурации в моем коде вместо использования require, например here ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...