У меня есть приложение 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`)
Что я пробовал:
- Непосредственное копирование файла с помощью CopyWebpackPlugin . Это включает в себя файл конфигурации, не измененный в папке сборки, но также связывает его в файле индекса. В результате изменения в файле конфигурации не имеют никакого эффекта.
Добавление правила исключения. Это не имеет никакого эффекта, и я не знаю, должно ли это. Я пытался следовать этому и этому примерам, но согласно этому ответу исключение не исключает связывание кода, а только преобразование кода. Это правило, которое я пробовал:
{
test: /\.json$/,
exclude: [
path.resolve(__dirname,'config.json')
]
}
Разделение кода. Файл конфигурации можно связать отдельно, но он не будет читаем для изменения пользователем.
- Сочетание CopyWebpackPlugin и IgnorePlugin . Однако, как объяснено в комментарии к этого ответа , конфигурация игнорируется не только при связывании, но и во время выполнения. Файл конфигурации не связан, и он не изменен в папку dist, но работает индекс. js возвращает:
Error: Cannot find module './config.json'
Конфигурирование как внешнее, как объяснено здесь и здесь . С внешней конфигурацией и CopyWebpackPlugin файл конфигурации не связан и копируется без изменений, но не может быть загружен с помощью. js. Возвращает ошибку: TypeError: Cannot read property 'ip' of undefined
В файле webpack.config. js:
externals: {
'Config': JSON.stringify("./config.json")
},
В индексе. js: const config = require('Config')
По поводу внешних связей я также нашел этот ответ , но он использует глобальное пространство браузера, и я не знаю, смогу ли я сделать что-то подобное в NodeJS.
Использование 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 ?