關(guān)于webpack的常見(jiàn)面試題小結(jié)

隨著現(xiàn)代前端開(kāi)發(fā)的復(fù)雜度和規(guī)模越來(lái)越龐大,已經(jīng)不能拋開(kāi)工程化來(lái)獨(dú)立開(kāi)發(fā)了,如react的jsx代碼必須編譯后才能在瀏覽器中使用;又如sass和less的代碼瀏覽器也是不支持的。 而如果摒棄了這些開(kāi)發(fā)框架,那么開(kāi)發(fā)的效率將大幅下降。在眾多前端工程化工具中,webpack脫穎而出成為了當(dāng)今最流行的前端構(gòu)建工具。 然而大多數(shù)的使用者都只是單純的會(huì)使用,而并不知道其深層的原理。希望通過(guò)以下的面試題總結(jié)可以幫助大家溫故知新、查缺補(bǔ)漏,知其然而又知其所以然。
問(wèn)題一覽
- webpack與grunt、gulp的不同?
- 與webpack類似的工具還有哪些?談?wù)勀銥槭裁醋罱K選擇(或放棄)使用webpack?
- 有哪些常見(jiàn)的Loader?他們是解決什么問(wèn)題的?
- 有哪些常見(jiàn)的Plugin?他們是解決什么問(wèn)題的?
- Loader和Plugin的不同?
- webpack的構(gòu)建流程是什么?從讀取配置到輸出文件這個(gè)過(guò)程盡量說(shuō)全
- 是否寫(xiě)過(guò)Loader和Plugin?描述一下編寫(xiě)loader或plugin的思路?
- webpack的熱更新是如何做到的?說(shuō)明其原理?
- 如何利用webpack來(lái)優(yōu)化前端性能?(提高性能和體驗(yàn))
- 如何提高webpack的構(gòu)建速度?
- 怎么配置單頁(yè)應(yīng)用?怎么配置多頁(yè)應(yīng)用?
- npm打包時(shí)需要注意哪些?如何利用webpack來(lái)更好的構(gòu)建?
- 如何在vue項(xiàng)目中實(shí)現(xiàn)按需加載?
問(wèn)題解答
1. webpack與grunt、gulp的不同?
三者都是前端構(gòu)建工具,grunt和gulp在早期比較流行,現(xiàn)在webpack相對(duì)來(lái)說(shuō)比較主流,不過(guò)一些輕量化的任務(wù)還是會(huì)用gulp來(lái)處理,比如單獨(dú)打包CSS文件等。
grunt和gulp是基于任務(wù)和流(Task、Stream)的。類似jQuery,找到一個(gè)(或一類)文件,對(duì)其做一系列鏈?zhǔn)讲僮鳎铝魃系臄?shù)據(jù), 整條鏈?zhǔn)讲僮鳂?gòu)成了一個(gè)任務(wù),多個(gè)任務(wù)就構(gòu)成了整個(gè)web的構(gòu)建流程。
webpack是基于入口的。webpack會(huì)自動(dòng)地遞歸解析入口所需要加載的所有資源文件,然后用不同的Loader來(lái)處理不同的文件,用Plugin來(lái)擴(kuò)展webpack功能。
所以總結(jié)一下:
從構(gòu)建思路來(lái)說(shuō)
gulp和grunt需要開(kāi)發(fā)者將整個(gè)前端構(gòu)建過(guò)程拆分成多個(gè)`Task`,并合理控制所有`Task`的調(diào)用關(guān)系 webpack需要開(kāi)發(fā)者找到入口,并需要清楚對(duì)于不同的資源應(yīng)該使用什么Loader做何種解析和加工
對(duì)于知識(shí)背景來(lái)說(shuō)
gulp更像后端開(kāi)發(fā)者的思路,需要對(duì)于整個(gè)流程了如指掌 webpack更傾向于前端開(kāi)發(fā)者的思路
2. 與webpack類似的工具還有哪些?談?wù)勀銥槭裁醋罱K選擇(或放棄)使用webpack?
同樣是基于入口的打包工具還有以下幾個(gè)主流的:
- webpack
- rollup
- parcel
從應(yīng)用場(chǎng)景上來(lái)看:
- ebpack適用于大型復(fù)雜的前端站點(diǎn)構(gòu)建
- rollup適用于基礎(chǔ)庫(kù)的打包,如vue、react
- parcel適用于簡(jiǎn)單的實(shí)驗(yàn)性項(xiàng)目,他可以滿足低門(mén)檻的快速看到效果
由于parcel在打包過(guò)程中給出的調(diào)試信息十分有限,所以一旦打包出錯(cuò)難以調(diào)試,所以不建議復(fù)雜的項(xiàng)目使用parcel
3.有哪些常見(jiàn)的Loader?他們是解決什么問(wèn)題的?
- file-loader:把文件輸出到一個(gè)文件夾中,在代碼中通過(guò)相對(duì) URL 去引用輸出的文件
- url-loader:和 file-loader 類似,但是能在文件很小的情況下以 base64 的方式把文件內(nèi)容注入到代碼中去
- source-map-loader:加載額外的 Source Map 文件,以方便斷點(diǎn)調(diào)試
- image-loader:加載并且壓縮圖片文件
- babel-loader:把 ES6 轉(zhuǎn)換成 ES5
- css-loader:加載 CSS,支持模塊化、壓縮、文件導(dǎo)入等特性
- style-loader:把 CSS 代碼注入到 JavaScript 中,通過(guò) DOM 操作去加載 CSS。
- eslint-loader:通過(guò) ESLint 檢查 JavaScript 代碼
4.有哪些常見(jiàn)的Plugin?他們是解決什么問(wèn)題的?
- define-plugin:定義環(huán)境變量
- commons-chunk-plugin:提取公共代碼
- uglifyjs-webpack-plugin:通過(guò)UglifyES壓縮ES6代碼
5.Loader和Plugin的不同?
不同的作用
- Loader直譯為"加載器"。Webpack將一切文件視為模塊,但是webpack原生是只能解析js文件,如果想將其他文件也打包的話,就會(huì)用到loader。 所以Loader的作用是讓webpack擁有了加載和解析非JavaScript文件的能力。
- Plugin直譯為"插件"。Plugin可以擴(kuò)展webpack的功能,讓webpack具有更多的靈活性。 在 Webpack 運(yùn)行的生命周期中會(huì)廣播出許多事件,Plugin 可以監(jiān)聽(tīng)這些事件,在合適的時(shí)機(jī)通過(guò) Webpack 提供的 API 改變輸出結(jié)果。
不同的用法
- Loader在module.rules中配置,也就是說(shuō)他作為模塊的解析規(guī)則而存在。 類型為數(shù)組,每一項(xiàng)都是一個(gè)Object,里面描述了對(duì)于什么類型的文件(test),使用什么加載(loader)和使用的參數(shù)(options)
- Plugin在plugins中單獨(dú)配置。 類型為數(shù)組,每一項(xiàng)是一個(gè)plugin的實(shí)例,參數(shù)都通過(guò)構(gòu)造函數(shù)傳入。
6.webpack的構(gòu)建流程是什么?從讀取配置到輸出文件這個(gè)過(guò)程盡量說(shuō)全
Webpack 的運(yùn)行流程是一個(gè)串行的過(guò)程,從啟動(dòng)到結(jié)束會(huì)依次執(zhí)行以下流程:
- 初始化參數(shù):從配置文件和 Shell 語(yǔ)句中讀取與合并參數(shù),得出最終的參數(shù);
- 開(kāi)始編譯:用上一步得到的參數(shù)初始化 Compiler 對(duì)象,加載所有配置的插件,執(zhí)行對(duì)象的 run 方法開(kāi)始執(zhí)行編譯;
- 確定入口:根據(jù)配置中的 entry 找出所有的入口文件;
- 編譯模塊:從入口文件出發(fā),調(diào)用所有配置的 Loader 對(duì)模塊進(jìn)行翻譯,再找出該模塊依賴的模塊,再遞歸本步驟直到所有入口依賴的文件都經(jīng)過(guò)了本步驟的處理;
- 完成模塊編譯:在經(jīng)過(guò)第4步使用 Loader 翻譯完所有模塊后,得到了每個(gè)模塊被翻譯后的最終內(nèi)容以及它們之間的依賴關(guān)系;
- 輸出資源:根據(jù)入口和模塊之間的依賴關(guān)系,組裝成一個(gè)個(gè)包含多個(gè)模塊的 Chunk,再把每個(gè) Chunk 轉(zhuǎn)換成一個(gè)單獨(dú)的文件加入到輸出列表,這步是可以修改輸出內(nèi)容的最后機(jī)會(huì);
- 輸出完成:在確定好輸出內(nèi)容后,根據(jù)配置確定輸出的路徑和文件名,把文件內(nèi)容寫(xiě)入到文件系統(tǒng)。
在以上過(guò)程中,Webpack 會(huì)在特定的時(shí)間點(diǎn)廣播出特定的事件,插件在監(jiān)聽(tīng)到感興趣的事件后會(huì)執(zhí)行特定的邏輯,并且插件可以調(diào)用 Webpack 提供的 API 改變 Webpack 的運(yùn)行結(jié)果。
7.是否寫(xiě)過(guò)Loader和Plugin?描述一下編寫(xiě)loader或plugin的思路?
Loader像一個(gè)"翻譯官"把讀到的源文件內(nèi)容轉(zhuǎn)義成新的文件內(nèi)容,并且每個(gè)Loader通過(guò)鏈?zhǔn)讲僮鳎瑢⒃次募徊讲椒g成想要的樣子。
編寫(xiě)Loader時(shí)要遵循單一原則,每個(gè)Loader只做一種"轉(zhuǎn)義"工作。 每個(gè)Loader的拿到的是源文件內(nèi)容(source),可以通過(guò)返回值的方式將處理后的內(nèi)容輸出,也可以調(diào)用this.callback()方法,將內(nèi)容返回給webpack。 還可以通過(guò) this.async()生成一個(gè)callback函數(shù),再用這個(gè)callback將處理后的內(nèi)容輸出出去。 此外webpack還為開(kāi)發(fā)者準(zhǔn)備了開(kāi)發(fā)loader的工具函數(shù)集——loader-utils。
相對(duì)于Loader而言,Plugin的編寫(xiě)就靈活了許多。 webpack在運(yùn)行的生命周期中會(huì)廣播出許多事件,Plugin 可以監(jiān)聽(tīng)這些事件,在合適的時(shí)機(jī)通過(guò) Webpack 提供的 API 改變輸出結(jié)果。
8.webpack的熱更新是如何做到的?說(shuō)明其原理?
webpack的熱更新又稱熱替換(Hot Module Replacement),縮寫(xiě)為HMR。 這個(gè)機(jī)制可以做到不用刷新瀏覽器而將新變更的模塊替換掉舊的模塊。
原理:
首先要知道server端和client端都做了處理工作
- 第一步,在 webpack 的 watch 模式下,文件系統(tǒng)中某一個(gè)文件發(fā)生修改,webpack 監(jiān)聽(tīng)到文件變化,根據(jù)配置文件對(duì)模塊重新編譯打包,并將打包后的代碼通過(guò)簡(jiǎn)單的 JavaScript 對(duì)象保存在內(nèi)存中。
- 第二步是 webpack-dev-server 和 webpack 之間的接口交互,而在這一步,主要是 dev-server 的中間件 webpack-dev-middleware 和 webpack 之間的交互,webpack-dev-middleware 調(diào)用 webpack 暴露的 API對(duì)代碼變化進(jìn)行監(jiān)控,并且告訴 webpack,將代碼打包到內(nèi)存中。
- 第三步是 webpack-dev-server 對(duì)文件變化的一個(gè)監(jiān)控,這一步不同于第一步,并不是監(jiān)控代碼變化重新打包。當(dāng)我們?cè)谂渲梦募信渲昧薲evServer.watchContentBase 為 true 的時(shí)候,Server 會(huì)監(jiān)聽(tīng)這些配置文件夾中靜態(tài)文件的變化,變化后會(huì)通知瀏覽器端對(duì)應(yīng)用進(jìn)行 live reload。注意,這兒是瀏覽器刷新,和 HMR 是兩個(gè)概念。
- 第四步也是 webpack-dev-server 代碼的工作,該步驟主要是通過(guò) sockjs(webpack-dev-server 的依賴)在瀏覽器端和服務(wù)端之間建立一個(gè) websocket 長(zhǎng)連接,將 webpack 編譯打包的各個(gè)階段的狀態(tài)信息告知瀏覽器端,同時(shí)也包括第三步中 Server 監(jiān)聽(tīng)靜態(tài)文件變化的信息。瀏覽器端根據(jù)這些 socket 消息進(jìn)行不同的操作。當(dāng)然服務(wù)端傳遞的最主要信息還是新模塊的 hash 值,后面的步驟根據(jù)這一 hash 值來(lái)進(jìn)行模塊熱替換。
- webpack-dev-server/client 端并不能夠請(qǐng)求更新的代碼,也不會(huì)執(zhí)行熱更模塊操作,而把這些工作又交回給了 webpack,webpack/hot/dev-server 的工作就是根據(jù) webpack-dev-server/client 傳給它的信息以及 dev-server 的配置決定是刷新瀏覽器呢還是進(jìn)行模塊熱更新。當(dāng)然如果僅僅是刷新瀏覽器,也就沒(méi)有后面那些步驟了。
- HotModuleReplacement.runtime 是客戶端 HMR 的中樞,它接收到上一步傳遞給他的新模塊的 hash 值,它通過(guò) JsonpMainTemplate.runtime 向 server 端發(fā)送 Ajax 請(qǐng)求,服務(wù)端返回一個(gè) json,該 json 包含了所有要更新的模塊的 hash 值,獲取到更新列表后,該模塊再次通過(guò) jsonp 請(qǐng)求,獲取到最新的模塊代碼。這就是上圖中 7、8、9 步驟。
- 而第 10 步是決定 HMR 成功與否的關(guān)鍵步驟,在該步驟中,HotModulePlugin 將會(huì)對(duì)新舊模塊進(jìn)行對(duì)比,決定是否更新模塊,在決定更新模塊后,檢查模塊之間的依賴關(guān)系,更新模塊的同時(shí)更新模塊間的依賴引用。
- 最后一步,當(dāng) HMR 失敗后,回退到 live reload 操作,也就是進(jìn)行瀏覽器刷新來(lái)獲取最新打包代碼。
9.如何利用webpack來(lái)優(yōu)化前端性能?(提高性能和體驗(yàn))
用webpack優(yōu)化前端性能是指優(yōu)化webpack的輸出結(jié)果,讓打包的最終結(jié)果在瀏覽器運(yùn)行快速高效。
- 壓縮代碼。刪除多余的代碼、注釋、簡(jiǎn)化代碼的寫(xiě)法等等方式??梢岳脀ebpack的UglifyJsPlugin和ParallelUglifyPlugin來(lái)壓縮JS文件, 利用cssnano(css-loader?minimize)來(lái)壓縮css
- 利用CDN加速。在構(gòu)建過(guò)程中,將引用的靜態(tài)資源路徑修改為CDN上對(duì)應(yīng)的路徑??梢岳脀ebpack對(duì)于output參數(shù)和各loader的publicPath參數(shù)來(lái)修改資源路徑
- 刪除死代碼(Tree Shaking)。將代碼中永遠(yuǎn)不會(huì)走到的片段刪除掉??梢酝ㄟ^(guò)在啟動(dòng)webpack時(shí)追加參數(shù)--optimize-minimize來(lái)實(shí)現(xiàn)
- 提取公共代碼。
10.如何提高webpack的構(gòu)建速度?
- 多入口情況下,使用CommonsChunkPlugin來(lái)提取公共代碼
- 通過(guò)externals配置來(lái)提取常用庫(kù)
- 利用DllPlugin和DllReferencePlugin預(yù)編譯資源模塊 通過(guò)DllPlugin來(lái)對(duì)那些我們引用但是絕對(duì)不會(huì)修改的npm包來(lái)進(jìn)行預(yù)編譯,再通過(guò)DllReferencePlugin將預(yù)編譯的模塊加載進(jìn)來(lái)。
- 使用Happypack 實(shí)現(xiàn)多線程加速編譯
- 使用webpack-uglify-parallel來(lái)提升uglifyPlugin的壓縮速度。 原理上webpack-uglify-parallel采用了多核并行壓縮來(lái)提升壓縮速度
- 使用Tree-shaking和Scope Hoisting來(lái)剔除多余代碼
11.怎么配置單頁(yè)應(yīng)用?怎么配置多頁(yè)應(yīng)用?
單頁(yè)應(yīng)用可以理解為webpack的標(biāo)準(zhǔn)模式,直接在entry中指定單頁(yè)應(yīng)用的入口即可,這里不再贅述
多頁(yè)應(yīng)用的話,可以使用webpack的 AutoWebPlugin來(lái)完成簡(jiǎn)單自動(dòng)化的構(gòu)建,但是前提是項(xiàng)目的目錄結(jié)構(gòu)必須遵守他預(yù)設(shè)的規(guī)范。 多頁(yè)應(yīng)用中要注意的是:
每個(gè)頁(yè)面都有公共的代碼,可以將這些代碼抽離出來(lái),避免重復(fù)的加載。比如,每個(gè)頁(yè)面都引用了同一套css樣式表
隨著業(yè)務(wù)的不斷擴(kuò)展,頁(yè)面可能會(huì)不斷的追加,所以一定要讓入口的配置足夠靈活,避免每次添加新頁(yè)面還需要修改構(gòu)建配置
12.npm打包時(shí)需要注意哪些?如何利用webpack來(lái)更好的構(gòu)建?
Npm是目前最大的 JavaScript 模塊倉(cāng)庫(kù),里面有來(lái)自全世界開(kāi)發(fā)者上傳的可復(fù)用模塊。你可能只是JS模塊的使用者,但是有些情況你也會(huì)去選擇上傳自己開(kāi)發(fā)的模塊。 關(guān)于NPM模塊上傳的方法可以去官網(wǎng)上進(jìn)行學(xué)習(xí),這里只講解如何利用webpack來(lái)構(gòu)建。
NPM模塊需要注意以下問(wèn)題:
- 要支持CommonJS模塊化規(guī)范,所以要求打包后的最后結(jié)果也遵守該規(guī)則。
- Npm模塊使用者的環(huán)境是不確定的,很有可能并不支持ES6,所以打包的最后結(jié)果應(yīng)該是采用ES5編寫(xiě)的。并且如果ES5是經(jīng)過(guò)轉(zhuǎn)換的,請(qǐng)最好連同SourceMap一同上傳。
- Npm包大小應(yīng)該是盡量小(有些倉(cāng)庫(kù)會(huì)限制包大?。?/li>
- 發(fā)布的模塊不能將依賴的模塊也一同打包,應(yīng)該讓用戶選擇性的去自行安裝。這樣可以避免模塊應(yīng)用者再次打包時(shí)出現(xiàn)底層模塊被重復(fù)打包的情況。
- UI組件類的模塊應(yīng)該將依賴的其它資源文件,例如.css文件也需要包含在發(fā)布的模塊里。
基于以上需要注意的問(wèn)題,我們可以對(duì)于webpack配置做以下擴(kuò)展和優(yōu)化:
- CommonJS模塊化規(guī)范的解決方案: 設(shè)置output.libraryTarget='commonjs2'使輸出的代碼符合CommonJS2 模塊化規(guī)范,以供給其它模塊導(dǎo)入使用
- 輸出ES5代碼的解決方案:使用babel-loader把 ES6 代碼轉(zhuǎn)換成 ES5 的代碼。再通過(guò)開(kāi)啟devtool: 'source-map'輸出SourceMap以發(fā)布調(diào)試。
- Npm包大小盡量小的解決方案:Babel 在把 ES6 代碼轉(zhuǎn)換成 ES5 代碼時(shí)會(huì)注入一些輔助函數(shù),最終導(dǎo)致每個(gè)輸出的文件中都包含這段輔助函數(shù)的代碼,造成了代碼的冗余。解決方法是修改.babelrc文件,為其加入transform-runtime插件
- 不能將依賴模塊打包到NPM模塊中的解決方案:使用externals配置項(xiàng)來(lái)告訴webpack哪些模塊不需要打包。
- 對(duì)于依賴的資源文件打包的解決方案:通過(guò)css-loader和extract-text-webpack-plugin來(lái)實(shí)現(xiàn),配置如下:
13.如何在vue項(xiàng)目中實(shí)現(xiàn)按需加載?
Vue UI組件庫(kù)的按需加載 為了快速開(kāi)發(fā)前端項(xiàng)目,經(jīng)常會(huì)引入現(xiàn)成的UI組件庫(kù)如ElementUI、iView等,但是他們的體積和他們所提供的功能一樣,是很龐大的。 而通常情況下,我們僅僅需要少量的幾個(gè)組件就足夠了,但是我們卻將龐大的組件庫(kù)打包到我們的源碼中,造成了不必要的開(kāi)銷(xiāo)。
不過(guò)很多組件庫(kù)已經(jīng)提供了現(xiàn)成的解決方案,如Element出品的babel-plugin-component和AntDesign出品的babel-plugin-import 安裝以上插件后,在.babelrc配置中或babel-loader的參數(shù)中進(jìn)行設(shè)置,即可實(shí)現(xiàn)組件按需加載了。
單頁(yè)應(yīng)用的按需加載 現(xiàn)在很多前端項(xiàng)目都是通過(guò)單頁(yè)應(yīng)用的方式開(kāi)發(fā)的,但是隨著業(yè)務(wù)的不斷擴(kuò)展,會(huì)面臨一個(gè)嚴(yán)峻的問(wèn)題——首次加載的代碼量會(huì)越來(lái)越多,影響用戶的體驗(yàn)。
通過(guò)import(*)語(yǔ)句來(lái)控制加載時(shí)機(jī),webpack內(nèi)置了對(duì)于import(*)的解析,會(huì)將import(*)中引入的模塊作為一個(gè)新的入口在生成一個(gè)chunk。 當(dāng)代碼執(zhí)行到import(*)語(yǔ)句時(shí),會(huì)去加載Chunk對(duì)應(yīng)生成的文件。import()會(huì)返回一個(gè)Promise對(duì)象,所以為了讓瀏覽器支持,需要事先注入Promise polyfill
參考文章
關(guān)于 webpack 的面試題有哪些?
前端面試之webpack面試常見(jiàn)問(wèn)題
《深入淺出webpack》電子版
webpack 構(gòu)建性能優(yōu)化策略小結(jié)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- 這篇文章主要介紹了程序員面試的幾個(gè)小技巧,在平時(shí)面試的時(shí)候,除了實(shí)打?qū)嵉募寄苓€需要更多的技巧,雙管齊下才能贏得更大的勝算,技能方面就不多說(shuō)了,下面來(lái)分享幾個(gè)面試2023-04-23
- 面試中,問(wèn)鎖主要是兩方面:鎖的日常使用場(chǎng)景 + 鎖原理,鎖的日常使用場(chǎng)景主要考察對(duì)鎖 API 的使用熟練度,看看你是否真的使用過(guò)這些 API,而不是紙上談兵,鎖原理主要就是2022-05-19
Mybatis常見(jiàn)面試題詳細(xì)總結(jié)
這篇文章主要介紹了Mybatis常見(jiàn)面試題詳細(xì)總結(jié),通過(guò)總結(jié)列舉大量的mybatis面試常見(jiàn)題目供給大家參考,希望對(duì)大家有所幫助2021-08-242020Java后端開(kāi)發(fā)面試題總結(jié)(春招+秋招+社招)
這篇文章主要介紹了2020Java后端開(kāi)發(fā)面試題總結(jié)(春招+秋招+社招),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-02-18MySQL數(shù)據(jù)庫(kù)選擇題小結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)選擇題小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-02-07- 這篇文章主要介紹了30道有趣的JVM面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-11-26
Python面試題爬蟲(chóng)篇小結(jié)(附答案)
這篇文章主要介紹了Python面試題爬蟲(chóng)篇小結(jié)(附答案),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-10-28還不理解B樹(shù)和B+樹(shù),那就看看這篇文章吧
這篇文章主要介紹了還不理解B樹(shù)和B+樹(shù),那就看看這篇文章吧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一2020-09-10Java面試通關(guān)要點(diǎn)匯總(備戰(zhàn)秋招)
這篇文章主要介紹了Java面試通關(guān)要點(diǎn)匯總(備戰(zhàn)秋招),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-09-08- 這篇文章主要介紹了10道JVM常見(jiàn)面試題解析(附答案),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)2020-09-04