Cet article partagera avec vous 10 questions d'entretien sur webpack. Vérifiez les lacunes et remplissez-les. À combien de ces dix questions d'entretien pouvez-vous répondre correctement ? Pouvez-vous les obtenir tous correctement ?
Les questions d'entretien ne sont qu'une introduction. Pour rafraîchir rapidement les questions, mémorisez-les simplement
(l'intervieweur vous les posera, mais il ne sera peut-être pas très approfondi Si vous voulez comprendre en profondeur, vous devez quand même dépenser beaucoup d'énergie code>;快速刷题就是背
(面试官问你,但是他不一定很深入),想深入理解还是得花大量精力
;
初始化参数
:解析webpack配置参数,合并shell传入和webpack.config.js文件配置的参数,形成最后的配置结果;
开始编译
:上一步得到的参数初始化compiler对象,注册所有配置的插件,插件 监听webpack构建生命周期的事件节点,做出相应的反应,执行对象的run方法开始执行编译;
确定入口
:从配置的entry入口,开始解析文件构建AST语法树,找出依赖,递归下去;
编译模块
:递归中根据文件类型和loader配置,调用所有配置的loader对文件进行转换,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理;
完成模块编译并输出
:递归完事后,得到每个文件结果,包含每个模块以及他们之间的依赖关系,根据entry或分包配置生成代码块chunk;
输出完成
:输出所有的chunk到文件系统;
其实是自己开启了express应用
,添加了对webpack编译的监听,添加了和浏览器的websocket长连接,当文件变化触发webpack进行编译并完成后,会通过sokcet消息告诉浏览器准备刷新
。而为了减少刷新的代价,就是不用刷新网页
,而是刷新某个模块
,webpack-dev-server可以支持热更新,通过生成 文件的hash值来比对需要更新的模块,浏览器再进行热替换
服务端
客户端
1、webpack生态中存在多种计算hash的方式
hash
chunkhash
contenthash
Paramètres d'initialisation
: analysez les paramètres de configuration du webpack, fusionnez les paramètres transmis par le shell et configurés dans le fichier webpack.config.js pour former le résultat final de la configuration ; Démarrer la compilation
: Initialisez l'objet compilateur avec les paramètres obtenus à l'étape précédente, enregistrez tous les plug-ins configurés, le plug-in écoute les nœuds d'événements de le cycle de vie de build du webpack, réagit en conséquence et exécute la méthode run de l'objet pour démarrer la compilation
Déterminez l'entrée
: à partir de l'entrée de configuration, commencez à analyser le fichier pour construire le ; Arbre de syntaxe AST, découvrez les dépendances et récursez ; 🎜🎜Module de compilation
: Dans la récursivité, toutes les paires de chargeurs configurées sont appelées en fonction du type de fichier et de la configuration du chargeur. , puis recherchez les modules dont dépend le module, puis répétez cette étape jusqu'à ce que tous les fichiers dépendants de l'entrée aient été traités par cette étape 🎜🎜Compilation et sortie complètes du module
: Une fois la récursion terminée, chaque résultat de fichier est obtenu, y compris chaque module et les dépendances entre eux, et le bloc de code est généré en fonction de la configuration d'entrée ou de sous-traitance 🎜🎜Sortie terminée
; > : Sortie Tous les morceaux sont transférés vers le système de fichiers ; 🎜🎜🎜 a ouvert l'application express, ajoute la surveillance de la compilation du webpack et ajoute une longue connexion websocket avec le navigateur. Lorsque les modifications de fichiers déclenchent la compilation et l'achèvement du webpack, <code> indiquera au navigateur de se préparer à l'actualisation via les messages sokcet<.>. Afin de réduire le coût d'actualisation, <code> n'a pas besoin d'actualiser la page Web
, mais actualise un module
peut prendre en charge la mise à jour à chaud en générant le hachage. valeur du fichier. Comparez les modules qui doivent être mis à jour, puis effectuez un remplacement à chaud dans le navigateur🎜🎜Serveur
🎜Client
🎜hash
🎜chunkhash
🎜contenthash
🎜 🎜🎜hash représente la valeur de hachage générée dans chaque compilation webpack . Tous les fichiers utilisant cette méthode ont le même hachage. Chaque build amène Webpack à calculer un nouveau hachage. Chunkhash est formé sur la base du fichier d'entrée et de son morceau associé. Les modifications apportées à un certain fichier n'affecteront que la valeur de hachage du morceau qui lui est associé, mais n'affecteront pas la création de contenu de hachage d'autres fichiers en fonction du contenu du fichier. Lorsque le contenu du fichier change, le contenthash change🎜🎜2 Évitez la même valeur aléatoire🎜.calcul du hachage. <code>La même valeur aléatoire peut être générée car ces fichiers appartiennent au même bloc. Vous pouvez mentionner un fichier dans un bloc indépendant (par exemple en le plaçant dans une entrée)
<. h2 data-id="heading-4">Comment implémenter la mise en cache hors ligne des ressources statiques par Webpack计算hash后分割chunk
。产生相同随机值可能是因为这些文件属于同一个chunk,可以将某个文件提到独立的chunk(如放入entry)
<% HtmlWebpackPlugin.options.loading.html %>
,在 html-webpack-plugin 中即可通过配置html属性,将script注入进去ProvidePlugin
:自动加载模块,代替require和importhtml-webpack-plugin
可以根据模板自动生成html代码,并自动引用css和js文件extract-text-webpack-plugin
将js文件中引用的样式单独抽离成css文件DefinePlugin
编译时配置全局变量,这对开发模式和发布模式的构建允许不同的行为非常有用。HotModuleReplacementPlugin
热更新optimize-css-assets-webpack-plugin
不同组件中重复的css可以快速去重webpack-bundle-analyzer
一个webpack的bundle文件分析工具,将bundle文件以可交互缩放的treemap的形式展示。compression-webpack-plugin
生产环境可采用gzip压缩JS和CSShappypack
:通过多进程模型,来加速代码构建clean-wenpack-plugin
清理每次打包下没有使用的文件speed-measure-webpack-plugin
:可以看至U每个Loader和Plugin执行耗时(整个扌丁包耗时、每个Plugin和 Loader 耗时)webpack-bundle-analyzer
:可视化Webpack输出文件的体积(业务组件、依赖第三方模块function MyWebpackPlugin()( }; // prototype 上定义 apply 方法 MyWebpackPlugin.prototype.apply=function(){ // 指定一个事件函数挂载到webpack compiler.pluginCwebpacksEventHook"funcion (compiler)( console. log(“这是一个插件”); // 功能完成调用后webpack提供的回调函数 callback() })
file-loader
:把文件输出到⼀个文件夹中,在代码中通过相对 URL 去引⽤输出的⽂件url-loader
:和 file-loader 类似,但是能在⽂件很⼩的情况下以 base64 的⽅式把⽂件内容注⼊到代码中去source-map-loader
:加载额外的 Source Map ⽂件,以⽅便断点调试image-loader
:加载并且压缩图⽚⽂件babel-loader
:把 ES6 转换成 ES5css-loader
:加载 CSS,⽀持模块化、压缩、⽂件导⼊等特性style-loader
🎜Lors de la configuration de Webpack, nous pouvons utiliser html-webpack-plugin pour injecter un script dans HTML à implémenter Les ressources tierces ou partagées sont stockées statiquement en injectant une balise dans le HTML, telle que <% HtmlWebpackPlugin.options.loading.html %>
Vous pouvez configurer le HTML dans html-webpack. -plugin. Attribut, injectez-y le scriptProvidePlugin
: charge automatiquement les modules, en remplaçant require et import🎜html-webpack-plugin
peut générer automatiquement du code HTML basé sur sur les modèles, et référence automatiquement les fichiers css et js🎜extract-text-webpack-plugin
Extrayez les styles référencés dans le fichier js dans des fichiers css🎜DefinePlugin Configurer la configuration globale au moment de la compilation. Variables, utiles pour autoriser différents comportements entre les builds en mode développement et en mode release. 🎜<code>HotModuleReplacementPlugin
Mise à jour à chaud🎜optimize-css-assets-webpack-plugin
Les CSS en double dans différents composants peuvent être rapidement supprimés 🎜 webpack-bundle-analyzer
Un outil d'analyse de fichiers de bundle Webpack qui affiche les fichiers de bundle sous la forme de treemaps zoomables de manière interactive. 🎜compression-webpack-plugin
L'environnement de production peut utiliser gzip pour compresser JS et CSS🎜happypack
: accélère la construction de code grâce à un multi-processus model🎜clean-wenpack-plugin
Nettoie les fichiers inutilisés dans chaque package🎜speed-measure-webpack-plugin
: Vous pouvez voir chacun temps d'exécution de chaque Loader et Plugin (le temps de l'ensemble du package, le temps de chaque Plugin et Loader)🎜webpack-bundle-analyzer
: Visualisez le volume des fichiers de sortie Webpack (business composants , s'appuyant sur des modules tiersfile- loader
: Exportez le fichier vers Dans un dossier, référencez le fichier de sortie via une URL relative dans le code🎜url-loader
: Similaire au chargeur de fichiers, mais peut être utilisé lorsque le fichier est très petit Ensuite, injectez le contenu du fichier dans le code au format base64🎜source-map-loader
: chargez des fichiers de carte source supplémentaires pour faciliter le débogage des points d'arrêt li>🎜image-loader
: charger et compresser des fichiers image🎜babel-loader
: convertir ES6 en ES5🎜 css-loader
: chargez CSS, prenant en charge la modularisation, la compression, l'importation de fichiers et d'autres fonctionnalités🎜style-loader
: injectez du code CSS dans JavaScript, via la manipulation DOM pour charger CSS.eslint-loader
: Vérifiez le code JavaScript via ESLinteslint-loader
:通过 ESLint 检查 JavaScript 代码服务端设置http缓存头
(cache-control)即作为splitChunk,因为他们几乎是不变的
延迟加载
:使用import()方式
,可以动态加载的文件分到独立的chunk,以得到自己的chunkhash保持hash值的稳定
:编译过程和文件内通的更改尽量不影响其他文件hash的计算,对于低版本webpack生成的增量数字id不稳定问题,可用hashedModuleIdsPlugin基于文件路径生成解决⽤webpack优化前端性能是指优化webpack的输出结果,让打包的最终结果在浏览器运⾏快速⾼效。
压缩代码
:删除多余的代码、注释、简化代码的写法等等⽅式。可以利⽤webpack的 UglifyJsPlugin 和 ParallelUglifyPlugin 来压缩JS件, 利⽤ cssnano (css-loader?minimize)来压缩css利⽤CDN加速
: 在构建过程中,将引⽤的静态资源路径修改为CDN上对应的路径。可以利⽤webpack对于 output 参数和各loader的 publicPath 参数来修改资源路径Tree Shaking
: 将代码中永远不会⾛到的⽚段删除掉。可以通过在启动webpack时追加参数 --optimize-minimize 来实现Code Splitting
: 将代码按路由维度或者组件分块(chunk),这样做到按需加载,同时可以充分利⽤浏览器缓存提取公共第三⽅库
: SplitChunksPlugin插件来进⾏公共模块抽取,利⽤浏览器缓存可以⻓期缓存这些⽆需频繁变动的公共代码摇树优化
,是一种通过移除多于代码,来优化打包体积的,生产环境默认开启
。代码不运行
的状态下,分析出不需要的代码
;es6模块
的规范静态分析
,故而编译的时候正确判断到底加载了那些模块
Le serveur définit l'en-tête du cache http
(cache-control)c'est-à-dire en tant que splitChunk, car ils sont presque inchangés
Chargement paresseux
: à l'aide de la méthode import()
, les fichiers chargés dynamiquement peuvent être divisés en morceaux indépendants pour obtenir leur propre chunkhash
Conserver la stabilité de la valeur de hachage : les modifications apportées au processus de compilation et à l'intercommunication des fichiers doivent essayer de ne pas affecter le calcul des hachages d'autres fichiers. Pour le problème instable des identifiants numériques incrémentiels générés par les versions inférieures du webpack, le hashedModuleIdsPlugin peut être utilisé pour résoudre le problème en fonction. sur la génération de chemin de fichier
Comment optimiser les performances front-end avec webpack ?
Utiliser Webpack pour optimiser les performances frontales signifie optimiser la sortie de Webpack afin que le résultat final emballé s'exécute rapidement et efficacement dans le navigateur.
Compresser le code
: supprimer le code redondant, les commentaires, simplifier l'écriture du code, etc. Vous pouvez utiliser UglifyJsPlugin et ParallelUglifyPlugin de webpack pour compresser les fichiers JS, et utiliser cssnano (css-loader?minimize) pour compresser cssUtiliser l'accélération CDN
: pendant le processus de construction, les fichiers statiques référencés seront compressés . Le chemin de la ressource est modifié par le chemin correspondant sur le CDN. Vous pouvez utiliser le paramètre de sortie de webpack et le paramètre publicPath de chaque chargeur pour modifier le chemin de la ressource
Tree Shaking
: supprimez les segments qui ne seront jamais vus dans le code. Ceci peut être réalisé en ajoutant le paramètre --optimize-minimize lors du démarrage de webpack🎜🎜Code Splitting
: divisez le code en morceaux en fonction des dimensions ou des composants de routage, afin qu'il puisse être chargé à la demande et à en même temps, utilisez pleinement le cache du navigateur🎜🎜Extraire les bibliothèques publiques tierces
: plug-in SplitChunksPlugin pour extraire les modules publics. Utilisez le cache du navigateur pour mettre en cache ces codes publics qui n'ont pas besoin d'être modifiés fréquemment pendant une longue période. time🎜🎜Le principe du mécanisme treeShaking du webpackoptimisation du tremblement d'arbre
. À l'exception de plus de code pour optimiser le volume de packaging, l'environnement de production est activé par défaut
. 🎜🎜Vous pouvez analyser le code inutile
lorsque le code n'est pas exécuté
🎜🎜Utilisez les spécifications du module es6
analyse statique
, donc détermine correctement quels modules sont chargés lors de la compilation
🎜🎜analyse statiquement le flux du programme pour déterminer quels modules et variables ne sont pas utilisés ou référencés. Supprimez ensuite le. " 🎜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!