使用Webpack构build后端Express / WS Node应用程序时的警告

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

  • Webpack创build一个单一的可执行文件,这是更容易部署
  • 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警告,我find了一个很好的例子来解释这个问题,以及关于如何使用ContextReplacementPlugin的一些文档,尽pipe目前还不清楚如何将其应用于这种情况。 看起来警告是由node_modules/express/lib/view.js第80行引起的:

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

我很清楚依赖不能在构build时解决,那么我怎样才能使用ContextReplacementPlugin来修复这个依赖?

至于Module not foundws包警告,我不清楚发生了什么事情。 看起来这些依赖关系存在于我的全局 node_modules ,也许它们并没有被Webpack所吸引。 我已经尝试将它们添加到我的项目的devDependencies,但是我只是为他们获得Critical dependency警告。

我的应用程序仍然运行后,所以我想我可以在技术上忽略警告,但我认为这些广泛使用节点包和Webpack是一个stream行的构build工具,所以必须有一个合理的解决scheme。


这里是我的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可以和节点一起工作,但是它不能提取require()语句。 必须修改忽略require()才能工作。

长的答案

实际上有可能将一些文件拖入主文件并在某些情况下运行。

  • 一种情况是,如果所有需要的模块都是用打字机编写的,而模块则是写在一起,打字机插件可以parsing模块。

  • 另一个例子是如果你使用es6的babel插件,并使用es6风格的导入。

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

最终的答案

尝试执行长答案确实无关紧要,因为模块在引导时存储在内存中,然后在高速caching中引用。 请参阅下面的文章以获取更多信息。

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