Webpack - Как вам требуется необязательная зависимость в комплекте (saslprep) - PullRequest
0 голосов
/ 04 ноября 2019

Я использую веб-пакет для объединения нескольких внутренних сценариев в один файл во время процесса развертывания.

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

Warning: no saslprep library specified. Passwords will not be sanitized

В моей среде разработки эту ошибку легко устранить, установив необязательную зависимость.

npm install saslprep --save

Однако при связывании с веб-пакетом необязательная зависимость не включается и предупреждениесохраняется в производственном развертывании. Я могу легко отследить причину этого, библиотека mongodb требует этого в качестве необязательной зависимости:

let saslprep;
try {
  saslprep = require('saslprep');
} catch (e) {
  // don't do anything;
}

Я пытался следовать документации веб-пакета, используя шимминг, внешние компоненты, плагины и, честно говоря, совершенно потерянправильный подход к решению этой проблемы. Вот мой текущий файл webpack.config (пытающийся потребовать это как плагин).

const path = require('path');
const webpack = require('webpack');

module.exports = {
    entry: './src/api/index.ts',
    target: 'node',
    mode: 'production',
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                exclude: /node_modules/
            }
        ]
    },
    resolve: {
        extensions: ['.js', '.tsx', '.ts', '.json']
    },
    output: {
    filename: 'api.js',
        path: path.resolve(__dirname, 'dist'),
    },
    plugins: [
        new webpack.IgnorePlugin(/fsevents/),
        new webpack.IgnorePlugin(/blessed/),
        new webpack.ProvidePlugin({
            saslprep: path.resolve(__dirname, "node_modules/saslprep/index.js")
        })
    ],
};

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

веб-пакет должен 'видеть' этот require('saslprep') код и пакет saslprep. Вы можете подтвердить это, посмотрев файл (ы), созданный веб-пакетом, и найдя что-то отличительное от исходного кода библиотеки. Я хотел бы взглянуть на код MongoDB, который проверяет эту зависимость - возможно, то, как они проверяют его существование, не работает с тем, как веб-пакет связывает и определяет зависимость. (Большинство авторов библиотек узлов, вероятно, не задумываются о том, как будет работать код при связывании - веб-пакет может использоваться для Node, но это редко так.) Если это так, вы можете перепроектировать код. проверка и установка его с помощью псевдонима и т. д.

0 голосов
/ 05 ноября 2019

Спасибо Брендану за то, что он направил меня в правильном направлении. В конечном итоге ответ был найден здесь: http://www.matthiassommer.it/software-architecture/webpack-node-modules/

Основная информация:

Компилятор Webpack преобразует требование require () в свой собственный webpack_require (). Во время выполнения он просматривает свой внутренний реестр модулей.

Следуя изложенным в нем шагам, разрешение становится следующим:

const path = require('path');
const webpack = require('webpack');

module.exports = {
    entry: './src/api/index.ts',
    target: 'node',
    mode: 'production',
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                exclude: /node_modules/
            }
        ]
    },
    resolve: {
        extensions: ['.js', '.tsx', '.ts', '.json'],
    },
    output: {
        filename: 'api.js',
        path: path.resolve(__dirname, 'dist'),
    },
    plugins: [
        new webpack.IgnorePlugin(/fsevents/),
        new webpack.IgnorePlugin(/blessed/),
    ],
    externals: {
        "saslprep": "require('saslprep')"
    }
};

Обратите внимание, что в моем тестированиикавычки вокруг "saslprep" действительно необходимы при импорте внешних элементов.

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