點錯了 直接發佈了 千萬別說沒寫完 後續會更新的javascript
webpack 基本 文檔梳理
概念
webpack :一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)css
入口(entry): webpack 應該使用哪一個模塊,來做爲構建其內部依賴圖的開始。進入入口起點後,webpack 會找出有哪些模塊和庫是入口起點(直接和間接)依賴的
輸出(output): 屬性告訴 webpack 在哪裏輸出它所建立的 bundles,以及如何命名這些文件
loader: 用於對模塊的源代碼進行轉換,讓 webpack 可以去處理那些非 JavaScript 文件
插件(plugins): 用於執行範圍更廣的任務。插件的範圍包括,從打包優化和壓縮,一直到從新定義環境中的變量
模式(mode): 開發環境仍是生產環境
模塊解析(resolver): 幫助找到弄快的絕對路徑。
構建目標(targets): node環境仍是瀏覽器環境
模塊熱替換(HMR): 在應用程序運行過程當中替換、添加或刪除模塊,而無需從新加載整個頁面
多種配置類型
導出一個函數 : 運用在開發和生產構建區別之間,用webpack-merge 合併
導出一個 Promise : 須要異步地加載所需的配置變量,例如:動態加載文件路徑等
導出 多個配置對象: 例如node環境 和 web環境 分開配置
webpack的基本功能和工做原理
代碼轉換:TypeScript 編譯成 JavaScript、SCSS 編譯成 CSS 等等
文件優化:壓縮 JavaScript、CSS、HTML 代碼,壓縮合並圖片等
代碼分割:提取多個頁面的公共代碼、提取首屏不須要執行部分的代碼讓其異步加載
模塊合併:在採用模塊化的項目有不少模塊和文件,須要構建功能把模塊分類合併成一個文件
自動刷新:監聽本地源代碼的變化,自動構建,刷新瀏覽器
代碼校驗:在代碼被提交到倉庫前須要檢測代碼是否符合規範,以及單元測試是否經過
自動發佈:更新完代碼後,自動構建出線上發佈代碼並傳輸給發佈系統。
webpack構建過程
從entry裏配置的module開始遞歸解析entry依賴的全部module
每找到一個module,就會根據配置的loader去找對應的轉換規則
對module進行轉換後,再解析出當前module依賴的module
這些模塊會以entry爲單位分組,一個entry和其全部依賴的module被分到一個組Chunk
最後webpack會把全部Chunk轉換成文件輸出
在整個流程中webpack會在恰當的時機執行plugin裏定義的邏輯
webpack
經常使用loader
經常使用 plugins (npm 官網能夠本身找鏈接 這裏之後再把鏈接加上)
babel
其餘經常使用 node package
點擊進入查看 綜合應用 html
react 經常使用 項目依賴 package
react 經常使用 開發依賴 package
webpack bundle 優化
Tree-shaking
用於描述移除 JavaScript 上下文中的未引用代碼(dead-code)
Tree-shaking 在production環境使用,要開啓package.json中 {sideEffects:true}
Tree-shaking 只能消除沒有被引用的變量和函數,不能消除類
ES6模塊依賴關係是肯定的,和運行時的狀態無關,能夠進行可靠的靜態分析。 Tree-shaking以此做爲基礎區分
實踐
babel-plugin-import —— 按需引入 點擊進入antd官網說明
{
plugins : [
["import" ,
{ "libraryName" : "antd" , 'libraryDirectory' : 'es' , "style" : true }
]
]
}
複製代碼
babel-plugin-ramda —— ramda Tree Shake
{
plugins : [
["ramda" , {
"useES" : true
}]
,
}
複製代碼
webpack bundle文件去重 todo 等一下 本身研究一下 下面兩個配置的區別
{
plugins : [
new webpack.optimize.CommonsChunkPlugin({
name : "commons" ,
}),
new webpack.optimize.CommonsChunkPlugin({
children : true ,
async : true ,
minChunks : 2 ,
}),
]
}
複製代碼
Code split
入口起點:使用 entry 配置手動地分離代碼。
防止重複:使用 CommonsChunkPlugin 去重和分離 chunk
動態導入:經過模塊的內聯函數調用來分離代碼
lazy-load
開發速度和打包優化
hmr 與 hot-loader
happypack
hardsource
bundle-analyzer
css minimize
transform-react-remove-prop-types
{
"presets" : [["es2015" , { "modules" : false }], "stage-2" , "react" ],
"env" : {
"production" : {
"plugins" : ["transform-react-remove-prop-types" ]
}
}
}
複製代碼
其餘
PWA
自定義 plugin
自定義 loader
參考文獻
Webpack4+Babel7優化70%速度
webpack面試題
用 nodejs 寫一個命令行工具 :建立 react 組件的命令行工具
Tree-Shaking性能優化實踐 - 原理篇
Tree-Shaking性能優化實踐 - 實踐篇