Webpack与Node-postgres('pg'.Client)的导入错误

11

使用Webpack尝试打包以下文件会失败:

ERROR in ./~/pg/lib/native/index.js Module not found: Error: Cannot resolve module 'pg-native' in .../node_modules/pg/lib/native @ ./~/pg/lib/native/index.js 9:13-33

我尝试在.babelrc中使用了几个ignore语句,但是无法运行...

我想要打包的测试文件为:handler.js

const Client = require('pg').Client;

console.log("done");

webpack.config.js

module.exports = {
  entry: './handler.js',
  target: 'node',
  module: {
    loaders: [{
      test: /\.js$/,
      loaders: ['babel'],
      include: __dirname,
      exclude: /node_modules/,
    }]
  }
};

.babelrc

{
  "plugins": ["transform-runtime"],
  "presets": ["es2015", "stage-1"]
}

package.json

"dependencies": {
  "postgraphql": "^2.4.0",
  "babel-runtime": "6.11.6"
},
"devDependencies": {
  "babel-core": "^6.13.2",
  "babel-loader": "^6.2.4",
  "babel-plugin-transform-runtime": "^6.12.0",
  "babel-preset-es2015": "^6.13.2",
  "babel-preset-stage-0": "^6.5.0",
  "babel-polyfill": "6.13.0",
  "serverless-webpack": "^1.0.0-rc.3",
  "webpack": "^1.13.1"
}

与之有关的github问题:


相关的 Github 问题 https://github.com/brianc/node-postgres/issues/838 - Jason
@Jason 是的,没错。还是无法让它工作 :( - Rentrop
4个回答

18

这确实是一个旧的帖子,但仍然对我有所帮助。Steve Schafer 1 提供的解决方案很好,但不是最简单的。

相反,由Marco Lüthy 2在相关问题中提供的解决方案可能是最容易设置的,因为它是纯配置,甚至不需要创建虚拟文件。

它包括修改你的Webpack配置plugins数组如下:

const webpack = require('webpack');

const webpackConfig = {
  ...
  resolve: { ... },
  plugins: [
    new webpack.IgnorePlugin(/^pg-native$/)
    // Or, for WebPack 4+:
    new webpack.IgnorePlugin({ resourceRegExp: /^pg-native$/ })
  ],
  output: { ... },
  ...
}

更新以包括评论中建议的更改。


8
谢谢,它奏效了。对于 webpack 4+,语法略有不同:new webpack.IgnorePlugin({ resourceRegExp: /^pg-native$/ }), - Ajay Bhosale

7

这是一个旧帖子,但问题仍然存在,所以对于任何遇到这个问题的人,有一种解决方法。问题在于node-postgres 的编写方式与 babel 重写代码的交互方式,这会导致即使您没有明确导入/要求它,pg-native也必须被加载。

最简单的解决方法是向您的webpack.config.js 添加一对别名,使其链接到一个虚拟的无操作文件即可:

{
  ...
  resolve: {
    alias: {
      ...
      'pg-native': path-to-dummy-js-file,
      'dns': path-to-dummy-js-file
    }
  }
  ...
}

虚拟文件中只包含一行:

export default null

请参见 https://github.com/brianc/node-postgres/issues/838 以进一步讨论和寻找其他解决方法。


1

我知道这是一个旧话题,但我不得不分享一下我是如何解决它的。这真是令人发狂。

因此,以下是根据我最后一颗脑细胞的回忆所述的读者摘要版本。

错误:

Webpack编译错误./node_modules/pg/lib/native/client.js 模块未找到:错误:无法解析'pg-native'

在尝试运行需要npm包'pg'的Cypress测试时,会抛出上述错误。

尝试安装pg-native包失败并导致另一个错误;即->

在binding.gyp中调用'pg_config --libdir'返回退出状态1。尝试加载binding.gyp时出错

我发现在VSCode cmd提示符中执行pg_config --libdir会导致该命令失败。

然而,我知道它应该可以工作,因为从系统命令提示符中运行该命令会导致这个-> C:/PROGRA~1/POSTGR~1/9.3/lib

那是包含所需dll的路径。

因此,我没有从VSCode命令提示符中运行npm install,而是从Windows启动的命令提示符中运行它。

结果……成功!!!pg-native已成功安装。

之后,Cypress测试也能够运行。

错误并没有帮助我找到这个解决方案。更多的是检查所需的安装内容等。


-1

你可能在本地全局安装了pg-native。因此,包管理器没有将pg-native包含在锁定文件中。这是我遇到的一个问题,它在本地运行良好,但每次在云端构建时,webpack都会抱怨缺少pg-native。我通过从推送到云端的文件中删除锁定文件(在这种情况下是seed.run)来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接