28道Webpack面試題及答案

1、webpack的作用是什么,談?wù)勀銓λ睦斫猓?/span>
react.js+WebPack
vue.js+WebPack
AngluarJS+WebPack
2、webpack的工作原理?
3、webpack打包原理
4、webpack的核心概念
Entry:入口,Webpack 執(zhí)行構(gòu)建的第一步將從 Entry 開始,可抽象成輸入。告訴webpack要使用哪個模塊作為構(gòu)建項目的起點,默認為./src/index.js
output :出口,告訴webpack在哪里輸出它打包好的代碼以及如何命名,默認為./dist
Module:模塊,在 Webpack 里一切皆模塊,一個模塊對應(yīng)著一個文件。Webpack 會從配置的 Entry 開始遞歸找出所有依賴的模塊。
Chunk:代碼塊,一個 Chunk 由多個模塊組合而成,用于代碼合并與分割。
Loader:模塊轉(zhuǎn)換器,用于把模塊原內(nèi)容按照需求轉(zhuǎn)換成新內(nèi)容。
Plugin:擴展插件,在 Webpack 構(gòu)建流程中的特定時機會廣播出對應(yīng)的事件,插件可以監(jiān)聽這些事件的發(fā)生,在特定時機做對應(yīng)的事情。
5、Webpack的基本功能有哪些?
代碼轉(zhuǎn)換:TypeScript 編譯成 JavaScript、SCSS 編譯成 CSS 等等
文件優(yōu)化:壓縮 JavaScript、CSS、html 代碼,壓縮合并圖片等
代碼分割:提取多個頁面的公共代碼、提取首屏不需要執(zhí)行部分的代碼讓其異步加載
模塊合并:在采用模塊化的項目有很多模塊和文件,需要構(gòu)建功能把模塊分類合并成一個文件
自動刷新:監(jiān)聽本地源代碼的變化,自動構(gòu)建,刷新瀏覽器
代碼校驗:在代碼被提交到倉庫前需要檢測代碼是否符合規(guī)范,以及單元測試是否通過
自動發(fā)布:更新完代碼后,自動構(gòu)建出線上發(fā)布代碼并傳輸給發(fā)布系統(tǒng)。
6、gulp/grunt 與 webpack的區(qū)別是什么?
grunt和gulp是基于任務(wù)和流(Task、Stream)的。
webpack是基于入口的。
7、webpack是解決什么問題而生的?
8、你是如何提高webpack構(gòu)件速度的?
使用Tree-shaking和Scope Hoisting來剔除多余代碼
9、npm打包時需要注意哪些?如何利用webpack來更好的構(gòu)建?
要支持CommonJS模塊化規(guī)范,所以要求打包后的最后結(jié)果也遵守該規(guī)則。 Npm模塊使用者的環(huán)境是不確定的,很有可能并不支持ES6,所以打包的最后結(jié)果應(yīng)該是采用ES5編寫的。并且如果ES5是經(jīng)過轉(zhuǎn)換的,請最好連同SourceMap一同上傳。 Npm包大小應(yīng)該是盡量?。ㄓ行﹤}庫會限制包大小) 發(fā)布的模塊不能將依賴的模塊也一同打包,應(yīng)該讓用戶選擇性的去自行安裝。這樣可以避免模塊應(yīng)用者再次打包時出現(xiàn)底層模塊被重復打包的情況。 UI組件類的模塊應(yīng)該將依賴的其它資源文件,例如.css文件也需要包含在發(fā)布的模塊里。
10、前端為什么要進行打包和構(gòu)建?
體積更?。═ree-shaking、壓縮、合并),加載更快 編譯高級語言和語法(TS、ES6、模塊化、scss) 兼容性和錯誤檢查(polyfill,postcss,eslint)
統(tǒng)一、高效的開發(fā)環(huán)境 統(tǒng)一的構(gòu)建流程和產(chǎn)出標準 集成公司構(gòu)建規(guī)范(提測、上線)
11、webpack的構(gòu)建流程是什么?從讀取配置到輸出文件這個過程盡量說全。
初始化參數(shù):從配置文件和 Shell 語句中讀取與合并參數(shù),得出最終的參數(shù);
開始編譯:用上一步得到的參數(shù)初始化 Compiler 對象,加載所有配置的插件,執(zhí)行對象的 run 方法開始執(zhí)行編譯;
確定入口:根據(jù)配置中的 entry 找出所有的入口文件;
編譯模塊:從入口文件出發(fā),調(diào)用所有配置的 Loader 對模塊進行翻譯,再找出該模塊依賴的模塊,再遞歸本步驟直到所有入口依賴的文件都經(jīng)過了本步驟的處理;
完成模塊編譯:在經(jīng)過第4步使用 Loader 翻譯完所有模塊后,得到了每個模塊被翻譯后的最終內(nèi)容以及它們之間的依賴關(guān)系;
輸出資源:根據(jù)入口和模塊之間的依賴關(guān)系,組裝成一個個包含多個模塊的 Chunk,再把每個 Chunk 轉(zhuǎn)換成一個單獨的文件加入到輸出列表,這步是可以修改輸出內(nèi)容的最后機會;
輸出完成:在確定好輸出內(nèi)容后,根據(jù)配置確定輸出的路徑和文件名,把文件內(nèi)容寫入到文件系統(tǒng)。
12、怎么配置單頁應(yīng)用?怎么配置多頁應(yīng)用?
每個頁面都有公共的代碼,可以將這些代碼抽離出來,避免重復的加載。比如,每個頁面都引用了同一套css樣式表 隨著業(yè)務(wù)的不斷擴展,頁面可能會不斷的追加,所以一定要讓入口的配置足夠靈活,避免每次添加新頁面還需要修改構(gòu)建配置
13、Loader機制的作用是什么?
每一個 Loader 都可以通過 URL querystring 的方式傳入?yún)?shù),例如css-loader?minimize中的minimize告訴css-loader要開啟 CSS 壓縮。
14、常用loader
style-loader把 CSS 內(nèi)容注入到 JavaScript 里
sass-loader 解析sass文件(安裝sass-loader,node-sass)
postcss-loader自動添加瀏覽器兼容前綴(postcss.config配置)
url-loader將文件轉(zhuǎn)換為base64 URI。
vue-loader處理vue文件。
15、Plugin(插件)的作用是什么?
16、什么是bundle,什么是chunk,什么是module
17、常見Plugins
cleanwebPackPlugin打包自動刪除上次打包文件
18、ExtractTextPlugin插件的作用
19、sourceMap
加不同前綴意義:
inline:不生成映射關(guān)系文件,打包進main.js
cheap: 1.只精確到行,不精確到列,打包速度快 2.只管業(yè)務(wù)代碼,不管第三方模塊
module:不僅管業(yè)務(wù)代碼,而且管第三方代碼
eval:執(zhí)行效率最快,性能最好
開發(fā)環(huán)境:cheap-module-eval-source-map
線上環(huán)境:cheap-mudole-source-map
20、HMR熱模塊更新
場景2:js中實現(xiàn)熱更新,只更新指定js模塊
if (module.hot) {module.hot.accept(’./library.js’, function() {// Do something with the updated library module…});}
21、webpack如何配置多入口文件?
entry: {home: resolve(__dirname, "src/home/index.js"),about: resolve(__dirname, "src/about/index.js")}
用于描述入口的對象。你可以使用如下屬性:
dependOn: 當前入口所依賴的入口。它們必須在該入口被加載前被加載。
filename: 指定要輸出的文件名稱。
import: 啟動時需加載的模塊。
library: 指定 library 選項,為當前 entry 構(gòu)建一個 library。
runtime: 運行時 chunk 的名字。如果設(shè)置了,就會創(chuàng)建一個新的運行時 chunk。在 webpack 5.43.0 之后可將其設(shè)為 false 以避免一個新的運行時 chunk。
publicPath: 當該入口的輸出文件在瀏覽器中被引用時,為它們指定一個公共 URL 地址
22、babel 相關(guān): polyfill 以及 runtime 區(qū)別, ES stage 含義,preset–env 作用等等
1.polyfill 以及 runtime 區(qū)別
babel-polyfill 的原理是當運行環(huán)境中并沒有實現(xiàn)的一些方法,babel-polyfill會做兼容。
babel-runtime 它是將es6編譯成es5去執(zhí)行。我們使用es6的語法來編寫,最終會通過babel-runtime編譯成es5.也就是說,不管瀏覽器是否支持ES6,只要是ES6的語法,它都會進行轉(zhuǎn)碼成ES5.所以就有很多冗余的代碼。
babel-polyfill 它是通過向全局對象和內(nèi)置對象的prototype上添加方法來實現(xiàn)的。比如運行環(huán)境中不支持Array.prototype.find 方法,引入polyfill, 我們就可以使用es6方法來編寫了,但是缺點就是會造成全局空間污染。
babel-runtime: 它不會污染全局對象和內(nèi)置對象的原型,比如說我們需要Promise,我們只需要import Promise from 'babel-runtime/core-js/promise'即可,這樣不僅避免污染全局對象,而且可以減少不必要的代碼。
2.stage-x:指處于某一階段的js語言提案
Stage 0 - 設(shè)想(Strawman):只是一個想法,可能有 Babel插件。
Stage 1 - 建議(Proposal):這是值得跟進的。
Stage 2 - 草案(Draft):初始規(guī)范。
Stage 3 - 候選(Candidate):完成規(guī)范并在瀏覽器上初步實現(xiàn)。
Stage 4 - 完成(Finished):將添加到下一個年度版本發(fā)布中。
3. 理解 babel-preset-env
babel-preset-es2015: 可以將es6的代碼編譯成es5.
babel-preset-es2016: 可以將es7的代碼編譯為es6.
babel-preset-es2017: 可以將es8的代碼編譯為es7.
babel-preset-latest: 支持現(xiàn)有所有ECMAScript版本的新特性
23、什么是模熱更新?有什么優(yōu)點?
模塊熱更新是webpack的一個功能,它可以使得代碼修改之后,不用刷新瀏覽器就可以更新。
在應(yīng)用過程中替換添加刪出模塊,無需重新加載整個頁面,是高級版的自動刷新瀏覽器。
優(yōu)點:只更新變更內(nèi)容,以節(jié)省寶貴的開發(fā)時間。調(diào)整樣式更加快速,幾乎相當于在瀏覽器中更改樣式
24、lazy loading(模塊懶加載)
借助import()語法異步引入組件,實現(xiàn)文件懶加載:prefetch,preloading
webpack提倡多寫異步代碼,提升代碼利用率,從而提升頁面性能
先加載主業(yè)務(wù)文件,prefetch利用網(wǎng)絡(luò)空閑時間,異步加載組件
import(/* webpackPrefetch: true / ‘LoginModal’);
preload和主業(yè)務(wù)文件一起加載,異步加載組件
import(/ webpackPreload: true */ ‘ChartingLibrary’);
25、什么是長緩存?在webpack中如何做到長緩存優(yōu)化?
26、什么是Tree-sharking?
27、webpack-dev-server 和 http服務(wù)器的區(qū)別
28、webpack3和webpack4的區(qū)別
學習更多技能
請點擊下方公眾號
![]()

