GitHub 完整配置檔案地址: https://github.com/yhtx1997/webpack4-Instance
由於篇幅過長分三次釋出,建議按順序看
資源配置篇
資源配置篇
- ES6 -> ES5
- 提取 css 到單獨檔案
- css 瀏覽器相容字首補全
- css 程式碼壓縮
- 使用 sass
- 使用 HTML 模板
- 清理舊的打包檔案
靜態資源載入與解析
通過下面的配置
可以在 js 裡引入相應的檔案,然後進行解析
也可以直接解析相應的檔案
配置 babel 將 ES6 轉換為相容性語法(低版本語法 ES5 或 ES3)
安裝 babel-loader
npm install -D babel-loader @babel/core @babel/preset-env
複製程式碼
- babel-loader:使用 Babel 轉換 JavaScript 依賴關係的 Webpack 載入器
- @babel/core: 將 ES6 程式碼轉換為 ES5
- @babel/preset-env: 決定使用哪些 api 為舊瀏覽器提供現代瀏覽器的新特性
module: {
rules: [
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
複製程式碼
載入 css
安裝提取 css 相關的 npm 包
npm install style-loader css-loader -D
複製程式碼
提取 css 相關配置
const path = require('path');
module.exports = {
entry: {
2048: './src/js/2048.js',
1024: './src/js/1024.js',
512: './src/js/512.js'
},
output: {
filename: "[name].js",
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/, //匹配所有以 .css 為字尾的檔案
use: [//使用以下loader來載入
'style-loader',
'css-loader'
]
}
]
}
}
複製程式碼
安裝 sass
開發 css 現在多數使用 sass 和 lass ,所以配置下 sass
相應的安裝 lass 只需要把 sass-loader 切換為 less-loader
npm install sass-loader node-sass -D
複製程式碼
配置
{
test: /\.scss$/,
use: [
"style-loader",
"css-loader",
"sass-loader"
]
}
複製程式碼
CSS 分離成檔案
方案一 安裝 extract-text-webpack-plugin
方案一簡單寫下,推薦方案二
npm install extract-text-webpack-plugin -D
複製程式碼
- extract-text-webpack-plugin 提取 css 到單獨檔案 配置
const ExtractTextPlugin = require("extract-text-webpack-plugin");
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title:'2048',
template: './src/index.html',
minify:true,
hash:true
}),
new ExtractTextPlugin({
filename: 'css/[name].css'
}),
],
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: ["css-loader","sass-loader"]
})
},
]
}
複製程式碼
方案二 安裝 MiniCssExtractPlugin 推薦
與extract-text-webpack-plugin相比
- 非同步載入
- 沒有重複的編譯(效能)
- 更容易使用
- 特定於CSS
npm install mini-css-extract-plugin postcss-loader autoprefixer postcss optimize-css-assets-webpack-plugin -D
複製程式碼
- mini-css-extract-plugin 提取 css 到單獨檔案
- autoprefixer 瀏覽器相容字首補全(例如 -webkit-)
- optimize-css-assets-webpack-plugin 程式碼壓縮 配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
optimization: {
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: true // set to true if you want JS source maps
}),
new OptimizeCSSAssetsPlugin({})
]
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title:'2048',
template: './src/index.html',
minify:true,
hash:true
}),
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "css/[name].css"
})
],
module: {
rules: [
{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader',
]
},
]
}
複製程式碼
這裡需要注意的是需要新建一個 postcss.config.js 檔案,用來配置自動加字首
module.exports={
plugins: [
require('autoprefixer')({ /* ...options */ })
]
}
複製程式碼
載入資料
資料檔案包括 JSON 檔案,CSV、TSV 和 XML
JSON 預設就是支援的,所以如果需要處理剩下的使用下面的方法就可以了
安裝提取 資料 相關的 npm 包
npm install csv-loader xml-loader -D
複製程式碼
安裝提取 資料 相關的 npm 包
{
test: /\.(csv|tsv)$/,
use: [
'csv-loader'
]
},
{
test: /\.xml$/,
use: [
'xml-loader'
]
}
複製程式碼
載入其他資源
載入其他靜態資源都可以使用 file-loader 來載入
npm install file-loader -D
複製程式碼
載入圖片
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
}
複製程式碼
載入字型
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: [
'file-loader'
]
}
複製程式碼
設定 HtmlWebpackPlugin
當我們真正應用我們寫的程式碼時,需要我們新建 HTML ,並且需要我們手動的在 HTML 裡引入,使用 HtmlWebpackPlugin 可以讓我們不用每次都新建 HTML 以及 手動去引入我們的程式碼
它會幫我們每次執行 webpack 時新建一個 HTML 並引入所有打包好的 js css
安裝
npm install html-webpack-plugin -D
複製程式碼
配置 HTML 模板
const HtmlWebpackPlugin = require('html-webpack-plugin');//引入HtmlWebpackPlugin
//官網是將其放到了入口 entry 與出口 output 之間
plugins: [
new HtmlWebpackPlugin({
title: 'Output Management',//表示 HTML title 標籤的內容
template: './src/index.html',//表示模板路徑
minify: true,//壓縮程式碼
hash: true//加上雜湊值來達到去快取的目的
})
]
複製程式碼
清理 ./dist 資料夾
如果我們使用了雜湊值來命名我們的檔案,那麼每次更該內容都會生成新的檔案,同時舊的檔案依然存在,這樣的話一個是亂,一個是浪費
我們可以使用 CleanWebpackPlugin 在每次打包時都會將之前的舊檔案清除掉
安裝
npm install clean-webpack-plugin -D
複製程式碼
配置
const CleanWebpackPlugin = require('clean-webpack-plugin');
plugins: [
new CleanWebpackPlugin(['dist']),//刪除dist
new HtmlWebpackPlugin({
title: 'Output Management',//表示 HTML title 標籤的內容
template: './src/index.html',//表示模板路徑
minify: true,//壓縮程式碼
hash: true//加上雜湊值來達到去快取的目的
})
]
複製程式碼