上一篇 前端面試題-小程序php
隨着前端的不斷髮展,現代前端開發的複雜度和規模愈來愈龐大。工程化的思想催生了不少流行框架的進程,做爲如今最流行的前端構建工具--webpack,不少面試、工做場景中都會出現了它的身影。因此對於如今的前端來講,瞭解並可以使用webpack,不管對我的技能或者職場求職來講,都是一種有力的提高css
感興趣的小夥伴能夠點擊 這裏,查看完整版前端面試題html
若是文章中有出現紕漏、錯誤之處,還請看到的小夥伴留言指正,先行謝過前端
如下 ↓node
官方文檔webpack
本質上,webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler),將項目看成一個總體,經過一個給定的的主文件,webpack將從這個文件開始找到你的項目的全部依賴文件,使用loaders處理它們,最後打包成一個或多個瀏覽器可識別的js文件
核心概念:git
入口起點(entry point)
指示 webpack
應該使用哪一個模塊,來做爲構建其內部依賴圖的開始github
能夠經過在 webpack
配置中配置 entry
屬性,來指定一個入口起點(或多個入口起點)web
module.exports = { entry: './path/to/my/entry/file.js' };
output
屬性告訴 webpack
在哪裏輸出它所建立的 bundles
,以及如何命名這些文件,默認值爲 ./dist
面試
loader
讓 webpack
可以去處理那些非 JavaScript
文件(webpack
自身只理解 JavaScript
)
loader
被用於轉換某些類型的模塊,而插件則能夠用於執行範圍更廣的任務。插件的範圍包括,從打包優化和壓縮,一直到從新定義環境中的變量
經過選擇 development
或 production
之中的一個,來設置 mode
參數,你能夠啓用相應模式下的 webpack
內置的優化
module.exports = { mode: 'production' };
let webpack = require('webpack'); module.exports = { entry:'./entry.js', //入口文件 output:{ //node.js中__dirname變量獲取當前模塊文件所在目錄的完整絕對路徑 path:__dirname, //輸出位置 filename:'build.js' //輸入文件 }, module:{ // 關於模塊的加載相關,咱們就定義在module.loaders中 // 這裏經過正則表達式去匹配不一樣後綴的文件名,而後給它們定義不一樣的加載器。 // 好比說給less文件定義串聯的三個加載器(!用來定義級聯關係): rules:[ { test:/\.css$/, //支持正則 loader:'style-loader!css-loader' } ] }, //配置服務 devServer:{ hot:true, //啓用熱模塊替換 inline:true //此模式支持熱模塊替換:熱模塊替換的好處是隻替換更新的部分,而不是頁面重載. }, //其餘解決方案配置 resolve:{ extensions:['','.js','.json','.css','.scss'] }, //插件 plugins:[ new webpack.BannerPlugin('This file is create by baibai') ] }
// webpack.config.js var WebpackDevServer = require("webpack-dev-server"); module.exports = { ... devServer: { ... port: '8088', //設置端口號 // 代理設置 proxy: { '/api': { target: 'http://localhost:80/index.php', // 目標代理 pathRewrite: {'^/api' : ''}, // 重寫路徑 secure: false, // 是否接受運行在 HTTPS 上 } } } }
配置多個入口文件
entry: { home: resolve(__dirname, "src/home/index.js"), about: resolve(__dirname, "src/about/index.js") }
三者都是前端構建工具
grunt
和gulp
是基於任務和流的。找到一個(或一類)文件,對其作一系列鏈式操做,更新流上的數據, 整條鏈式操做構成了一個任務,多個任務就構成了整個web的構建流程
webpack
是基於入口的。webpack
會自動地遞歸解析入口所須要加載的全部資源文件,而後用不一樣的Loader
來處理不一樣的文件,用Plugin
來擴展webpack
功能
webpack
與前者最大的不一樣就是支持代碼分割,模塊化(AMD,CommonJ,ES2015),全局分析
css-loader
:加載 CSS
,支持模塊化、壓縮、文件導入等特性style-loader
:把 CSS
代碼注入到 JavaScript 中
,經過 DOM
操做去加載 CSS
slint-loader
:經過 SLint
檢查 JavaScript
代碼babel-loader
:把 ES6
轉換成 ES5
file-loader
:把文件輸出到一個文件夾中,在代碼中經過相對 URL
去引用輸出的文件url-loader
:和 file-loader
相似,可是能在文件很小的狀況下以 base64
的方式把文件內容注入到代碼中去define-plugin
:定義環境變量commons-chunk-plugin
:提取公共代碼Webpack
將一切文件視爲模塊,可是webpack
原生是隻能解析js
文件.Loader
的做用是讓webpack
擁有了加載和解析非JavaScript
文件的能力在
module.rules
中配置,也就是說他做爲模塊的解析規則而存在,類型爲數組
擴展webpack
的功能,讓webpack
具備更多的靈活性在
plugins
中單獨配置。類型爲數組,每一項是一個plugin
的實例,參數都經過構造函數傳入
Shell
語句中讀取與合併參數,得出最終的參數Compiler
對象,加載全部配置的插件,執行對象的 run
方法開始執行編譯entry
找出全部的入口文件Loader
對模塊進行翻譯,再找出該模塊依賴的模塊,再遞歸本步驟直到全部入口依賴的文件都通過了本步驟的處理Loader
翻譯完全部模塊後,獲得了每一個模塊被翻譯後的最終內容以及它們之間的依賴關係Chunk
,再把每一個 Chunk
轉換成一個單獨的文件加入到輸出列表,這步是能夠修改輸出內容的最後機會在以上過程當中,Webpack
會在特定的時間點廣播出特定的事件,插件在監聽到感興趣的事件後會執行特定的邏輯,而且插件能夠調用Webpack
提供的API
改變Webpack
的運行結果
編寫Loader
時要遵循單一原則,每一個Loader
只作一種"轉義"工做。 每一個Loader
的拿到的是源文件內容(source)
,能夠經過返回值的方式將處理後的內容輸出,也能夠調用this.callback()
方法,將內容返回給webpack
。 還能夠經過this.async()
生成一個callback
函數,再用這個callback
` 將處理後的內容輸出出去相對於
Loader
而言,Plugin
的編寫就靈活了許多。webpack
在運行的生命週期中會廣播出許多事件,Plugin
能夠監聽這些事件,在合適的時機經過Webpack
提供的API
改變輸出結果
具體能夠參考 這裏
CDN
加速。在構建過程當中,將引用的靜態資源路徑修改成 CDN
上對應的路徑Tree Shaking)
。將代碼中永遠不會走到的片斷刪除掉base64
的方式寫入文件中參考 這裏
webpack
的標準模式,直接在 entry
中指定單頁應用的入口便可webpack
的 AutoWebPlugin
來完成簡單自動化的構建,可是前提是項目的目錄結構必須遵照他預設的規範bundle
是由webpack
打包出來的文件,chunk
是指webpack
在進行模塊的依賴分析的時候,代碼分割出來的代碼塊。module
是開發中的單個模塊
前端發展突飛猛進,只有保持不斷學習的姿態,才能走的更遠
但願這些面試題能夠幫助你們溫故知新、查缺補漏,不斷充實本身的專業技能,走的更遠
最後推薦一波 GitHub前端面試題完整版,歡迎小夥伴們 star
關注
不按期更新,期待同行
以上