J'utilise node.js et webpack pour créer un paquet. D'après ce que j'ai lu, node.js devrait contenir le module fs
de gestion des fichiers. Cependant, lorsque j'appelle require("fs")
, je reçois un Cannot find module "fs"
Erreur. Que devrais-je faire?
Je suis tombé sur ce problème moi-même lors de la compilation avec webpack et j'ai trouvé la réponse sur ce fil .
La façon de le résoudre pour moi était d'utiliser la configuration suivante:
module.exports = {
entry: "./app",
output: {
path: __dirname,
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.js$/,
exclude: 'node_modules',
loader: 'babel',
query: {presets: ['es2015']},
}
]
},
target: 'node'
};
En définissant target sur node, Webpack apportera les modifications nécessaires pour regrouper votre application de nœud.
Edit: Cette réponse visait le webpack 1.x qui a maintenant été remplacé.
J'ai eu le même problème lorsque j'ai regroupé une application NWjs à l'aide de webworkers (pour laquelle le nœud était activé).
La solution que j'ai trouvée consistait à inclure chaque module natif que j'avais utilisé dans externals
avec le préfixe commonjs
au nom du module. Par exemple:
...
target: "webworker", // or 'node' or 'node-webkit'
externals:{
fs: "commonjs fs",
path: "commonjs path"
}
...
J'ai fait la même chose pour les cibles "webworker" et "node-webkit" dans différents projets pour résoudre le même problème.
Si vous exécutez votre ensemble de packs Web dans l'environnement nodejs, alors cible: 'noeud' est requis dans le fichier webpack.config.js, sinon Webpack prend la valeur par défaut en tant que site Web pour la cible à vérifier ici .
Vous pouvez résoudre le problème de deux manières.
Ajoutez la configuration ci-dessous à votre webpack.config.js
node: {
fs: "empty"
}
[~ # ~] ou [~ # ~]
Ajoutez la configuration ci-dessous à votre package.json
"browser": {
"fs": false
}
J'avais besoin de construire une classe qui utiliserait fetch
si elle était exécutée dans un navigateur ou fs
si elle était exécutée dans un noeud. Pour d'autres raisons, il était peu pratique de créer des ensembles distincts. J'ai donc créé un seul ensemble ciblé sur un navigateur.
La solution que j'ai utilisée consistait à utiliser eval('require("fs")')
si le script était exécuté dans node.
const fs = eval('require("fs")')
Sûr pour le navigateur (fs
est null
dans le navigateur):
const fs = typeof window === 'object'
? null
: eval('require("fs")')
En plus de la réponse de PDG
Je suis habitué à ce court copier/coller des bonbons.
Utilisation de chemin et 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 = {
...
}
Ensuite, dans votre fichier de configuration, incluez la variable nodeModules dans la variable externe .
...
externals: nodeModules,
...
Pour la solution que nous élaborons, nous avons dû forcer une ancienne version de webpack:
npm install --save --force webpack@webpack-3