使用Webpack

时间:2017-05-19 13:44:47

标签: node.js express webpack

在使用Webpack构建后端节点服务器时,我收到一些令人困惑的警告。我想使用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来修复此依赖关系呢?

对于Module not found包中的ws警告,我不清楚发生了什么。看起来这些依赖项存在于我的全局 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
  }
};

我喜欢尽可能保持最小化。谢谢你的阅读。

1 个答案:

答案 0 :(得分:1)

简短回答

webpack可以与节点一起使用,但是它无法提取关注require()语句。必须进行修改以忽略require()以使其起作用。

答案很长

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

  • 一个例子是,如果所有需要的模块都是用typescript编写的,那么模块是在一个文件编写插件可以解析模块的地方编写的。

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

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

最终答案

尝试执行长答案确实无关紧要,因为模块在引导时存储在内存中,然后从缓存中引用。有关详细信息,请参阅以下文章。

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