Table des matières
Si nous voulons connaître les principes du packaging Webpack, nous devons connaître deux points de connaissances à l'avance
Jetons d'abord un coup d'œil à la structure du code après notre emballage. Nous pouvons constater que les exigences et les exportations apparaîtront après l'emballage.
总结
Maison interface Web js tutoriel Une analyse approfondie du processus de packaging et des principes du webpack

Une analyse approfondie du processus de packaging et des principes du webpack

Aug 09, 2022 pm 05:11 PM
webpack 打包

Comment Webpack met-il en œuvre le packaging ? L'article suivant vous donnera une compréhension approfondie des principes d'empaquetage de Webpack. J'espère qu'il vous sera utile !

Une analyse approfondie du processus de packaging et des principes du webpack

En tant que "lion de siège" front-end, Webpack n'est que trop familier. Il peut faire trop de choses. Il peut empaqueter toutes les ressources (y compris JS, TS, JSX, images, polices, CSS, etc.). Le placer dans une relation de dépendance vous permet de référencer des dépendances pour utiliser les ressources selon les besoins. Webpack a fait un excellent travail en traduisant diverses ressources de fichiers sur le front-end et en analysant les dépendances de modules complexes. Nous pouvons également personnaliser le chargeur et charger nos propres ressources librement. Alors, comment Webpack implémente-t-il le packaging ? Venez jeter un oeil aujourd'hui.

Si nous voulons connaître les principes du packaging Webpack, nous devons connaître deux points de connaissances à l'avance

1.

Quand il s'agit de require, la première chose qui vient à l'esprit peut être import. Import est une norme de syntaxe d'es6

– require est un appel d'exécution, donc require peut théoriquement être utilisé n'importe où dans le code ; – import est un appel au moment de la compilation. , il doit donc être placé au début du fichier ;

Lorsque nous utiliserons Webpack pour compiler, nous utiliserons babel pour traduire import en require ; (), qui est utilisé pour charger les modules AMD et CMD. Utilisez également la méthode require pour faire référence.

Par exemple :

var add = require('./a.js');
add(1,2)
Copier après la connexion

Pour faire simple, require est en fait une fonction, et le

référencé n'est qu'un paramètre de la fonction.

./a.js

2. Que sont les exportations ?

Ici, nous pouvons considérer les exportations comme un objet,

Exportation MDN

Vous pouvez voir l'utilisation spécifique. Maintenant que nous comprenons les exigences et les exportations, nous pouvons commencer à emballer.

Jetons d'abord un coup d'œil à la structure du code après notre emballage. Nous pouvons constater que les exigences et les exportations apparaîtront après l'emballage.

Tous les navigateurs ne peuvent pas exécuter require exports. Vous devez implémenter require et exports vous-même pour assurer le fonctionnement normal du code. Le code packagé est une fonction auto-exécutable. Les paramètres ont des informations de dépendance et le code du fichier. Le corps de la fonction exécutée exécute le code via eval.

Une analyse approfondie du processus de packaging et des principes du webpackLe schéma de conception global est le suivant :

Une analyse approfondie du processus de packaging et des principes du webpack

Étape 1 : Écrivez notre fichier de configurationLe fichier de configuration configure notre entrée d'entrée packagée et notre sortie de sortie packagée pour la génération suivante. Les documents sont prêts.

const path = require("path");
module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "./dist"),//打包后输出的文件地址,需要绝对路径因此需要path
    filename:"main.js"
  },
  mode:"development"
Copier après la connexion

Deuxième étape : analyse du module

Idée générale

: Cela peut se résumer à l'utilisation du fichier fs pour lire le fichier d'entrée et obtenir le chemin du fichier dépendant de l'importation via AST Si le fichier dépendant. a toujours des dépendances, Recurse jusqu'à ce que l'analyse des dépendances soit claire et maintenue dans une carte.

Démontage détaillé

 : Certaines personnes peuvent se demander pourquoi AST est utilisé car AST est né avec cette fonction. Sa ImportDeclaration peut nous aider à filtrer rapidement la syntaxe d'importation. Bien sûr, il est également possible d'utiliser une correspondance régulière. le fichier ne contient qu'un seul caractère après l'avoir lu. String, obtenez le chemin de dépendance du fichier en écrivant des expressions régulières géniales, mais ce n'est pas assez élégant.

étape 1 : Créez de nouvelles dépendances index.js, a.js, b.js comme suit

fichier index.js

import { str } from "./a.js";
console.log(`${str} Webpack`)
Copier après la connexion

fichier a.js

import { b} from "./b.js"
export const str = "hello"
Copier après la connexion

fichier b.js

export const b="bbb"
Copier après la connexion

étape 2 : écrire le Webpack

Analyse de module

 : utilisez @babel/parser d'AST pour convertir la chaîne lue à partir du fichier en une arborescence AST, @babel/traverse pour l'analyse syntaxique et utilisez ImportDeclaration pour filtrer l'importation afin de connaître les dépendances du fichier.

    const content = fs.readFileSync(entryFile, "utf-8");
    const ast = parser.parse(content, { sourceType: "module" });
  
    const dirname = path.dirname(entryFile);
    const dependents = {};
    traverse(ast, {
      ImportDeclaration({ node }) {
        // 过滤出import
        const newPathName = "./" + path.join(dirname, node.source.value);
        dependents[node.source.value] = newPathName;
      }
    })
    const { code } = transformFromAst(ast, null, {
      presets: ["@babel/preset-env"]
    })
    return {
      entryFile,
      dependents,
      code
    }
Copier après la connexion
Les résultats sont les suivants :

Une analyse approfondie du processus de packaging et des principes du webpackUtilisez la récursion ou la boucle pour importer les fichiers un par un pour l'analyse des dépendances. Notez ici que nous utilisons la boucle for pour analyser toutes les dépendances. La raison pour laquelle les boucles peuvent analyser toutes les dépendances. faites attention à la longueur des modules. Cela change. Lorsqu'il y a de nouvelles dépendances dependencies.modules.push, modules.length changera.

 for (let i = 0; i <p></p><p>Étape 3 : Écrire la fonction WebpackBootstrap + générer le fichier de sortie<strong><span style="font-size: 18px;"></span><p><strong>编写</strong> <strong>WebpackBootstrap</strong> <strong>函数</strong>:这里我们需要做的首先是 WebpackBootstrap 函数,编译后我们源代码的 import 会被解析成 require 浏览器既然不认识 require ,那我们就先声明它,毕竟 require 就是一个方法,在编写函数的时候还需要注意的是作用域隔离,防止变量污染。我们代码中 exports 也需要我们声明一下,保证代码在执行的时候 exports 已经存在。</p>
<p><strong>生成输出文件</strong>:生成文件的地址我们在配置文件已经写好了,再用 fs.writeFileSync 写入到输出文件夹即可。</p>
<pre class="brush:php;toolbar:false">  file(code) {
    const filePath = path.join(this.output.path, this.output.filename)
    const newCode = JSON.stringify(code);
    // 生成bundle文件内容
    const bundle = `(function(modules){
      function require(module){
        function pathRequire(relativePath){
          return require(modules[module].dependents[relativePath])
        }
        const exports={};
        (function(require,exports,code){
          eval(code)
        })(pathRequire,exports,modules[module].code);
        return exports
      }
      require('${this.entry}')
    })(${newCode})`;
      //  WebpackBoostrap
    // 生成文件。放入dist 目录
    fs.writeFileSync(filePath,bundle,'utf-8')
  }
Copier après la connexion

Une analyse approfondie du processus de packaging et des principes du webpack

第四步:分析执行顺序

Une analyse approfondie du processus de packaging et des principes du webpack

我们可以在浏览器的控制台运行一下打包后的结果,如果能正常应该会打印出 hello Webpack。

Une analyse approfondie du processus de packaging et des principes du webpack

总结

通过以上的分析,我们应该对 Webpack 的大概流程有基本的了解,利用 AST 去解析代码只是本次演示的一种方式,不是 Webpack 的真实实现,Webpack 他自己有自己的 AST 解析方式,万变不离其宗都是拿到模块依赖,Webpack 生态是很完整,有兴趣的童鞋可以考虑以下三个问题:

  • 如果出现组件循环引用那又应该如何处理?
  • Webpack 是如何加载 loader 的?
  • 犹大大极力推荐的 vite 可以实现按需打包,大大提升开发时候打包速度,如果是 webapck 又是应该如何实现?

更多编程相关知识,请访问:编程视频!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Partagez un moyen simple de packager des projets PyCharm Partagez un moyen simple de packager des projets PyCharm Dec 30, 2023 am 09:34 AM

Partagez la méthode d'empaquetage de projet PyCharm simple et facile à comprendre. Avec la popularité de Python, de plus en plus de développeurs utilisent PyCharm comme outil principal pour le développement Python. PyCharm est un puissant environnement de développement intégré qui fournit de nombreuses fonctions pratiques pour nous aider à améliorer l'efficacité du développement. L’une des fonctions importantes est le packaging du projet. Cet article explique comment empaqueter des projets dans PyCharm d'une manière simple et facile à comprendre, et fournit des exemples de code spécifiques. Pourquoi packager des projets ? Développé en Python

Tutoriel de démarrage VUE3 : empaquetage et création avec Webpack Tutoriel de démarrage VUE3 : empaquetage et création avec Webpack Jun 15, 2023 pm 06:17 PM

Vue est un excellent framework JavaScript qui peut nous aider à créer rapidement des applications Web interactives et efficaces. Vue3 est la dernière version de Vue, qui introduit de nombreuses nouvelles fonctionnalités et fonctionnalités. Webpack est actuellement l'un des packagers de modules et outils de construction JavaScript les plus populaires, qui peut nous aider à gérer diverses ressources dans nos projets. Cet article explique comment utiliser Webpack pour empaqueter et créer des applications Vue3. 1. Installez Webpack

Quelle est la différence entre vite et webpack Quelle est la différence entre vite et webpack Jan 11, 2023 pm 02:55 PM

Différences : 1. La vitesse de démarrage du serveur webpack est plus lente que celle de Vite ; car Vite n'a pas besoin d'être empaqueté au démarrage, il n'est pas nécessaire d'analyser les dépendances du module et de compiler, donc la vitesse de démarrage est très rapide. 2. La mise à jour à chaud de Vite est plus rapide que le webpack ; en termes de HRM de Vite, lorsque le contenu d'un certain module change, laissez simplement le navigateur demander à nouveau le module. 3. Vite utilise esbuild pour pré-construire les dépendances, tandis que webpack est basé sur le nœud. 4. L'écologie de Vite n'est pas aussi bonne que celle du webpack, et les chargeurs et plug-ins ne sont pas assez riches.

Comment utiliser les expressions régulières Python pour l'empaquetage et la distribution de code Comment utiliser les expressions régulières Python pour l'empaquetage et la distribution de code Jun 23, 2023 am 09:31 AM

Alors que le langage de programmation Python devient de plus en plus populaire, de plus en plus de développeurs commencent à écrire du code en Python. Mais dans la réalité, nous devons souvent regrouper ces codes et les distribuer à d’autres pour qu’ils les utilisent. Cet article explique comment utiliser les expressions régulières Python pour l'empaquetage et la distribution de code. 1. Packaging de code Python En Python, nous pouvons utiliser des outils tels que setuptools et distutils pour empaqueter notre code. Ces outils peuvent convertir des fichiers Python, des modules

Comment utiliser pkg pour empaqueter le projet Node.js dans un fichier exécutable ? Comment utiliser pkg pour empaqueter le projet Node.js dans un fichier exécutable ? Jul 26, 2022 pm 07:33 PM

Comment empaqueter le fichier exécutable nodejs avec pkg ? L'article suivant vous expliquera comment utiliser pkg pour empaqueter un projet Node.js dans un fichier exécutable. J'espère qu'il vous sera utile !

Comment utiliser PHP et Webpack pour le développement modulaire Comment utiliser PHP et Webpack pour le développement modulaire May 11, 2023 pm 03:52 PM

Avec le développement continu de la technologie de développement Web, la séparation front-end et back-end et le développement modulaire sont devenus une tendance répandue. PHP est un langage back-end couramment utilisé. Lors du développement modulaire, nous devons utiliser certains outils pour gérer et empaqueter les modules. Webpack est un outil d'empaquetage modulaire très facile à utiliser. Cet article explique comment utiliser PHP et Webpack pour le développement modulaire. 1. Qu'est-ce que le développement modulaire ? Le développement modulaire fait référence à la décomposition d'un programme en différents modules indépendants. Chaque module a sa propre fonction.

Explication détaillée des fonctions VSCode : Comment cela vous aide-t-il à améliorer l'efficacité du travail ? Explication détaillée des fonctions VSCode : Comment cela vous aide-t-il à améliorer l'efficacité du travail ? Mar 25, 2024 pm 05:27 PM

Explication détaillée des fonctions VSCode : Comment cela vous aide-t-il à améliorer l'efficacité du travail ? Avec le développement continu de l'industrie du développement de logiciels, la recherche par les développeurs de l'efficacité du travail et de la qualité du code est devenue un objectif important dans leur travail. Dans ce processus, le choix de l’éditeur de code devient une décision cruciale. Parmi les nombreux éditeurs, Visual Studio Code (VSCode en abrégé) est apprécié par la majorité des développeurs pour ses fonctions puissantes et son évolutivité flexible. Cet article présentera en détail certaines fonctions de VSCode et discutera

Comment Webpack convertit-il le module es6 en es5 ? Comment Webpack convertit-il le module es6 en es5 ? Oct 18, 2022 pm 03:48 PM

Méthode de configuration : 1. Utilisez la méthode d'importation pour placer le code ES6 dans le fichier de code js emballé ; 2. Utilisez l'outil npm pour installer l'outil babel-loader, la syntaxe est "npm install -D babel-loader @babel/core @babel/preset- env"; 3. Créez le fichier de configuration ".babelrc" de l'outil babel et définissez les règles de transcodage ; 4. Configurez les règles de packaging dans le fichier webpack.config.js.

See all articles