Подтвердить что ты не робот

Node не может найти модуль "fs" при использовании webpack

Я использую node.js и webpack для создания пакета. Из того, что я прочитал, node.js должен содержать fs модуль для управления файлами. Однако, когда я вызываю require("fs"), я получаю ошибку Cannot find module "fs". Что мне делать?

4b9b3361

Ответ 1

Я сам столкнулся с этой проблемой, связавшись с webpack и нашел ответ на этот поток.

Чтобы решить эту проблему, я должен был использовать следующую конфигурацию:

module.exports = {
  entry: "./app",
  output: {
    path: __dirname,
    filename: "bundle.js"
  },
  module: {
      loaders: [
          {  
              test: /\.js$/,
              exclude: 'node_modules',
              loader: 'babel',
              query: {presets: ['es2015']},
          }
      ]
  },
  target: 'node'
};

Установив цель в node, веб-пакет внесет необходимые изменения для связывания вашего приложения node

Изменить: этот ответ нацелил webpack 1.x, который теперь заменен.

Ответ 2

У меня была такая же проблема при связывании приложения NWjs с использованием веб-мастеров (которое, в свою очередь, включало node).

Решение, которое я нашел, состояло в том, чтобы включить каждый собственный модуль, который я использовал в externals, с префиксом commonjs к имени модуля. Например:

    ...
    target: "webworker", // or 'node' or 'node-webkit'
    externals:{
        fs:    "commonjs fs",
        path:  "commonjs path"
    }
    ...

Я сделал то же самое для целей "webworker" и "node -webkit" в разных проектах для решения одной и той же проблемы.

Ответ 3

Если вы запускаете свой пакет веб-пакетов в среде nodejs, то target: 'node' требуется в файле webpack.config.js, в противном случае webpack принимает значение по умолчанию в качестве web для цели , проверьте здесь.

Вы можете решить эту проблему двумя способами

Добавьте приведенную ниже конфигурацию в ваш webpack.config.js

node: {
    fs: "empty"
}

ИЛИ

Добавьте приведенную ниже конфигурацию в ваш package.json

"browser": {
    "fs": false
}

Ответ 4

Мне нужно было создать класс, который будет использовать fetch, если он выполняется в браузере, или fs, если он выполняется в узле. По другим причинам было нецелесообразно создавать отдельные пакеты, поэтому я создал один пакет, ориентированный на браузер.

Решением, которое я использовал, было использование eval('require("fs")'), если скрипт выполнялся в узле.

const fs = eval('require("fs")')

Безопасный для браузера (в браузере fs есть null):

const fs = typeof window === 'object'
    ? null
    : eval('require("fs")')

Ответ 5

В дополнение к ответу PDG

Я привык к этой короткой копии/вставке конфет.

Использование path и fs :

var nodeModules = {};
fs.readdirSync(path.resolve(__dirname, 'node_modules'))
  .filter(x => ['.bin'].indexOf(x) === -1)
  .forEach(mod => { nodeModules[mod] = 'commonjs ${mod}'; });

// Before your webpack configuration

module.exports = {
...
}

Затем в файле конфигурации включите переменную nodeModules во внешние externals

...
externals: nodeModules,
...

Ответ 6

Для решения, которое мы создаем, нам пришлось использовать старую версию веб-пакета:

npm install --save --force [email protected]

Ответ 7

Перепробовав все, что я нашел в Интернете (конфиги target, externals, node), единственное решение, которое действительно работало для меня, это замена:

const filesystem = require("fs")
        or
import fs from "fs"

специальной версией веб-пакета

const fs = __non_webpack_require__("fs")

Это генерирует функцию require, которая не анализируется веб-пакетом.