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

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

Вопрос:

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

Лучший ответ:

Я сам столкнулся с этой проблемой, связавшись с 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, который теперь заменен.

Ответ №1

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

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

… target: «webworker», // or ‘node’ or ‘node-webkit’ externals:{ fs: «commonjs fs», path: «commonjs path» } …

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

webpack nwjs nodejs

Ответ №2

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

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

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

node: { fs: «empty» }

ИЛИ

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

«browser»: { «fs»: false } Ответ №3

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

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

const fs = eval(‘require(«fs»)’)

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

const fs = typeof window === ‘object’ ? null : eval(‘require(«fs»)’) Ответ №4

В дополнение к ответу 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, … Ответ №5

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

npm install —save —force webpack@webpack-3 Ответ №6

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

const filesystem = require(«fs») or import fs from «fs»

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

const fs = __non_webpack_require__(«fs»)

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

Оцените статью
Добавить комментарий