Webpack-您如何在bundle中要求可选依赖项(saslprep)

在部署过程中,我正在使用webpack将许多后端脚本捆绑到一个文件中。

连接到MongoDB数据库时,存在一个可选的依赖项,如果不包含该依赖项,则会引发警告。

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

在我的开发环境中,通过安装可选依赖项可以轻松解决此错误。

npm install saslprep --save

但是,当与webpack捆绑在一起时,不包括可选的依赖项,并且警告在生产部署中仍然存在。我可以很容易地找到造成这种情况的原因,mongodb库要求将此作为可选的依赖项:

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

我曾尝试使用垫片,外部工具,插件来遵循webpack文档,但坦率地说,对于解决此问题的正确方法,它已经一去不复返了。这是我当前的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")
        })
    ],};

谢谢。

tao199107 回答:Webpack-您如何在bundle中要求可选依赖项(saslprep)

webpack应该“看到” require('saslprep')代码并捆绑saslprep。您可以通过查看由webpack创建的文件并搜索与库源代码不同的内容来确认这一点。我将查看正在检查该依赖关系的MongoDB代码-可能是他们检查其存在的方式与webpack捆绑并定义依赖关系的方式不兼容。 (大多数节点库的作者可能没有考虑捆绑时的代码运行方式-webpack可以用于Node,但很少使用。)如果是这种情况,您可以对代码进行反向工程检查并通过别名等将其放置到位。

,

感谢布伦丹(Brendan)为我指引了正确的方向。最终在这里找到了答案:Keycloak development docs

关键信息是:

  

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”周围加引号。

,

我使用的是webpack-node-externals包,您也可以这样做:

sudo apt-get install libhdf5-dev
本文链接:https://www.f2er.com/3165037.html

大家都在问