之前的一份webpack3的配置檔案
let HtmlWebpackPlugin = require('html-webpack-plugin');// 引入插件
// webpack必須使用commonjs寫法,預設導出一個對象
module.exports = {
// 入口檔案
entry: './src/main.js',
// 出口檔案
output: {
filename: 'bundle.js', // 打包後的檔案名
path: __dirname + '/dist' // 打包路徑(必須是絕對路徑)
},
// 子產品解析規則
module:{
rules: [
// 解析js檔案
{
test: /\.js$/, // 正則比對需要解析的檔案
use: 'babel-loader',
exclude: /node_modules/ // 排除node_modules檔案夾
},
// 解析css檔案
{
test: /\.css$/,
use: ['style-loader', 'css-loader']// use從右往左寫
},
// 解析less
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
// 解析圖檔
{
test: /\.(jpg|png|gif)$/,
use: 'url-loader?limit=8192'// url-loader會自動調用file-loader,limit限制轉成base64的圖檔大小
}
]
},
// 插件
plugins: [
new HtmlWebpackPlugin({ // 在dist目錄下生成html檔案
template: './src/index.html' //模闆檔案
// filename: 'xxx.html' //指定檔案名(預設為index.html)
})
]
}
webpack4
webpack4需要安裝webpack和webpack-cli兩個依賴,其他的跟webpack3基本大同小異。
npm install webpack webpack-cli --save-dev
基本配置
開發過程中一般需要一個開發伺服器webpack-dev-server,自行npm install一下
webpack.config.js
const path = require('path');
module.exports = {
mode: 'development', //預設production 生産環境會将代碼壓縮
//入口
entry: './src/index.js',
// 出口
output: {
filename: 'bundle.js', //打包後檔案名
path: path.resolve(__dirname, 'dist') //打包後檔案所在路徑,必須是絕對路徑
},
// 開發伺服器webpack-dev-server配置
devServer: {
port: 3000, //端口
open: true, //自動打開浏覽器
progress: true, //進度條
//compress: true,
contentBase: './dist', //以哪個目錄開啟服務,預設是目前目錄
}
}
package.json加入腳本指令
"scripts": {
"build": "webpack --config webpack.config.js",
"dev": "webpack-dev-server"
}
打包生成html檔案
需要使用html-webpack-plugin插件
npm install html-webpack-plugin --save-dev
webpack.config.js中先引入,再在配置中plugins項加入一些配置
const HtmlWebpackPlugin = require('html-webpack-plugin'); //打包生成html檔案插件
...
...
plugins: [
// 打包生成html檔案,并且會自動将js檔案引入
new HtmlWebpackPlugin({
template: './src/index.html', //html模闆檔案
filename: 'index.html', //打包後檔案名
minify: { //檔案壓縮
collapseWhitespace: true //折疊空格
},
hash: true //引入檔案名加上hash值防止檔案緩存問題
})
]
至此打包之後會生成html檔案,并且js、css檔案(loader配置好之後的)插入其中。
樣式處理
基本配置
webpack預設隻支援打包js檔案,其他檔案可能不太識别,這是就可以使用各種各樣的 loader 來解析其他檔案,比如css檔案:
解析css檔案至少需要 style-loader、css-loader兩個loader
npm install style-loader css-loader --save-dev
在webpack.config.js檔案中加入
module: {
rules: [
{
test: /\.css$/, //css檔案用css-loader解析,style-loader負責将css引入到html中
use: ['style-loader', 'css-loader'] //注意順序問題
}
]
}
上面寫法就完成了樣式的基本配置,預設會<head>裡的後面追加,也就是說自己直接在頁面上寫的樣式可能會被覆寫

如果想在<head>裡的前面引入的話,可以用loader的對象寫法
{
test: /\.css$/, //css檔案用css-loader解析,style-loader負責将css引入到html中
use: [
{
loader: 'style-loader',
options: {
insertAt: 'top' //在<head>裡的前面移入css檔案
}
},
'css-loader'
]
}
配置less
打包less檔案需要less-loader,而less-loader還要依賴less核心包,是以需要下載下傳less、less-loader兩個開發依賴。如果需要配置sass則換成node-sass、sass-loader,相同的意思,配置也差不多。
npm install less less-loader --save-dev
然後在webpack.config.js中加入一個loader規則即可
{
test: /\.less$/, //打包less檔案
use: ['style-loader', 'css-loader', 'less-loader']
}
樣式打包成單獨的css檔案
以上配置打包出來的樣式都是以link标簽形式引入html文檔中,如果我們需要将樣式單獨打包成一個css檔案的話還需要用到一個 mini-css-extract-plugin 插件
npm install mini-css-extract-plugin --save-dev
webpack插件一貫的使用套路,先引入然後在plugins中加入該插件執行個體
const MiniCssExtractPlugin = require('mini-css-extract-plugin');//單獨打包css檔案插件
//插件配置
plugins: [
// 單獨打包css檔案
new MiniCssExtractPlugin({
filename: 'main.css' //打包出來的css檔案名
})
]
然後再修改之前配置的樣式loader,将style-loader改成 MiniCssExtractPlugin.loader即可
{
test: /\.css$/, //css檔案用css-loader解析,style-loader負責将css引入到html中
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
},
{
test: /\.less$/, //打包less檔案
use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
}
css樣式加浏覽器字尾
需要autoprefixer、postcss-loader兩個依賴
npm inastall autoprefixer postcss-loader --save-dev
loader用法很簡單,直接在之前的樣式打包配置中的 'css-loader' 後面插入 'postcss-loader'
{
test: /\.css$/, //css檔案用css-loader解析,style-loader負責将css引入到html中
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader'
]
},
{
test: /\.less$/, //打包less檔案
use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader']
}
注意:使用postcss-loader還需要建立一個postcss.config.js檔案進行一些配置,如下:
module.exports = {
plugins: [
require('autoprefixer') //使用autoprefixer插件
]
}
至此,一些需要添加浏覽器字首的樣式就會自動添加
打包出來的css檔案壓縮
需要使用optimize-css-assets-webpack-plugin插件,配置一些優化項
npm install optimize-css-assets-webpack-plugin --save-dev
webpack插件一貫的使用套路,先引入再執行個體化,這次要加入一個 optimization 優化項
const OptimizeCss = require('optimize-css-assets-webpack-plugin');//壓縮css檔案插件
...
...
// 優化項
optimization: {
// 壓縮檔案
minimizer: [
new OptimizeCss()
]
}
注意:壓縮檔案要在生産環境下才生效,是以要将mode改成production,不過webpack預設就是production
mode: 'production', //預設production 生産環境會将js代碼壓縮
至此打包出來的css檔案就是壓縮後的,但你會發現js檔案并沒有壓縮,這是因為使用了css壓縮插件後還要使用js壓縮插件uglifyjs-webpack-plugin才會進行js檔案壓縮。
npm install uglifyjs-webpack-plugin --save-dev
同樣使用webpack插件套路,先引入再執行個體化,然後在剛才的優化項上加入
const Uglifyjs = require('uglifyjs-webpack-plugin');//壓縮js檔案插件
...
...
// 優化項
optimization: {
// 壓縮檔案
minimizer: [
new OptimizeCss(), //壓縮css檔案
new UglifyJsPlugin({ //壓縮js檔案
cache: true, //是否使用緩存
parallel: true, //并發打包,一起壓縮多個
sourceMap: true //源碼映射,便于調試
})
]
}
至此js、css檔案就都可以打包壓縮了。
處理圖檔
需要 file-loader、url-loader 兩個loader
npm install file-loader url-loader --save-dev
在webpack.config.js中加入一個loader規則
//處理圖檔
{
test: /\.(jpg|png|gif)$/,
use: {
loader: 'url-loader', // url-loader會自動調用file-loader
options: {
limit: 8192, //圖檔小于8k的就轉成base64
outputPath: 'images/'//打包到images目錄下
}
}
}
watch實時打包
雖然平時一般都會用webpack-dev-server進行開發測試,但如果你想實時看到打包後的檔案的話,npm run build 打包之後檔案生成指令行就會停止,我們更改代碼後又要重新 npm run build 打包,如果我們想一直監控代碼變化自動進行實時打包可以加一個 watch 配置
//與plugins、module同級
watch: true,
watchOptions: {
poll: 1000, //每秒1000次
aggregateTimeout: 500, //防抖
ignored: /node_modules/ //忽略
}
這裡主要說說熱更新
先在devServer選項中加入 hot: true
引入webpack const webpack = require('webpack');
在plugins選項中添加插件 new webpack.HotModuleReplacementPlugin()
最後再入口js檔案中加入
//熱更新
if(module.hot){
module.hot.accept();
}
配置熱更新的文章
webpack.config.js檔案
const HtmlWebpackPlugin = require('html-webpack-plugin'); //生成html檔案插件
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');
const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin'); //獨立打包成css檔案插件
module.exports = {
mode: 'development', //預設production 生産環境會将代碼壓縮
//入口檔案
entry: './src/main.js',
//出口檔案
output: {
filename: 'bundle.js', //打包後檔案
path: __dirname + '/dist' //打包路徑,絕對路徑
},
//開發服務webpack-dev-server
devServer: {
compress: true, //伺服器壓縮
host: 'localhost',
port: 3000,
open: true,
hot: true //熱更新
},
//插件
plugins: [
//熱更新
new webpack.HotModuleReplacementPlugin(),
//打包前先清空目錄,非必須
// new CleanWebpackPlugin(['./dist']),
//打包目錄下生成html檔案
new HtmlWebpackPlugin({
template: './src/index.html', //模闆檔案
minify: {
collapseWhitespace: true //折疊空格
}
}),
//獨立打包成css檔案
new ExtractTextWebpackPlugin({
filename: 'css/index.css',
disable: true //開發環境下禁用,為了樣式熱更新
})
],
//加載器
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextWebpackPlugin.extract({
fallback: 'style-loader', //開發環境下,為了樣式熱更新
use: ['css-loader']
})
},
{
test: /\.less$/,
use: ExtractTextWebpackPlugin.extract({
fallback: 'style-loader', //開發環境下,為了樣式熱更新
use: ['css-loader', 'less-loader']
})
}
]
},
}
babel
如果項目中用到es6文法,那麼還需要配置一下babel,在項目根目錄建立 .babelrc 檔案
上面提到的babel依賴包第一套可以了解為文法轉換器,第二套可以了解為文法轉換的标準規範,二者缺一不可。
注意:babel7.0之後,包名更新為 @babel/core、@babel/preset-env、@babel/plugin-transform-runtime 等如此。
npm install babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime --save-dev
webpack.config.js中加入一個loader規則
{
test: /\.js$/, //js檔案babel處理
use: ['babel-loader'],
include: path.resolve(__dirname, 'src'),//src目錄下的js檔案需要被loader 處理
exclude: /node_modules/
}
.babelrc
{
"presets": [
"@babel/preset-env"
],
"plugins": [
"@babel/plugin-transform-runtime"
]
}