node.js - 使用 Webpack 构建后端 Express/WS Node 应用程序时的警告

标签 node.js express webpack

在使用 Webpack 构建后端 Node 服务器时,我收到了一些令人困惑的警告。我想使用 Webpack 来构建我的后端主要有两个原因:

  • Webpack 创建单个可执行文件,更易于部署
  • Webpack 包含我的应用程序的所有依赖项,因此我可以将我的应用程序部署到任何兼容的 Node 环境,而无需先安装依赖项

这是我收到的警告:

WARNING in ./~/ws/lib/BufferUtil.js
Module not found: Error: Can't resolve 'bufferutil' in .../node_modules/ws/lib
 @ ./~/ws/lib/BufferUtil.js 35:21-42
 @ ./~/ws/lib/Receiver.js
 @ ./~/ws/index.js
 @ ./src/main.js

WARNING in ./~/ws/lib/Validation.js
Module not found: Error: Can't resolve 'utf-8-validate' in .../node_modules/ws/lib
 @ ./~/ws/lib/Validation.js 10:22-47
 @ ./~/ws/lib/Receiver.js
 @ ./~/ws/index.js
 @ ./src/main.js

WARNING in ./~/express/lib/view.js
80:29-41 Critical dependency: the request of a dependency is an expression

对于 Critical dependency 警告,我找到了 good example解释问题和一些关于如何使用 ContextReplacementPlugin 的文档,尽管我仍然不清楚如何将其应用于这种情况。看起来警告是由 node_modules/express/lib/view.js 中的第 80 行引起的:

opts.engines[this.ext] = require(mod).__express

我很清楚在构建时无法解决依赖关系,那么如何使用 ContextReplacementPlugin 修复此依赖关系?

至于 ws 包中的 Module not found 警告,我不清楚是怎么回事。看起来那些依赖项存在于我的 global node_modules 中,也许它们没有被 Webpack 引入。我已经尝试将它们添加到我的项目的 devDependencies 中,但随后我只是收到针对它们的 Critical dependency 警告。

我的应用程序在构建后仍在运行,所以我想我可以在技术上忽略这些警告,但我认为这些是广泛使用的 Node 包,而 Webpack 是一种流行的构建工具,因此必须有一个合理的解决方案可用。


这是我的 package.json 中的依赖项:

 "devDependencies": {
    "@types/cassandra-driver": "^0.8.10",
    "@types/express": "^4.0.35",
    "@types/uuid": "^2.0.29",
    "@types/ws": "0.0.40",
    "nodemon": "^1.11.0",
    "typescript": "^2.3.1",
    "webpack": "^2.5.1"
  },
  "dependencies": {
    "cassandra-driver": "^3.2.1",
    "express": "^4.15.2",
    "uuid": "^3.0.1",
    "ws": "^2.3.1"
  }

这是我的 webpack.config.js:

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'main.js'
  },
  target: 'node',
  node: {
    __dirname: false,
    __filename: false
  }
};

如果可能的话,我喜欢保持最小化。感谢阅读。

最佳答案

简短的回答

webpack 可以与 node 一起工作,但它不能提取 follow require() 语句。必须进行修改以忽略 require() 才能使其正常工作。

长答案

实际上可以将一些文件拉入主文件并在一些实例中运行它。

  • 一个例子是,如果所有需要的模块都是用 typescript 编写的,并且模块是用 typescript 插件可以解析模块的方式编写的。

  • 另一个例子是,如果您使用 es6 babel 插件并使用 es6 样式导入。

即使在上述情况下,错误也可能选择不拉入某些文件

终极答案

尝试执行长答案真的不应该太重要,因为模块在启动时存储在内存中,然后稍后从缓存中引用。有关详细信息,请参阅下面的文章。

http://fredkschott.com/post/2014/06/require-and-the-module-system/

关于node.js - 使用 Webpack 构建后端 Express/WS Node 应用程序时的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44071707/

相关文章:

node.js - 如何在 Node.js 中使用 firestore 本地模拟器?

javascript - 使用请求/请求从浏览器发布文件

node.js - 在 express.js 中验证用户数据后如何上传图像

node.js - 在处理请求之前确定请求大小

mysql - 如何解析node.js,express.js,mysql2中 "rows"对象的数据

node.js - Angular 6 many Can't resolve errors (crypto, fs, http, https, net, path, stream, tls, zlib)

javascript - Mongoose Reconnect 事件在一段时间后没有被触发

javascript - 在 Windows 上运行并行 npm 脚本

javascript - Next.js 不加载 jsx

vue.js - Vue CLI - 编译后将配置文件保留为外部