前言
最近发现大部分程序员对webpack的理解都基于各种框架给我们设置好的配置,没有去深入了解,包括我自己本身,于是打算自己分享一下自己学习webpack配置的过程。第一章节介绍了:
- webpack的安装
- webpack-dev-server的使用
- 编译css,scss文件
- 编译js文件
- 编译图片,字体文件
安装webpack
//安装
npm install webpack webpack-cli -D
//在项目根目录创建配置文件webpack.config.js
//也可以自定义配置文件名,例如开发环境一个webpack.dev.js,生产环境一个webpack.prod.js
// 执行打包命令
webpack //这是使用默认配置文件
webpack --config webpack.prod.js //这是使用自定义配置文件
//webpack打包命令,一般配置在package.json文件的scripts参数中
{
"name": "css",
"version": "1.0.0",
"scripts": {
"build": "webpack",
"build": "webpack --config webpack.prod.js",
"watch": "webpack --watch",
}
}
监听文件变化,自动更新编译后的文件
// 第一种方法,利用watch,这种方法有一个弊端,需要手动刷新浏览器
// package.json
{
"name": "css",
"version": "1.0.0",
"scripts": {
"watch": "webpack --watch"
}
}
// 第二种方法 使用webpack-dev-server
npm install webpack-dev-server -D
// package.json
{
"name": "css",
"version": "1.0.0",
"scripts": {
"dev": "webpack-dev-server --config webpack.dev.js --open"
}
}
// 配置文件webpack.dev.js
const webpack = require('webpack')
const path = require('path')
module.exports = {
plugins: [
new webpack.HotModuleReplacementPlugin() //热替换插件
],
devServer: {
host: "0.0.0.0",// 可以用本地ip地址访问
hot: true, //启用 webpack 的模块热替换特性
open: true, //自动打开浏览器
contentBase: path.join(__dirname, "dist"), //告诉服务器从哪里提供内容。只有在你想要提供静态文件时才需要。可以配置多个路径,用数组
proxy: { // 配置跨域
"/api": {
target: "http://localhost:3000",
pathRewrite: {"^/api" : ""}
}
}
}
};
解析scss文件和css文件
- 编译后的css利用style标签插入到页面head中
// 安装 style-loader css-loader sass-loader node-sass后两个是编译scss文件的
npm install style-loader css-loader sass-loader node-sass -D
npm install html-webpack-plugin -D
// webpack.config.js
// 使用下面的@type注释,可以让vscode给你自动提示webpack的参数
/** @type {import('webpack').Configuration} */
// 根据模板html生成html
const HtmlWebpackPlugin = require("html-webpack-plugin");
const path = require('path')
module.exports = {
entry: "./src/main.js", // 入口文件
mode: "development", // 开发模式
output: {
path: path.join(__dirname, 'dist'), //输出路径
filename: "app.js",
},
module: {
rules: [
{
test: /\.scss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, "index.html"),
filename: "index.html"
}),
],
};
- 把css文件单独提取出来,利用link引入到页面中
// 安装 css-loader sass-loader node-sass后两个是编译scss文件的
npm install css-loader sass-loader node-sass -D
npm install html-webpack-plugin -D
npm install mini-css-extract-plugin -D
npm install optimize-css-assets-webpack-plugin -D
// webpack.config.js
// 提取css为单独的css文件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 减少css体积
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
// 根据模板html生成html
const HtmlWebpackPlugin = require("html-webpack-plugin");
const path = require('path')
module.exports = {
entry: "./src/main.js",
mode: "development",
output: {
path: path.join(__dirname, 'dist'),
filename: "app.js",
},
module: {
rules: [
{
test: /\.scss$/,
use: [
// "style-loader",
MiniCssExtractPlugin.loader,
"css-loader",
"sass-loader"
],
},
{
test: /\.css$/,
use: [
// "style-loader",
MiniCssExtractPlugin.loader,
"css-loader"
],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: 'index.css'
}),
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano') // 用于优化\最小化CSS的CSS处理器
}),
new HtmlWebpackPlugin({
template: path.join(__dirname, "index.html"),
filename: "index.html"
}),
],
};
解析js文件
// 安装babel插件
npm install babel-loader @babel/core @babel/preset-env -D
// 创建.babelrc文件
{
"presets": [
"@babel/preset-env"
]
}
// webpack.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin");
const path = require('path')
module.exports = {
entry: './src/main.js',
mode: 'development',
output: {
path: path.join(__dirname, 'dist'),
filename:'app.js'
},
module: {
rules: [
{
//文件后缀
test: /\.js$/,
use: "babel-loader",
//不需要编译的文件
exclude:/(node_modules)/
}
]
},
devtool: 'source-map', // 生成map文件,方便直接定位错误
plugins:[
new HtmlWebpackPlugin({
template: path.join(__dirname, 'index.html'),
filename: 'index.html',
inject: true, // 打包后的js文件放到body最后面
minify: false // 不压缩
})
]
}
解析图片字体文件
// 解析js里面的图片文件和css里面的字体文件
npm install file-loader -D
// 解析html里面的图片,视频文件
npm install html-withimg-loader -D
// webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
/** @type {import('webpack').Configuration} */
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
},
mode: 'development',
module: {
rules: [
{
test: /.(png|jpg|gif|jpeg)$/,
use:{
loader: 'file-loader',
options:{
outputPath: 'img/', // 图片输出后的文件夹
esModule: false // 配合html-withimg-loader插件用
}
}
},
{
test: /.(woff|woff2|eot|ttf|otf|TTF)$/,
use: 'file-loader'
},
{
test: /.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /.js$/,
use: 'babel-loader'
},
{
test: /.(htm|html)$/,
use: 'html-withimg-loader' // 让html里面引用的图片也可以编译到
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, 'index.html'),
filename: 'index.html',
inject: true,
minify: false
})
]
}