Вопрос:
Я использую 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 webworker nodejs node
Ответ №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, которая не анализируется веб-пакетом.