Implementierungsschritte zum Erstellen eines Webpack5-React-Gerüsts von Grund auf (mit Quellcode)

Implementierungsschritte zum Erstellen eines Webpack5-React-Gerüsts von Grund auf (mit Quellcode)

webpack5

Vor kurzem hatte ich endlich Zeit und Energie, mich auf die technische Infrastruktur des Unternehmens zu konzentrieren. Also habe ich zu Beginn das SaaS-System des Unternehmens in ein Micro-Frontend-Modell umgewandelt, um einige der Probleme zu lösen, die aus der Vergangenheit übrig geblieben waren.

Wenn man bedenkt, dass webpack5 schon so lange veröffentlicht wurde, ist es an der Zeit, es in der Produktionsumgebung zu verwenden. Ich möchte auch die Popularität von Micro-Frontends, webpack5 und vite in der Branche fördern. Freunde, die meine vorherigen Artikel nicht gelesen haben, können am Ende des Artikels danach suchen. Es gibt wirklich eine Menge Trockenware.

Offizieller Start

Welche Änderungen haben sich nach dem Upgrade auf webpack5 ergeben?

  • Leistungssteigerung durch persistentes Caching
  • Bessere persistente Cache-Algorithmen und Standardverhalten übernehmen
  • Reduzieren Sie die Paketgröße, indem Sie Tree Shaking und Codegenerierung optimieren (Entfernen von Node.js-Polyfill).
  • Verbessern Sie die Kompatibilität der Webplattform
  • Beseitigen Sie den unangemessenen Zustand, der durch keine inkompatiblen Änderungen verursacht wird, um Webpack4 zu erreichen
  • Versuchen Sie, jetzt wichtige Änderungen einzuführen, um sich auf zukünftige Funktionen vorzubereiten, damit wir Webpack 5 so lange wie möglich nutzen können.
  • Modulföderation hinzugefügt

Bauanleitung

Ich empfehle Ihnen, das Gerüst zu verwenden, das ich in unserem Unternehmen (Shenzhen Mingyuan Cloud Space) erstellt habe, um mit einem Klick eine Projektvorlage für Sie zu generieren, damit Sie beim Lesen dieses Artikels bessere Fortschritte erzielen.

Schritte zum Erstellen einer Vorlage:

npm ich ykj-cli -g 
ykj init webpack5 (wählen Sie hier die allgemeine Projektvorlage aus)
CD webpack5
Garn 
Garn-Entwickler

Beginnen Sie mit dem Aufbau

Erstellen Sie zunächst einen neuen Ordner und initialisieren Sie das Projekt mit Yarn

mkdir webpack5-demo
CD Webpack5-Demo
Garn init Webpack5-Demo
...Geben Sie den ganzen Weg ein

Laden Sie die neueste Version von webpack webpack-cli herunter:

Garn hinzufügen webpack@next webpack-cli@next -D

Installieren Sie dann die React react-dom17 Versionsbibliothek

Garn hinzufügen [email protected] [email protected] --speichern

Installieren Sie dann die von react official hot update empfohlene Bibliothek

Garn hinzufügen reagieren-erneuern -D

Installieren Sie weniger CSS-Style-Tags, PostCSS und andere Style-Verarbeitungsbibliotheken (für das Mini-CSS-Extract-Plugin muss die @next-Version installiert werden).

Garn hinzufügen weniger Less-Loader CSS-Loader Style-Loader Mini-CSS-Extrakt-Plugin@next -D

Installieren Sie verwandte Babel-Abhängigkeiten

Garn hinzufügen [email protected] @babel/core@next babel-loader@next @babel/preset-env@next -D

Welche speziellen Konfigurationen erfordert Babel? Ich schlage vor, Sie beziehen sich auf meine Vorlage

Beginnen Sie nach Abschluss der abhängigen Vorbereitungen mit dem Aufbau des Projekts

Erstellen Sie einen Konfigurationsordner im Stammverzeichnis des Projekts, um die Webpack-Konfigurationsdatei zu platzieren
Erstellen Sie vier neue Dateien im Konfigurationsordner

paths.js//Speicherpfadwebpack.base.js //Grundkonfigurationwebpack.dev.js//Entwicklungskonfigurationwebpack.prod.js//Produktionskonfiguration

Verwenden Sie in der Pfaddatei Variablen, um mehrere wichtige Verzeichnisse aufzuzeichnen:

const path = require('Pfad');

modul.exporte = {
    // Quellverzeichnis src: path.resolve(__dirname, '../src'),

    // Der Ressourcenproduktordner nach der Erstellung von build: path.resolve(__dirname, '../dist'),

    // statische Ressource öffentlich: path.resolve(__dirname, '../public'),
};

Schreiben Sie die grundlegende Konfigurationsdatei webpack.base.js und führen Sie Abhängigkeiten ein

//webpack.base.js
const { CleanWebpackPlugin } = erforderlich('clean-webpack-plugin');
const HtmlWebpackPlugin = erfordern('html-webpack-plugin');
const path = require('Pfad');
const Pfade = erfordern('./Pfade');

Schreiben Sie die Eingabe- und Ausgabefelder:

 Eintrag: paths.src + 'index.tsx',
 Ausgabe: {
        Pfad: Pfad.auflösen(__dirname, '../dist'),
        Dateiname: '[name].[contenthash].js',
        öffentlicher Pfad: '',
    },

Anzumerken ist hier, dass webpack5 den Contenthash Algorithmus optimiert hat. Hier kann zwischen Chunkhash und Contenthash gewählt werden. Contenthash wird empfohlen.

Schreiben Sie die grundlegende Loader-Konfiguration:

    Modul: {
        Regeln:
            {
                verwenden: 'babel-loader',
                Test: /\.(ts|tsx)$/,
                ausschließen: /node_modules/,
            },
            {
                verwenden: ['style-loader', 'css-loader', 'less-loader'],
                Test: /\.(css|less)$/,
            },
            {
                Typ: "Vermögenswert",
                Test: /\.(png|svg|jpg|jpeg|gif)$/i,
            },
        ],
    },

Hierbei ist zu beachten, dass webpack5 integrierte Assets zur Verarbeitung von Ressourcen wie Bildern und Schriftdateien nutzen kann, ohne URL-Loader und Datei-Loader.

Da das Projekt Aliase konfigurieren und Suffixe weglassen muss, konfigurieren wir als Nächstes zuerst das Resolve-Feld (ich verwende den Technologiestapel TypeScript+React):

 lösen: {
        Erweiterungen: ['.ts', '.tsx', '.js', '.json', '.jsx'],
        Alias: {
            '@': Pfade.src,
            '@c': Pfade.src + '/Komponenten',
            '@m': Pfade.src + '/Modell',
            '@s': Pfade.src + '/Dienste',
            '@t': Pfade.src + '/Typen',
        },
    },

Da es sich um eine Basiskonfiguration handelt, wird bei den Plugins nur ein sauberes HTML-Plugin benötigt.

  Plugins: [
        neues CleanWebpackPlugin(),
        neues HtmlWebpackPlugin({
            Vorlage: './public/index.html',
        }),
    ],

Erstellen Sie eine neue Datei babel.config.js im Stammverzeichnis des Projekts

const { argv } = erfordern('yargs');
const isDev = argv.mode === 'Entwicklung';
const-Plugins = [
    [
        "Konstante Aufzählung",
        {
            transformieren: "constObject",
        },
    ],
    'lodash',
    '@babel/plugin-transform-runtime',
    //Unterstützt verzögertes Laden des Imports '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-transform-async-to-generator',
    'Transform-Klasseneigenschaften',
    [
        'Import',
        {
            Bibliotheksname: "antd",
            libraryDirectory: 'es',
            Stil: true, // oder „css“
        },
        'antd',
    ],
    [
        'Import',
        {
            Bibliotheksname: "ykj-ui",
            Bibliotheksverzeichnis: 'lib/components',
            Stil: true, // oder „css“
        },
        'ykj-ui',
    ],
];
module.exports = (api) => {
    api.cache(true);
    zurückkehren {
        Voreinstellungen: [
            [
                '@babel/Vorgabe-Umgebung',
                {
                    corejs: 3.9,
                    useBuiltIns: 'Verwendung',
                },
            ],
            [
                '@babel/Voreinstellung-reagieren',
                {
                    Laufzeit: 'automatisch',
                },
            ],
            '@babel/Vorgabe-Typescript',
        ],
        Plugins: isDev? [...Plugins, 'react-refresh/babel']: [...Plugins],
    };
};

Damit ist unsere grundlegende Webpack-Konfiguration fertig. Lassen Sie uns das zuerst klären:

  • Verwenden Sie Babel, um die hochrangige Syntax von TSX, TS und ES zu verarbeiten.
  • Verwenden Sie den Loader, um weniger Syntax zu verarbeiten
  • Verwenden Sie Plugins, um HTML zu verarbeiten und zu bereinigen
  • Verwenden Sie das Feld „resolve“, um Aliase zu konfigurieren und Dateisuffixe wegzulassen
  • Verwenden Sie integrierte Assets, um statische Dateien wie Bilder usw. zu verarbeiten.

Schreiben Sie die Entwicklungskonfiguration webpack.dev.js

Einführung von Abhängigkeiten

const ReactRefreshWebpackPlugin = erforderlich('@pmmmwh/react-refresh-webpack-plugin');
const { HotModuleReplacementPlugin } = erfordern('webpack');
const { merge } = erfordern('webpack-merge');
const common = erfordern('./webpack.base');

Führen Sie zuerst das Hot-Update ein, führen Sie die Konfiguration zusammen, konfigurieren Sie die Basiskonfiguration, reagieren Sie offiziell auf die Abhängigkeit des Hot-Updates und schreiben Sie dann die Konfiguration

const devConfig = {
    Modus: "Entwicklung",
    devServer: {
        Port: 3000,
        Inhaltsbasis: "../dist",
        offen: wahr,
        heiß: wahr,
    },
    Ziel: "Web",
    Plugins: [neues HotModuleReplacementPlugin(), neues ReactRefreshWebpackPlugin()],
    devtool: "eval-cheap-modul-source-map",
};

module.exports = merge(common, devConfig);

Hinweis: Sie müssen das Ziel „Web“ festlegen, um einen Hot-Update-Effekt zu erzielen.

Die beste Vorgehensweise für devtool im Entwicklungsmodus ist: eval-cheap-module-source-map

Auf diese Weise ist unsere Entwicklungsmoduskonfiguration eingerichtet. Schreiben Sie einfach eine index.html in den öffentlichen Ordner und Sie können wie zuvor mit dem Schreiben von React-Projekten beginnen.

Beginnen Sie mit dem Schreiben der Produktionskonfiguration webpack.prod.js

Abhängigkeiten einführen:

const MiniCssExtractPlugin = erfordern('mini-css-extract-plugin');
const { merge } = erfordern('webpack-merge');
const common = erfordern('./webpack.base');

Die Produktionsumgebung muss CSS-Tags extrahieren, daher ist für Less und CSS eine spezielle Verarbeitung erforderlich. Eine davon ist postcss, um Probleme mit der Stilkompatibilität zu behandeln, und die andere ist MiniCssExtractPlugin.loader:

const prodConfig = {
    Modus: 'Produktion',
    devtool: 'versteckte Quellkarte',
    Modul: {
        Regeln:
            {
                Test: /\.(css|less)$/,
                verwenden: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader'],
            },
        ],
    },
    Optimierung:
        geteilte Chunks: {
            Brocken: "alle",
            Name: falsch,
        },
    },
    Plugins: [neues MiniCssExtractPlugin()],
};
module.exports = merge(common, prodConfig);

Außerdem wird die Konfiguration für die Produktion geschrieben.

Die beste Vorgehensweise für Produktions-Devtools ist: hidden-source-map

Schreiben von Skriptbefehlen

"Build": "webpack --config config/webpack.prod.js --mode Produktion",
"dev": "webpack serve --config config/webpack.dev.js --mode Entwicklung",

Hinweis: Das Hot Update hieß früher „webpack-dev-server“, jetzt heißt es „webpack serve“!!!

Konfigurieren des Codequalitätskontrollprozesses

Abhängigkeiten hinzufügen

Garn fügt lint-staged hinzu @commitlint/cli @commitlint/config-conventional -D

Code schreiben und Testvorgang übermitteln

 "Husky": {
        "Haken": {
            "pre-commit": "lint-staged",
            "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
        }
    },
    "lint-staged": {
        "src/**/*.{js,jsx,ts,tsx,json,css,less,md}": [
            "hübscher --write",
            "eslint --fix",
            "git add"
        ]
    },
    "Browserliste": [
        "dh >= 10",
        "ff >= 30",
        "Chrom >= 34",
        "Safari >= 8",
        "Oper >= 23"
    ]
}

Eslint-Konfiguration hinzufügen:

//.eslintrc.js
modul.exporte = {
    Wurzel: wahr,
    Parseroptionen: {
        ecmaVersion: 7,
        Quelltyp: "Modul",
    },
    Parser: '@typescript-eslint/parser',
    Plugins: ['Typescript', 'Reagieren'],
    Umgebung: {
        Browser: wahr,
        Knoten: wahr,
        es6: wahr,
    },
    Regeln:
        semi: ['error', 'always'], // Diese Regel erzwingt konsistente Semikolons 'no-unused-vars': 'off', // Nicht verwendete Variablen nicht zulassen 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // Debugger in der Produktionsumgebung deaktivieren
        „no-console“: process.env.NODE_ENV === „Produktion“? „Fehler“: „aus“, //Konsole in der Produktionsumgebung deaktivieren
        'default-case': ['warn', { commentPattern: '^no default$' }], //Erfordert Default in der Switch-Anweisung
        'dot-location': ['warn', 'property'], // Erzwinge einen Zeilenumbruch vor oder nach dem doteqeqeq: ['error', 'allow-null'], // Erfordert die Verwendung von === und !==
        „new-parens“: „warn“, // Klammern sind erforderlich, wenn ein Konstruktor ohne Argumente aufgerufen wird. „no-caller“: „error“, // Anrufer oder Angerufenen deaktivieren.
        'no-const-assign': 'error', //Ändern von mit const deklarierten Variablen nicht zulässig'no-dupe-args': 'error', //Doppelte Parameter in Funktionsdefinitionen nicht zulässig'no-dupe-class-members': 'error', //Doppelte Namen in Klassenmitgliedern nicht zulässig'no-dupe-keys': 'warn', //Doppelte Schlüssel in Objektliteralen nicht zulässig'no-extend-native': 'warn', //Erweitern nativer Objekte nicht zulässig'no-extra-bind': 'warn', //Unnötiges Funktionsbinden nicht zulassen'no-fallthrough': 'error', //Fallthrough von Case-Anweisungen nicht zulassen'no-func-assign': 'warn', //Neuzuweisung von Funktionsdeklarationen nicht zulassen'no-implied-eval': 'error', //Implizites eval() deaktivieren
        'no-label-var': 'error', //Deaktiviere Labels mit dem gleichen Namen wie Variablen 'no-loop-func': 'error', //Deaktiviere Funktionen in Schleifen 'no-mixed-operators': [
            'warnen',
            {
                Gruppen: [
                    ['&', '|', '^', '~', '<<', '>>', '>>>'],
                    ['==', '!=', '===', '!==', '>', '>=', '<', '<='],
                    ['&&', '||'],
                    ['in', 'Instanz von'],
                ],
                allowSamePrecedence: false,
            },
        ], //Deaktiviere die gemischte Verwendung verschiedener Operatoren 'no-multi-str': 'warn', //Deaktiviere mehrzeilige Zeichenfolgen (verwende \n, wenn mehrere Zeilen erforderlich sind)
        'no-native-reassign': 'warn', //Deaktiviere die Neuzuweisung lokaler Objekte. 'no-obj-calls': 'warn', //Deaktiviere das Aufrufen globaler Objekte als Funktionen. 'no-redeclare': 'error', //Deaktiviere die Neudeklaration von Variablen. 'no-script-url': 'warn', //Deaktiviere Skript-URL.
        'no-shadow-restricted-names': 'warn', //Schlüsselwörter können nicht überschattet werden 'no-sparse-arrays': 'warn', //Spärliche Arrays deaktivieren 'no-this-before-super': 'warn', //Deaktivieren Sie die Verwendung von this oder super, bevor Sie super() im Konstruktor aufrufen
        'no-undef': 'error', //Nicht deklarierte Variablen deaktivieren 'no-unexpected-multiline': 'warn', //Verwirrende mehrzeilige Ausdrücke deaktivieren 'no-use-before-define': [
            'warnen',
            {
                Funktionen: false,
                Klassen: false,
                Variablen: false,
            },
        ], //Verwendung vor der Definition deaktivieren'no-with': 'error', //Mit Anweisung deaktivierenradix: 'error', //Generatorfunktion ohne Yield in der Funktion deaktivieren'rest-spread-spacing': ['warn', 'never'], //Begrenzung des Leerzeichens zwischen dem Spread-Operator und seinem Ausdruck erzwingen'react/jsx-no-undef': 'error', //Nicht deklarierte Variablen in JSX deaktivieren'react/no-direct-mutation-state': 'error', //Direkte Änderungen an this.state deaktivieren'react/jsx-uses-react': 'warn', //Verhindern, dass React fälschlicherweise als nicht verwendet markiert wird'no-alert': 0, //Verwendung der Warnbestätigungsaufforderung deaktivieren
        'no-duplicate-case': 2, //Fallbezeichnungen im Schalter können nicht wiederholt werden'no-eq-null': 2, //Verwenden Sie keine ==- oder !=-Operatoren auf null'no-inner-declarations': [2, 'functions'], //Verwenden Sie keine Deklarationen (Variablen oder Funktionen) in Blockanweisungen
        'no-iterator': 2, //Deaktiviere die Verwendung des Attributs __iterator__. 'no-negated-in-lhs': 2, //Die linke Seite des In-Operators darf nicht haben!
        „no-octal-escape“: 2, // Deaktiviert die Verwendung von oktalen Escape-Sequenzen. „no-plusplus“: 0, // Deaktiviert die Verwendung von ++, --
        'no-self-compare': 2, //Kann sich nicht selbst vergleichen. 'no-undef-init': 2, //Kann einer Variablen beim Initialisieren nicht direkt „undefined“ zuweisen.
        'no-unused-expressions': 2, //Unnötige Ausdrücke verbieten 'no-useless-call': 2, //Unnötige Aufrufe und Anwendungen verbieten
        'init-declarations': 0, // muss beim Deklarieren ein Anfangswert zugewiesen werden 'prefer-const': 0, // const wird bevorzugt
        'use-isnan': 2, //Deaktiviere die Verwendung von NaN beim Vergleichen, verwende nur isNaN()
        'vars-on-top': 2, //var muss oben im Bereich platziert werden},
};

Komponententests

Neue Befehle:

"test": "jest", //Test durchführen "test-c": "jest --coverage" //Testbericht erstellen

Installieren Sie Jest und andere Abhängigkeiten:

Garn hinzufügen Jest-Umgebung-Enzym ts-jest@nächstes Enzym Enzym-Adapter-Reagieren-17 Enzym-zu-JSON @Typen/Enzym @Typen/Enzym-Adapter-Reagieren-17 @Typen/Enzym-zu-JSON -D 

Einen neuen Ordnertest erstellen

Schreiben Sie den ersten Unit-Test und führen Sie Abhängigkeiten ein:

importiere App aus „../src/App“;
importiere { mount, flach } von 'Enzym';
importiere React von „react“;
importiere toJson von 'enzyme-to-json'; //Erstelle einen Schnappschuss

Dann können Sie fröhlich mit dem Schreiben von Unit-Tests beginnen.

Auf diese Weise wird ein Webpack5-Gerüst erstellt. Einige der in Webpack integrierten Dinge können uns viel Konfigurationsaufwand ersparen und es einfacher aussehen lassen.

Damit ist dieser Artikel über die Implementierungsschritte zum Erstellen eines Webpack5-React-Gerüsts von Grund auf (mit Quellcode) abgeschlossen. Weitere relevante Inhalte zum Webpack5-React-Gerüst finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • So verwenden Sie webpack4.0 zum Erstellen ein-/mehrseitiger Scaffolds (jquery, react, vue, typescript)
  • Methoden und Schritte zum Erstellen eines React-Scaffoldings von Grund auf basierend auf webpack4.X
  • Webpack+React+Antd-Gerüstoptimierungsmethode

<<:  So richten Sie Windows Server 2019 ein (mit Bildern und Text)

>>:  Mysql Online-Wiederherstellung des Undo-Tabellenbereichs tatsächlicher Kampfdatensätze

Artikel empfehlen

Die Prinzipien und Mängel der MySQL-Volltextindizierung

Der MySQL-Volltextindex ist ein spezieller Index,...

Vollständiger Schrittbericht zur Vue-Kapselung allgemeiner Tabellenkomponenten

Inhaltsverzeichnis Vorwort Warum müssen wir die T...

Eine kurze Diskussion über die Berechnungsmethode von key_len in MySQL erklären

Mit dem MySQL-Befehl „explain“ können Sie die Lei...

Detaillierte Prozessanalyse der Docker-Bereitstellung des Snail-Cinema-Systems

Umwelterklärung Host-Betriebssystem: Cetnos7.9 Mi...

Detaillierte Erläuterung des Kapselungsbeispiels für Netzwerkanforderungen

Exportstandard ({ URL (URL = URL = URL), Methode ...

Die umfassendste Erklärung des Sperrmechanismus in MySQL

Inhaltsverzeichnis Vorwort Globale Sperre Vollstä...

Detailliertes Beispiel für die Verwendung von MySQL-Triggern

Details zur MySQL-Triggersyntax: Ein Trigger ist ...

Detaillierte Erklärung der Interaktion zwischen React Native und IOS

Inhaltsverzeichnis Voraussetzungen RN übergibt We...

WeChat-Applet + ECharts zur Realisierung eines dynamischen Aktualisierungsprozesses

Vorwort Kürzlich stieß ich auf eine Anforderung, ...

Probleme und Lösungen bei der Verwendung der jsx-Syntax in React-vscode

Problembeschreibung Nach der Installation des Plu...