這是一個 極簡的前端項目,適合新手入門,簡述以下(有詳細說明)node
啓動本地服務 webpack-dev-serverwebpack
處理資源路徑css3
處理 css、scss、lessgit
css3 屬性前綴github
分離css、壓縮分離後的css、淨化分離後的cssweb
babel轉換(babel7.X)npm
新建項目根目錄 文件夾 webpack_demo_basic
進入終端執行 npm init -y
生成 package.json 文件,以下
初始化項目文件,目錄以下
src/css/index.css 文件:css樣式文件
src/less/less 文件:less樣式文件
src/scss/index.scss 文件:scss樣式文件
src/index.html 文件:項目html
src/index.js 文件:項目入口js
.babelrc 文件:項目babel配置文件
.gitignore 文件:git忽略配置文件(使用 Git 版本控制時,須要配置)
package.json 文件:定義了項目所需的模塊,以及項目的配置信息
webpack.config.js 文件:webpack配置文件
安裝 webpack依賴
npm i webpack@4.28.3 webpack-cli@3.2.0 -D
複製代碼
webpack 基礎配置
// webpack.config.js 文件
const path = require('path');
module.exports = {
mode: 'development', // 開發模式
entry: './src/index.js', // 打包後輸出的文件名 爲 main.js
/**
* 或
*
* entry: {
* index: './src/index.js'
* }
*/
output: {
path: path.resolve(__dirname, 'dist'), // 打包後項目 輸出到項目根目錄下 dist 文件夾
filename: '[name].js' // 輸出的 入口JS文件名稱
},
// loader 相關配置
module: {
rules: []
},
// 插件 相關配置
plugins: []
};
複製代碼
插件:html-webpack-plugin
根據模板 生成頁面html
自動引入 JS 等外部資源文件
設置 title 、mate 等標籤內容
優化html(壓縮、緩存、轉換等)
安裝
npm i html-webpack-plugin@3.2.0 -D
複製代碼
配置
// webpack.config.js 文件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 文件名; 默認是index.html
template: './src/index.html', // 指定模板html文件
title: '11111', // html文件 title標籤的內容
inject: true, // 自動引入JS腳本的位置,默認值爲 true(一般默認值便可知足條件)
/*
* 此選項有以下四種值:
*
* true/'body': JS腳本在 body標籤底部 引入
* 'head': JS腳本在 bead標籤底部 引入
* false: 不插入任何JS(幾乎不會用到)
*/
// 以下 一般在生產模式下 才配置
hash: true, // 默認值爲false, 值爲true時,html 引入的腳本、scss都加hash值(清除緩存)
// 建議 生產環境下 設置爲 true
cache: true, // 默認值爲true, 設置緩存
// 建議 生產環境下 設置爲 true
minify: { // 建議 生產環境下 再配置此選項
minifycss: true, // 壓縮css
minifyJS: true, // 壓縮JS
minifyURLs: true, // 壓縮URL
removeComments: true, // 去掉註釋
removeAttributeQuotes: true, // 去掉標籤上 屬性的雙引號
collapseWhitespace: true, // 去掉空行
removeRedundantAttributes: true, // 去掉多餘的屬性
removeEmptyAttributes: true // 去掉空屬性
}
})
]
};
複製代碼
配置說明
服務器:webpack-dev-server
一個小型的 Node.js Express服務器,程序開發時 本地運行項目
安裝
npm i webpack-dev-server@3.1.14 -D
複製代碼
配置
// webpack.config.js 文件
const path = require('path');
module.exports = {
devServer:{
index: 'index.html', // 服務器啓動的頁面(同 html-webpack-plugin 中 filename 選項); 默認值爲 index.html
port: 3000, // 指定端口號; 默認 8080
host: 'localhost', // 指定host; 默認 localhost
/*
* 或
* host: '0.0.0.0', // 可 經過IP 訪問,也能夠經過 localhost 訪問
* useLocalIp: true, // browser open with your local IP
*/
open: true, // 啓動本地服務後,自動打開頁面
compress: true, // 是否啓用 gzip 壓縮
overlay: true, // 編譯器錯誤或警告時, 在瀏覽器中顯示全屏覆蓋; 默認false
progress: true, // 是否將運行進度輸出到控制檯; 默認 false
contentBase: path.resolve(__dirname, 'dist'), // 告訴服務器從哪裏提供內容。只有在你想要提供靜態文件時才須要
// 精簡 終端輸出(本地運行時)
stats: {
modules: false,
children: false,
chunks: false,
chunkModules: false
}
}
};
複製代碼
配置說明
支持熱更新:檢測到項目中修改的代碼,當即在瀏覽器中自動更新
新手需知道:熱更新僅限於項目代碼;webpack 相關的配置不會參與熱更新
精簡終端輸出
關於 精簡終端輸出 詳細講解見以後的文章
小夥伴們能夠對比下,本地運行項目時,有無 stats 選項,終端輸出的變化
熱替換
場景:建議開發環境下使用
好處:局部加載 頁面有改動的地方;加快開發編譯速度
關於 熱替換 詳細講解見以後的文章
在 package.json
中配置相關指令,實現 本地運行、打包項目
終端執行 npm run xxx,就會執行 package.json 裏script對應的 xxx 指令
本地啓動項目
指令配置
// packgae.json 文件
{
"scripts": {
"dev": "webpack-dev-server"
}
}
複製代碼
說明
--progress
、--open
{
"scripts": {
"dev": "webpack-dev-server --progress --open"
}
}
// --progress 表明: 本地啓動項目終端顯示進度
// --open 表明: 運行後瀏覽器自動打開頁面
// 這兩個和 webpack-dev-server 服務器的配置選項 progress、open 達到的效果一致,無需重複配置
複製代碼
--config
{
"scripts": {
"dev": "webpack-dev-server --config webpack/config.js"
}
}
// "dev": "webpack-dev-server"` 默認去找 根目錄下名爲 `webpack.config.js` 的webpack配置文件,進行打包、運行
// 若是有場景要自定義 webpack 配置文件名稱/路徑,可使用 --config 指定 webpack 配置文件,如上
複製代碼
項目根目錄下,終端執行 npm run dev
便可本地運行項目
瀏覽地址
http://localhost:3000/
打包項目
// packgae.json
{
"scripts": {
"build": "webpack"
}
}
複製代碼
說明
如上打包會按照 webpack4.X 默認打包機制 進行打包
後續文章會講解 如何自定義打包
項目根目錄下,終端執行 npm run build
便可打包項目,輸出到 根目錄的 dist
文件夾
loader:url-loader、file-loader
解決項目中的路徑問題(不限於 css)
讓 webpack 識別 圖片、視頻、字體 等資源文件
url-loader 是 file-loader 的一個超集
低版本的 url-loader 中封裝了 file-loader,url-loader 的運行 不會依賴file-loader
高版本的 url-loader 在使用時,須要額外安裝 file-loader
url-loader 的 file-loader 區別
url-loader
解決項目中的路徑問題
將 小體積的資源 轉成 base64
讓 webpack 識別 資源文件
file-loader
解決項目中的路徑問題
讓 webpack 識別 資源文件
file-loader 原理淺析
衆所周知,webpack 會將各個模塊打包成一個文件,最終咱們樣式中的 url 路徑是相對入口html頁面的,而不是相對於原始css文件所在的路徑,這就會致使圖片引入失敗
file-loader能夠解析項目中的url(不限於css),會根據配置 將圖片拷貝到相應的路徑,打包時會根據規則修改引入路徑
安裝
npm i url-loader@1.1.2 file-loader@3.0.1 -D
複製代碼
配置
// webpack.config.js 文件
module.exports = {
module: {
rules: [{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 8192, // 文件體積小於 8192kb 時,將被轉爲 base64 資源
name: '[name].[ext]',
outputPath: 'static/assets/' // 資源 輸出路徑
}
}]
}, {
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/' // 資源 輸出路徑
}
}]
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/' // 資源 輸出路徑
}
}]
}]
}
};
複製代碼
說明
以配置中 options.outputPath
爲例,資源將被輸出到 根目錄下 static/assets
文件夾中
loader:html-withimg-loader
解決 html 中的路徑問題,如
img
標籤的路徑問題
webpack 建議全部圖片都使用背景圖的方式,因此默認狀況下 在html中使用
img
標籤,會顯示路徑錯誤
安裝
npm i html-withimg-loader@0.1.16 -D
複製代碼
配置
// webpack.config.js 文件
module.exports = {
module: {
rules: [{
test: /\.(htm|html)$/,
use:[{
loader: 'html-withimg-loader'
}]
}]
}
};
複製代碼
loader: css-loader style-loader
webpack 默認只識別JS文件,要解析打包css 必須安裝相應的loader
安裝
npm i style-loader@0.23.1 css-loader@2.1.0 -D
複製代碼
配置
// webpack.config.js 文件
module.exports = {
module: {
rules: [{
test:/\.css$/,
use: ['style-loader','css-loader']
}]
}
};
複製代碼
loader 相關: sass-loader、node-sass
做爲css預編譯語言,須要 相應的loader進行解析
安裝
npm i node-sass@4.11.0 sass-loader@7.1.0 -D
複製代碼
配置
// webpack.config.js 文件
module.exports = {
module: {
relus: [{
test: /\.scss$/,
use: ['style-loader','css-loader','sass-loader'] // 編譯順序從右往左
}]
}
};
複製代碼
loader 相關: less-loader、less
做爲css預編譯語言,須要 相應的loader進行解析
安裝
npm i less@3.9.0 less-loader@4.1.0 -D
複製代碼
配置
// webpack.config.js 文件
module.exports = {
module: {
relus: [{
test: /\.less$/,
use: ['style-loader','css-loader','less-loader'] // 編譯順序從右往左
}]
}
};
複製代碼
loader 相關: postcss-loader、autoprefixer
針對css3新增的屬性,並非全部瀏覽器都支持
爲兼容不一樣內核的瀏覽器,增長屬性前綴(與內核相對應)
-webkit, -ms, -o, -moz
安裝
npm i postcss-loader@3.0.0 autoprefixer@9.4.4 -D
複製代碼
配置
// 項目根目錄新建 文件postcss.config.js,其中配置以下
module.exports = {
plugins: [
require('autoprefixer')({
"browsers": [
"defaults",
"not ie < 11",
"last 2 versions",
"> 1%",
"iOS 7",
"last 3 iOS versions"
]
})
]
};
複製代碼
// webpack.config.js 文件
// 給 css文件 中的css3屬性自動 加屬性前綴
module.exports = {
module: {
rules: [{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
}]
}
};
複製代碼
// webpack.config.js 文件
// 給 scss文件 中的css3屬性自動 加屬性前綴
module.exports = {
module: {
rules: [{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] // 編譯順序從右往左
}]
}
};
複製代碼
// webpack.config.js 文件
// 給 css文件 中的less屬性自動 加屬性前綴
module.exports = {
module: {
rules: [{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'] // 編譯順序從右往左
}]
}
};
複製代碼
插件:mini-css-extract-plugin
webpack 認爲css應該被打包到JS中,以減小HTTP請求次數
但有的開發團隊,要求 抽離css單獨打包
安裝
npm i mini-css-extract-plugin@0.5.0 -D
複製代碼
配置
// webpack.config.js 文件,抽離css
const MinicssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
module: {
rules: [{
test: /\.css$/,
use: [MinicssExtractPlugin.loader, 'css-loader']
}]
},
plugins: [
new MinicssExtractPlugin({
filename: "static/css/[name].[hash:7].css"
})
]
}
複製代碼
// webpack.config.js 文件,抽離scss
const MinicssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
module: {
rules: [{
test: /\.scss$/,
use: [MinicssExtractPlugin.loader, 'css-loader', 'sass-loader']
}]
},
plugins: [
// 添加一處便可
new MinicssExtractPlugin({
filename: "static/css/[name].[hash:7].css"
})
]
}
複製代碼
// webpack.config.js 文件,抽離less
const MinicssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
module: {
rules: [{
test: /\.less$/,
use: [MinicssExtractPlugin.loader, 'css-loader', 'less-loader']
}]
},
plugins: [
// 添加一處便可
new MinicssExtractPlugin({
filename: "static/css/[name].[hash:7].css"
})
]
}
複製代碼
解決 css抽離後致使的路徑問題
很容易將 css抽離出來,可是抽離出來的css中屬性 引用路徑並不對(緣由淺析:打包後分離出來的css 和 html 不在同一級目錄下)
解決方案:配置資源文件的輸出路徑(相對路徑 改爲 絕對路徑)
// webpack.config.js 配置文件
let publicPath = '';
const isProduction = false; // 是不是生產環境
if (!isProduction) {
publicPath = 'http://localhost:3000/static/assets';
} else {
// 將 publicPath 設置爲線上發佈地址
}
module.exports = {
// loader 相關配置
module: {
rules: [{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 8192, // 文件體積小於 8192kb 時,將被轉爲 base64 資源
name: '[name].[ext]',
outputPath: 'static/assets/', // 資源 輸出路徑
publicPath
}
}]
}, {
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/', // 資源 輸出路徑
publicPath
}
}]
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/', // 資源 輸出路徑
publicPath
}
}]
}]
}
};
複製代碼
插件:optimize-css-assets-webpack-plugin
即便是生產模式下,分離後的css不會被壓縮
使用此插件對css進行壓縮處理
安裝
npm i optimize-css-assets-webpack-plugin@5.0.1 -D
複製代碼
配置
// webpack.config.js 文件
const Optimizecss = require('optimize-css-assets-webpack-plugin');
module.exports = {
plugins: [
new Optimizecss()
]
}
複製代碼
插件:purifycss-webpack、purify-css
對於頁面中沒有使用到的css,打包時能夠經過此插件進行清除
限制:僅限於 清除分離後的css文件中 無用的樣式
安裝
npm i purifycss-webpack@0.7.0 purify-css@1.2.5 -D
複製代碼
配置
// webpack.config.js 文件
const glob = require('glob');
const PurifycssPlugin = require("purifycss-webpack");
module.exports = {
plugins: [
new PurifycssPlugin({
paths: glob.sync(path.join(__dirname, 'src/*.html')),
})
]
};
複製代碼
概述
瀏覽器對 JavaScript 新語法、API、擴展語言的識別能力不一樣
babel 就是 JavaScript 語法編譯器 之一
主要將 ECMAScript 2015+ 的JS代碼轉換成 低版本瀏覽器可識別的 JS 代碼
將 JSX、TypeScript 等JS擴展語言 轉換成 瀏覽器可識別的原生 JS
安裝
npm i babel-loader@8.0.5 @babel/core@7.2.2 @babel/preset-env@7.2.3 @babel/plugin-transform-runtime@7.2.0 @babel/runtime@7.2.0 babel-plugin-transform-remove-console@6.9.4 @babel/plugin-syntax-dynamic-import@7.2.0 -D
複製代碼
配置
下面是 babel 7+ | babel-loader 8+ 的相關配置
方式一:將 babel 的配置項抽離到 .babelrc 文件中(推薦)
// webpack.config.js 文件
const path = require('path');
module.exports = {
module: {
rules: [{
test: /\.js$/,
use: ['babel-loader'],
exclude: /node_modules/, // 排除不要加載的文件夾
include: path.resolve(__dirname, 'src') // 指定須要加載的文件夾
}]
}
};
複製代碼
// .babelrc 文件中 配置
{
"presets": [
[
"@babel/preset-env", // 根據 preset-env 標準進行轉換
{
"modules": false // 不轉換模塊類型
}
]
],
"plugins": [
"@babel/plugin-transform-runtime", // 來處理全局函數和優化babel編譯
"transform-remove-console" // 打包時 移除 console 相關(開發環境下 不須要配置)
],
"comments": false // 打包時 移除腳本中的註釋
}
複製代碼
方式二:直接在 webpack 配置項中 配置(不推薦)
// webpack.config.js 文件
const path = require('path');
module.exports = {
module: {
rules: [{
test: /\.js$/,
use: [{
loader: 'babel-loader',
options: {
{
presets: [
[
"@babel/preset-env", // 根據 preset-env 標準進行轉換
{
"modules": false // 不轉換模塊類型
}
]
],
plugins: [
"@babel/plugin-transform-runtime", // 來處理全局函數和優化babel編譯
"transform-remove-console" // 打包時 移除 console 相關
],
comments: false // 打包時 移除腳本中的註釋
}
}
}],
exclude: /node_modules/, // 排除不要加載的文件夾
include: path.resolve(__dirname, 'src') // 指定須要加載的文件夾
}]
}
};
複製代碼
說明
webpack4.X 在 production
模式下,自動壓縮JS,因此一般狀況下 項目中單獨配置插件壓縮JS的場景很少了
以下兩個插件,能夠壓縮JS
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MinicssExtractPlugin = require("mini-css-extract-plugin");
const Optimizecss = require('optimize-css-assets-webpack-plugin');
const glob = require('glob');
const PurifycssPlugin = require("purifycss-webpack");
let publicPath = '';
const isProduction = false; // 是不是生產環境
if (!isProduction) {
publicPath = 'http://localhost:3000/static/assets';
} else {
// 將 publicPath 設置爲線上發佈地址
}
module.exports = {
mode: 'development',
entry: {
index: './src/index.js'
},
output: {
path: path.resolve(__dirname, 'dist'), // 打包後項目 輸出到項目根目錄下 dist 文件夾
filename: '[name].js' // 輸出的 入口JS文件名稱
},
// loader 相關配置
module: {
rules: [{
test: /\.(htm|html)$/,
use:[{
loader: 'html-withimg-loader'
}]
}, {
test: /\.css$/,
use: [MinicssExtractPlugin.loader, 'css-loader']
}, {
test: /\.scss$/,
use: [MinicssExtractPlugin.loader, 'css-loader', 'sass-loader']
}, {
test: /\.less$/,
use: [MinicssExtractPlugin.loader, 'css-loader', 'less-loader']
}, {
test: /\.js$/,
use: ['babel-loader'],
exclude: /node_modules/, // 排除不要加載的文件夾
include: path.resolve(__dirname, 'src') // 指定須要加載的文件夾
}, {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 8192, // 文件體積小於 8192kb 時,將被轉爲 base64 資源
name: '[name].[ext]',
outputPath: 'static/assets/',
publicPath
}
}]
}, {
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/' // 資源 輸出路徑
}
}]
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
name: '[name].[ext]',
outputPath: 'static/assets/' // 資源 輸出路徑
}
}]
}]
},
// 插件 相關配置
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 文件名; 默認是index.html
template: './src/index.html' // 指定模板html文件
}),
// 分離 css
new MinicssExtractPlugin({
filename: "static/css/[name].[hash:7].css"
}),
// 壓縮分離後的 css
new Optimizecss(),
// 淨化 css
new PurifycssPlugin({
paths: glob.sync(path.join(__dirname, 'src/*.html')),
})
],
devServer:{
index: 'index.html', // 服務器啓動的頁面(同 html-webpack-plugin 中 filename 選項); 默認值爲 index.html
host: 'localhost', // 指定host; 默認 localhost
port: 3000, // 指定端口號; 默認 8080
open: true, // 啓動本地服務後,自動打開頁面
compress: true, // 是否啓用 gzip 壓縮
overlay: true, // 編譯器錯誤或警告時, 在瀏覽器中顯示全屏覆蓋; 默認false
progress: true, // 是否將運行進度輸出到控制檯; 默認 false
contentBase: path.resolve(__dirname, 'dist'), // 告訴服務器從哪裏提供內容。只有在你想要提供靜態文件時才須要
// 精簡 終端輸出(本地運行時)
stats: {
modules: false,
children: false,
chunks: false,
chunkModules: false
}
}
};
複製代碼
小夥伴們,有什麼問題 能夠留言,一塊兒交流哈
接下來,我還會發布幾篇 webpack4.X 實戰文章,敬請關注
我是一名熱衷於編程的前端開發,WX:ZXvictory66