8 votes

Mise à niveau vers Webpack 5 en cassant Storybook 5

Je suis en train de mettre à jour un projet webpack 4/storybook 5 vers webpack 5 pour, je l'espère, profiter des modules fédérés. J'ai régulièrement webpack --config webpack.config.js Il n'y a pas grand chose dans le storybook webpack.config.js - juste quelques règles de module pour tester les fichiers less et utiliser les chargeurs appropriés. Il semble que l'erreur que je rencontre soit typique de la mise à jour des majors de webpack, car j'ai trouvé un certain nombre de personnes qui ont rencontré la même chose en passant de 3 à 4, mais tout ce que j'ai essayé a échoué jusqu'à présent. La trace de pile spécifique est la suivante :

Cannot read property 'tapAsync' of undefined
    at ExternalModuleFactoryPlugin.apply (/Users/tbullard/Workspace/unify/node_modules/webpack/lib/ExternalModuleFactoryPlugin.js:29:39)
    at compiler.hooks.compile.tap (/Users/tbullard/Workspace/unify/node_modules/webpack/lib/ExternalsPlugin.js:24:63)
    at SyncHook.eval [as call] (eval at create (/Users/tbullard/Workspace/unify/node_modules/tapable/lib/HookCodeFactory.js:19:10), <anonymous>:7:1)
    at SyncHook.lazyCompileHook (/Users/tbullard/Workspace/unify/node_modules/tapable/lib/Hook.js:154:20)
    at hooks.beforeCompile.callAsync.err (/Users/tbullard/Workspace/unify/node_modules/@storybook/core/node_modules/webpack/lib/Compiler.js:665:23)
    at _err0 (eval at create (/Users/tbullard/Workspace/unify/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:11:1)
    at compiler.inputFileSystem.readFile (/Users/tbullard/Workspace/unify/node_modules/@storybook/core/node_modules/webpack/lib/DllReferencePlugin.js:72:15)
    at process.nextTick (/Users/tbullard/Workspace/unify/node_modules/@storybook/core/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:85:15)
    at process._tickCallback (internal/process/next_tick.js:61:11)

Cela m'amène à penser qu'il y a une incompatibilité de plugin TIA !

6voto

Tiago Sousa Points 61

Storybook n'est pas mais prêt à travailler avec Webpack 5 mais c'est sur leur feuille de route pour la version 7.0 .

Plus de contexte dans ce Numéro de GitHub .

3voto

John Camden Points 31

A partir de 6.2.0 Le générateur de prévisualisation de Storybook est officiellement compatible avec Webpack 5 et le générateur de gestion est officieusement compatible avec Webpack 5. Voir cette explication des constructeurs et la compatibilité avec Webpack 5. Consultez également cette section gist/commentaires avec des instructions d'installation plus détaillées.

Si j'ai bien compris, le fait de configurer le constructeur en Webpack 5 (selon ces instructions) forcera l'utilisation de l'outil de création de pages Webpack. aperçu pour utiliser Webpack 5, ce qui vous permet d'exposer vos composants d'interface utilisateur aux nouvelles fonctionnalités de Webpack 5 telles que fédération de modules .

Toutefois, si vous souhaitez également forcer le manager pour utiliser Webpack 5 (afin de ne plus avoir à se séparer de Webpack 4), vous devrez utiliser les éléments suivants Résolutions sélectives des dépendances de Yarn . Voici ce que j'ai fait spécifiquement (dans un package.json) :

"resolutions": {
    "webpack": "^5.27.2",
    "css-loader": "^5.0.1",
    "dotenv-webpack": "^7.0.2",
    "html-webpack-plugin": "^5.0.0",
    "style-loader": "^2.0.0",
    "terser-webpack-plugin": "^5.1.1",
    "webpack-dev-middleware": "^4.1.0",
    "webpack-virtual-modules": "^0.4.2"
  }

Avec ces résolutions, Yarn détecte que Webpack 4 n'est plus utilisé et le supprime. Le build SB donne cet avertissement :

info @storybook/react v6.2.0-rc.10
info 
info => Loading presets
WARN Unexpected webpack version in manager-builder
WARN - Received: 5.27.2
WARN - Expected: 4.x

L'une des tâches de la migration de Webpack 4 vers 5 consiste à fournir manuellement des polyfills de navigateur pour les paquets de nœuds qui étaient automatiquement fournis par Webpack 4. Je tiens à souligner que si vous vous retrouvez à fournir manuellement une tonne de polyfills lors de la mise à niveau de Storybook vers Webpack 5, vous avez probablement pris la mauvaise direction. Les builds de Storybook dev-server sont mis en cache dans un répertoire node_modules local (du paquet où Storybook est installé) (whatever-package/node_modules/.cache/storybook/dev-server). Supprimer régulièrement le sous-répertoire dev-server peut vous aider à déboguer votre build et potentiellement vous éviter de construire de longues listes de polyfills node inutiles. (J'ai appris cela à la dure).

Cela dit, pour une installation propre de Storybook, vous n'avez peut-être pas besoin de polyfill. D'un autre côté, certains cas nécessitent les polyfills de nœuds (par exemple, @storybook/addon-docs nécessite "assert" (voir ci-dessous)). Voici une façon d'ajouter les polyfills (et les addons, si vous voulez) à la configuration Webpack de Storybook dans main.js :

module.exports = {
  core: {
    builder: 'webpack5',
  },
  stories: ['../whatever/src/**/*.stories.@(ts|tsx)'],
  addons: [
    '@storybook/addon-actions',
    '@storybook/addon-controls',
    '@storybook/addon-docs',
  ],
  webpackFinal: (config) => {
    return {
      ...config,
      resolve: {
        ...config.resolve,
        fallback: {
          ...config.fallback,
          assert: require.resolve('assert-browserify/'),
        },
      },
    };
  },
};

Re : addons, j'ai eu de sérieux problèmes avec les polyfills de nœuds en essayant d'utiliser addon-essentials . J'ai... ajouté... des addons au coup par coup à la place (paquets autonomes via npm), et cela semble fonctionner sans aucun polyfill ( @storybook/actions y @storybook/controls sont bons oob ; @storybook/docs nécessite le polyfill assert (ci-dessus), @storybook/addons fonctionne également très bien avec les thèmes dans manager.ts - c'est à dire :

import { addons } from '@storybook/addons';
import { themes } from '@storybook/theming';

addons.setConfig({
  theme: themes.dark,
}); 

Je tiens également à souligner que l'ajout de sass-loader à Webpack config.module.rules fonctionne comme prévu. Certaines personnes rencontrer des problèmes avec quelques présélections scss avec Storybook et Webpack 5. Voici la partie pertinente d'une configuration correcte de Storybook Webpack pour Sass :

 module: {
        ...config.module,
        rules: [
          ...config.module.rules,
          {
            test: /\.(scss)$/,
            use: [
              {
                loader: 'style-loader',
              },
              {
                loader: 'css-loader',
              },
              {
                loader: 'postcss-loader',
                options: {
                  postcssOptions: {
                    plugins: function () {
                      return [require('precss'), require('autoprefixer')];
                    },
                  },
                },
              },
              {
                loader: require.resolve('sass-loader'),
                options: {
                  // using sass (Dart) instead of node-sass because node-sass (Javascript) cannot resolve Yarn 2's Plug'N'Play synthetic node_modules directory
                  // Evidently, sass is a bit slower to compile than node-sass, but I think I prefer sass anyway for latest features (such as @use)
                  implementation: require('sass'),
                },
              },
            ],
          },
        ],
      },

J'espère que cela vous fera décoller

0voto

Nadia Ghebreial Points 93

Cela m'est arrivé aussi, à la fin je l'ai résolu en mettant la dépendance pour storybook webpack5 mais en utilisant webpack4 :

    "@storybook/addon-actions": "^6.2.9",
    "@storybook/addon-controls": "^6.2.9",
    "@storybook/addon-storysource": "^6.2.9",
    "@storybook/builder-webpack5": "^6.2.9",
    "@storybook/vue": "^6.2.9",

Comme je l'ai lu ici : https://stackoverflow.com/a/67075112/5384339 Je pense qu'il est préférable d'attendre un peu avant d'utiliser webpack5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X