【问题标题】:NodeJS application cannot find modules after being bundled by WebpackNodeJS应用被Webpack打包后找不到模块
【发布时间】:2020-10-09 05:04:18
【问题描述】:

我正在创建一个我试图捆绑的节点/express 服务器,以便我可以将它部署到 IIS 服务器上。我应该注意,这只是一个后端服务器。一旦我在捆绑后尝试运行代码,就会收到以下错误:

ReferenceError: __WEBPACK_EXTERNAL_MODULE_dotenv__ is not defined
    at eval (webpack:///external_%22dotenv%22?:1:18)
    at Object.dotenv (C:\inetpub\wwwroot\my-deployments\server\bundle.js:271:1)
    at __webpack_require__ (C:\inetpub\wwwroot\my-deployments\server\bundle.js:20:30)
    at eval (webpack:///./src/server/server.js?:4:1)
    at Object../src/server/server.js (C:\inetpub\wwwroot\my-deployments\server\bundle.js:169:1)
    at __webpack_require__ (C:\inetpub\wwwroot\my-deployments\server\bundle.js:20:30)
    at eval (webpack:///multi_./src/server/server.js?:1:18)
    at Object.0 (C:\inetpub\wwwroot\my-deployments\server\bundle.js:216:1)
    at __webpack_require__ (C:\inetpub\wwwroot\my-deployments\server\bundle.js:20:30)
    at C:\inetpub\wwwroot\my-deployments\server\bundle.js:84:18

我了解 dotenv 模块似乎存在错误,但是我尝试使用仅安装了 express 的基本应用程序,但我遇到了同样的错误,但使用的是 express 而不是 dotenv。我认为这是我的 webpack.config.js 的一个问题,但我似乎无法弄清楚是什么导致了这个问题。

webpack.config.js

const path = require('path')
const webpack = require('webpack')
const nodeExternals = require('webpack-node-externals')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
    target: 'node',
    mode: 'development',
    entry: {
        bundle: ["./src/server/server.js"]
    },
    externals: [nodeExternals({
        importType: 'umd'
    })],
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            title: 'server'
        })
    ],
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'),
    }
}

【问题讨论】:

    标签: node.js express webpack


    【解决方案1】:

    问题在于您的nodeExternals 选项。删除importType: 'umd' 并重新捆绑。我用一个小的 express 应用程序和你的确切配置在本地对此进行了测试,它对我有用。

    这里的问题是你告诉 webpack 所有你的导入是“外部的”(未捆绑)并且它们使用umd(通用模块定义)来公开它们的内容。

    Umd 通常用于客户端代码,因此它可以在多个不同的环境中运行(<script> 标签、commonjs、amd、es6 模块等)。至于服务器端/仅 Nodejs 的模块......没那么多。 importTypedefault valuecommonjs,这是 Node 的原生模块加载系统,也是绝大多数服务器端包将使用的系统。

    【讨论】:

    • 这绝对解决了问题!谢谢!这让我想到了另一个问题,我想知道我是否可以问你。当我将 bundle.js 移出 dist 文件夹时,bundle.js 不再有权访问 node_modules 文件夹中的内容。我的理解是 webpack 应该将依赖项中的功能添加到 bundle.js 中。我这样想错了吗?还是我的 webpack.config.js 根本没有正确构建来捆绑这些依赖项?
    • 如果您希望将您的依赖项添加到您的bundle.js,您需要完全删除nodeExternals - 这就是它的全部目的(防止 node_modules 被捆绑)。如果您选择保留 nodeExternals,则需要将 node_modules 文件夹与 bundle.js 一起部署。
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2017-07-04
    • 2017-12-16
    相关资源
    最近更新 更多