系列部落格連結
程式碼
初始化專案
-
建立專案
mkdir webpack4-demo
cd webpack4-demo
-
npm init -y
-
安裝
npm install webpack --save-dev
-
安裝指定版本
npm install --save-dev webpack@<version>
-
webpack 4+ 版本,還需要安裝webpack-cli
npm install webpack-cli --save-dev
建議本地安裝webpack和webpack-cli 目前webpack最新版本為:4.30.0,也是本文學習webpack使用的版本
專案目錄結構
執行npx webpack index.js
命令,生成dist
目錄,dist
目錄下是對index.js
打包後得到的檔案,預設是main.js
檔案。
webpack4的簡單配置
entry
和output
配置
webpack.config.js檔案
const path = require('path')
module.exports={
mode: 'development', //development: 開發環境 production:生產環境
//入口檔案配置
//entry: './src/index.js',
//等價於
/*entry: {
main: './src/index.js'
},*/
entry: {
index: './src/index.js'
},
//打包完成後檔案存放位置配置
output: {
//filename 設定打包後檔案的名字
//如果不設定filename,則檔案的名字跟入口檔案路徑的屬性名一樣
filename: 'bundle.js',
//path 設定打包完成後檔案存放路徑
path: path.resolve(__dirname,'dist')
}
}
複製程式碼
在專案根目錄下新建src資料夾,在src資料夾下新建index.js(入口檔案)檔案
執行npx webpack命令
npx webpack
等價於npx webpack --config webpack.config.js
當配置檔案命名為webpack.config.js
時可以省略--config *.js
直接執行npx webpack
即可,否則執行npx webpack --config 配置檔名
。
結果
在package.json
中配置'script'來執行npx webpack
命令。
"scripts": {
"start": "webpack"
}
複製程式碼
新增"start": "webpack"
,執行npm run start
效果等價於執行npx webpack
命令。
配置webpack.config.js
的modoule
物件
modoule
物件主要是對loader的配置
file-loader
的使用
安裝
file-loader
npm i file-loader --save-dev
webpack.config.js檔案
const path = require('path')
module.exports={
mode: 'development', //development: 開發環境 production:生產環境
//入口檔案配置
//entry: './src/index.js',
//等價於
/*entry: {
main: './src/index.js'
},*/
entry: {
index: './src/index.js'
},
//打包完成後檔案存放位置配置
output: {
//filename 設定打包後檔案的名字
//如果不設定filename,則檔案的名字跟入口檔案路徑的屬性名一樣
filename: 'bundle.js',
//path 設定打包完成後檔案存放路徑
path: path.resolve(__dirname,'dist')
},
module: {
rules:[
{
test: /\.(png|jpg|gif)$/,
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]', //對打包後的圖片命名
outputPath: 'images/' //打包後圖片放的位置 dist\images
}
}
}
]
}
}
複製程式碼
index.js檔案
//index.js
//import匯入圖片
import image from './images/11.png'
let img=new Image()
img.src=image
document.body.append(img)
複製程式碼
npm run start
後的目錄結構
在dist目錄下出現了images目錄和圖片,建立index.html,引入js檔案,在瀏覽器中開啟就可以看到圖片。
url-loader
的使用
url-loader
安裝npm i url-loader -D
url-loader
的作用跟'file-loader'的作用很類似
webpack.config.js檔案的module
物件中新增url-loader
配置
module: {
rules:[
{
test: /\.(png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
name: '[name].[ext]', //對打包後的圖片命名
outputPath: 'images/', //打包後圖片放的位置 dist\images
limit: 2048
//1024 == 1kb
//小於200kb時打包成base64編碼的圖片否則單獨打包成圖片
}
}
}
]
}
}
複製程式碼
url-loader
打包的圖片是字串,base64編碼的圖片,並且打包進index.js檔案中。
limit
屬性:當圖片大小大於屬性值時打包成單獨的圖片,否則打包成base64編碼的圖片。
因為base64編碼的圖片比較大,所以圖片比較小時打包成base64編碼的圖片,圖片比較大時單獨打包成一張圖片。
對css
和scss
的打包
安裝相應的loader
npm i css-loader style-loader -D
npm i node-sass sass-loader -D
npm i postcss-loader -D
npm i autoprefixer -D
postcss-loader
和autoprefixer
配合使用可以在打包過程中自動新增字首
在專案根目錄下新建postcss.config.js
,配置如下
//postcss.config.js
module.exports={
plugins: [
require('autoprefixer')
]
}
複製程式碼
在webpack.config.js檔案的module
物件中新增配置
module:{
rules:[
{
test: /\.css$/,
use:[
'style-loader',
'css-loader',
'postcss-loader'
//加字首 npm i autoprefixer -D
//在專案根目錄下配置postcss.config.js檔案
]
},
{
test: /\.scss$/,
use:[
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 2,
//importLoaders
//用於配置css-loader作用於@import的資源之前有多少個loader先作用於@import的資源
}
},
'postcss-loader',
'sass-loader'
]
}
]
}
複製程式碼
//index.js
import './style.css'
import image from './images/11.png'
import './index.scss'
let img=new Image()
img.src=image
let root=document.getElementById('root')
root.append(img)
複製程式碼
css模組化
//webpack.config.js
module:{
rules: [
{
test: /\.scss$/,
use:[
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 2,
//importLoaders
//用於配置css-loader作用於@import的資源之前有多少個loader先作用於@import的資源
modules: true //載入css模組化打包,避免樣式檔案之間相互影響
}
},
'postcss-loader',
'sass-loader'
]
}
]
}
複製程式碼
//index.js
import image from './images/11.png'
import style from './index.scss'
let img=new Image()
img.src=image
//style.img .img是scss檔案中寫好的類名
img.classList.add(style.img)
let root=document.getElementById('root')
root.append(img)
//scss
.img{
width: 150px;
height: 150px;
border: 10px solid goldenrod;
background: red;
border-radius: 30%;
}
複製程式碼
結果
可以看到新增了一個class,類名是一串比較複雜的字串,從而避免這個樣式對別的元素產生影響。