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