webpack
- webpack是一種前端資源構(gòu)建工具,一個靜態(tài)模塊打包器,在webpack看來,前端所有資源文件都會作模塊處理,它將根據(jù)模塊的依賴關(guān)系進行靜態(tài)分析,打包生成對應(yīng)的靜態(tài)資源
- 使用 npm 安裝 webpack 同時需要安裝 webpack-cli
- npm install webpack webpack-cli -D
webpack五個核心概念
- Entry 入口指示webpack以哪個文件為入口起點開始打包,分析構(gòu)建內(nèi)部依賴圖
- Output 指示webpack打包后的資源bundles輸出到哪里
- Loader 讓webpack能夠處理那些非js文件
- Plugins 插件功能,可以用于打包優(yōu)化和壓縮,重新定義環(huán)境變量等功能
- Model 指示webpack使用相應(yīng)模式的配置
- development 能讓代碼本地調(diào)試運行的環(huán)境
- production 能讓代碼優(yōu)化上線運行的環(huán)境
webpack打包css
- 分別用到3個包less-loader,css-loader,style-loader
- 還需要下載less
webpack打包html
webpack.config.js
- webpack的配置文件
- 所有構(gòu)建工具都是基于node.js平臺運行的,模塊化操作默認采用commonjs
- webpack只能理解javascript和json文件,loader讓webpack能夠去處理其他類型的文件,并將他們轉(zhuǎn)為有效的模塊
//用來拼接路徑
const {resolve} = require('path')
module.exports = {
//入口起點
entry: './src/index.js',
//輸出
output: {
//輸出文件名
filename: 'built.js',
//輸出路徑
path: resolve(__dirname,'build')
},
//loader的配置
module: {
rules: [
//詳細loader配置
{
//打包css資源
test: /\.css$/,
use: [
'style-loader',
'css-loader',
//下載less-loader還得下載less
//將less轉(zhuǎn)化成css
'less-loader'
],
}
]
},
// plugins的配置
pligins: [
],
//模式
mode: 'development',
//mode: 'production'
}
ESmodules 和 CommonJS
- ESmodules中可以導(dǎo)入Commonjs模塊
- CommonJS中不能導(dǎo)入ESmodules模塊
- CommonJS始終只會導(dǎo)出一個默認成員
- 注意import不是解構(gòu)導(dǎo)出對象
圖片打包
- 安裝url-loader插件
- 小文件使用Data URLs,減少請求次數(shù)
- 大文件單獨提取存放,提高加載速度
webpack處理es6轉(zhuǎn)換
- 引入babel-loader,@babel/core,@babel/preset-env
webpack兼容多種模塊化標準
- 遵循ESmodules標準的import聲明
- 遵循CommonJS標準的require函數(shù)
- 遵循AMD標準的define函數(shù)和require函數(shù)
- 樣式代碼中的@import指令和Url函數(shù)
- HTML代碼中圖片標簽的src屬性
webpack 插件
- 自動清除輸出目錄插件clean-webpack-plugin
- 自動生成使用bundle.js的HTML插件html-webpack-plugin
- 拷貝文件到其他路徑下clean-webpack-plugin
自動更新打包數(shù)據(jù)
- 運行webpack --watch 監(jiān)控包變化
- 可以利用browser-sync監(jiān)控瀏覽器變化 browser-sync dist --files "**/*"
webpack Dev Server
source Map
- 解決調(diào)錯
- eval-是否使用eval執(zhí)行代碼
- cheao-Source Map 是否包含行信息
- module-是否能夠得到Loader處理之前的源代碼
- 在開發(fā)環(huán)境下選擇cheap-module-eval-source-map
- 生產(chǎn)模式下選擇none或者nosources-source-map
webpack HMR
- 應(yīng)用運行過程中實時替換某個模塊,應(yīng)用狀態(tài)不受改變
- HMR是webpack中最強大的功能之一
- 極大程度提高開發(fā)者效率
開啟HMR
- 安裝webpack-dev-server模塊
- 運行webpack-dev-server --hot
const HtmlWebpackPlugin = require('html-webpack-plugin')
//引入模塊
const webpack = require('webpack')
module.exports = {
mode: 'none',
entry: './src/main.js',
output: {
filename: 'js/bundle.js'
},
devtool: 'source-map',
// 打開熱更新
devServer: {
hot: true
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(png|jpe?g|gif)$/,
use: 'file-loader'
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Tutorial',
template: './src/index.html'
}),
//配置HMR
new webpack.HotModuleReplacementPlugin()
]
}
HMR APIs
- 處理js熱替換的方法
- 處理圖片熱替換的方法
// HMR 手動處理模塊熱更新
// 不用擔(dān)心這些代碼在生產(chǎn)環(huán)境冗余的問題,因為通過 webpack 打包后,
// 這些代碼全部會被移除,這些只是開發(fā)階段用到
if (module.hot) {
let hotEditor = editor
module.hot.accept('./editor.js', () => {
// 當 editor.js 更新,自動執(zhí)行此函數(shù)
// 臨時記錄編輯器內(nèi)容
const value = hotEditor.innerHTML
// 移除更新前的元素
document.body.removeChild(hotEditor)
// 創(chuàng)建新的編輯器
// 此時 createEditor 已經(jīng)是更新過后的函數(shù)了
hotEditor = createEditor()
// 還原編輯器內(nèi)容
hotEditor.innerHTML = value
// 追加到頁面
document.body.appendChild(hotEditor)
})
module.hot.accept('./better.png', () => {
// 當 better.png 更新后執(zhí)行
// 重寫設(shè)置 src 會觸發(fā)圖片元素重新加載,從而局部更新圖片
img.src = background
})
// style-loader 內(nèi)部自動處理更新樣式,所以不需要手動處理樣式模塊
}
webpack DefinePlugin
tree-shaking
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。