ошибка импорта веб-пакета с узлом-postgres ('pg'.Client)

Попытка связать следующий файл с Webpack завершается с ошибкой

ОШИБКА в ./~/pg/lib/native/index.js Модуль не найден: Ошибка: не удается разрешить модуль «pg-native» в .../node_modules/pg/lib/native @ ./~/pg/lib/ родной/index.js 9:13-33

Я попробовал несколько операторов ignore в файле .babelrc, но он не заработал...

Тестовый файл, который я хочу связать: 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:


person Rentrop    schedule 07.01.2017    source источник
comment
Связанная проблема Github github.com/brianc/node-postgres/issues/838   -  person Jason    schedule 17.01.2017
comment
@ Джейсон, да, верно. Все еще не мог заставить это работать :(   -  person Rentrop    schedule 17.01.2017


Ответы (3)


Это действительно старая тема, но, тем не менее, она мне помогла. Решение, предоставленное Стивом Шафером 1, хорошее, но не самое простое.

Вместо этого тот, который предоставил Марко Люти 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: { ... },
  ...
}

Обновлено, чтобы включить изменение, предложенное в комментариях.

person Alexandre D'Erman    schedule 12.10.2020
comment
Спасибо, это сработало. Для webpack 4+ синтаксис немного отличается new webpack.IgnorePlugin({ resourceRegExp: /^pg-native$/ }), - person Ajay Bhosale; 24.11.2020

Это старая тема, но проблема все еще существует, поэтому для тех, кто с ней столкнулся, есть обходной путь. Проблема заключается во взаимодействии между тем, как написано 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 для дальнейшего обсуждения и альтернативных обходных путей.

person Steve Schafer    schedule 08.01.2020

У вас может быть pg-native глобально установлен локально. Следовательно, менеджер пакетов не включает pg-native в файл блокировки. Это была проблема, с которой я столкнулся, когда он работал нормально локально, но каждый раз, когда я собирал облачный веб-пакет, жаловался на отсутствие pg-native. Я решил это, удалив файл блокировки в файлах, отправленных в облако (в данном случае seed.run).

person Peter Savnik    schedule 03.01.2020