Webpack - 您如何要求捆绑包中的可选依赖项(saslprep)

Cor*_*892 8 mongodb node.js webpack

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

连接到 MongoDB 数据库时,有一个可选的依赖项,如果不包含它会抛出警告。

Warning: no saslprep library specified. Passwords will not be sanitized
Run Code Online (Sandbox Code Playgroud)

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

npm install saslprep --save
Run Code Online (Sandbox Code Playgroud)

但是,当与 webpack 捆绑时,不包含可选依赖项,并且警告在生产部署中仍然存在。我可以很容易地找到原因,mongodb 库要求将其作为可选依赖项:

Warning: no saslprep library specified. Passwords will not be sanitized
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用填充、外部、插件来遵循 webpack 文档,坦率地说,我对解决这个问题的正确方法非常迷茫。这是我当前的 webpack.config 文件(试图将其作为插件)。

npm install saslprep --save
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Cor*_*892 5

感谢 Brendan 引导我朝着正确的方向前进。最终在这里找到了答案: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')"
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,在我的测试中,导入外部对象时似乎需要“saslprep”周围的引号。


Bre*_*non 1

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