web-dev-qa-db-fra.com

Node ne trouve pas le module "fs" lors de l'utilisation de webpack

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?

35
user3799968

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é.

38
Joe Withey

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.

webpacknwjswebworkernodejsnoeud

12
PDG

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
}
10
Hemadri Dasari

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")')
3
wizulus

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,
...
2
Lowinput

Pour la solution que nous élaborons, nous avons dû forcer une ancienne version de webpack:

npm install --save --force webpack@webpack-3
1
Brian Smith