一、loader
1.1-Less样式处理
less-loader 把less语法转换成css
npm install less less-loader --save-dev
完整代码
src/css/index.less
html{
body{
background: blue;
.ele{
background-color: #fff;
}
}
}
src/index.js
import css from "./css/index.less";
let ele = `<div class=${
css.ele}>css module</div>`;
document.write(ele);
webpack.config.js
const path = require("path");
module.exports = {
entry:"./src/index.js",
mode:"development",
output:{
clean: true, ------- 相当于插件 clean-webpack-plugin
path:path.resolve(__dirname,"./dist"),
filename:"[name].js"
},
module:{
rules:[
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
css预处理,并且开启css模块化
{
test: /\.less$/i,
use: [
"style-loader",
{
loader:"css-loader",
options: {
modules: true, 启用/禁用CSS模块及其配置,默认不开启
},
},
"less-loader"],
},
]
}
}
dist/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="./main.js"></script>
</body>
</html>
页面效果
{
test: /\.less$/i,
use: ["style-loader","css-loader","less-loader"],
},
loader有顺序,从右到左,从下到上
- loader 处理理webpack不不⽀支持的格式⽂文件,模块
- 一个loader只处理理⼀件事情
- loader有执⾏行行顺序
1.2-postcss 样式自动添加前缀
1.在webpack中需要处理css必须先安装如下两个loader
npm install --save-dev css-loader style-loader
2. 要处理less和添加浏览器前缀需要下载如下插件和loader
npm install less less-loader --save-dev
postcss-loader autoprefixer postcss 处理浏览器兼容,添加浏览器前缀
npm install --save-dev postcss-loader autoprefixer postcss
3.如下配置
** postcss-loader 放在 css-loader 之前
4.新建postcss.config.js
完整代码
webpack.config.js
const path = require("path");
module.exports = {
entry:"./src/index.js",
mode:"development",
output:{
// clean: true,
path:path.resolve(__dirname,"./dist"),
filename:"[name].js"
},
module:{
rules:[
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.less$/i,
use: [
style-loader 把CSS插入到DOM中。
"style-loader",
css-loader 会处理 import / require() , @import / url 引入的内容。
{
loader:"css-loader",
options: {
modules: true,//启用/禁用CSS模块及其配置,默认不开启
},
},
postcss-loader 添加浏览器前缀
{
loader: "postcss-loader",
},
less-loader 将 Less 编译为 CSS
"less-loader"
],
},
]
}
}
postcss.config.js
const autoprefixer = require("autoprefixer");
module.exports = {
plugins: [
// postcss 使用 autoprefixer 添加前缀的标准
/**
* last 2 versions 兼容最近的两个版本
* ios 14 13
*
*
* >1%
* 全球浏览器的市场份额 大于1%的浏览器
*/
autoprefixer({
overrideBrowserslist: ["last 2 versions", ">1%"],
})
],
}
1.3-file-loader 处理理静态资源模块
- 原理:是把打包入口中识别出的资源模块,移动到输出目录,并且返回一个地址名称
- 场景:就是当我们需要模块,仅仅是从源代码挪移到打包目录,就可以使用file-loader来处理,txt,,svg , csv , excel , 图片资源等等
npm install file-loader --save-dev
案例:
webpack.config.js
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
loader: 'file-loader',
options: {
name:"[name]_[hash:6].[ext]",
outputPath:"images/"
},
},
]
}
src/index.js
import pic from "./images/tu.jpg";
// 图片、txt、word等资源文件
var img = new Image();
//图片路径 pic
img.src = pic;
var root = document.getElementById("root");
root.append(img);
dist/index.html
<div id="root"></div>
<script src="./main.js"></script>
页面效果
1.4-file-loader 处理第三方字体
1.5-url-loader 将文件转换为 base64 URI
url-loader
功能类似于 file-loader
, 但是在文件大小
(单位为字节
)低于
指定的限制
时,可以返回一个 DataURL
。
npm install url-loader --save-dev
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
loader: 'url-loader', file-loader 替换为 url-loader
options: {
name:"[name]_[hash:6].[ext]",
outputPath:"images/",
推荐使用 url-loader 因为 url-loader 支持 limit
推荐小体积的图片资源转成 base64
图标库 iconfont 适合
logo 不适合 因为转成base64,字符串长度太长,增加js的体积
低于指定的限制时,可以返回一个 DataURL。
limit: 210 * 1024, 单位是字节 1024 = 1kb
},
},
]
}
二、plugins
2.1-HtmlWebpackPlugin 生成html文件
该插件将为您生成一个HTML5文件
npm install --save-dev html-webpack-plugin
2.1.1-在src下创建index.html ,模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
2.1.2-删除dist文件夹
2.1.3-执行构建
会生成一个包含以下内容的dist/index.html
2.1.4-查看结果
完整代码
webpack.config.js
module.exports = {
......
plugins: [new HtmlWebpackPlugin(
{
//选择html模板
template: './src/index.html',
filename:"index.html"
}
)],
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script defer src="main.js"></script></head>
<body>
<div id="root"></div>
</body>
</html>
* title
* filename
* template
* inject
* favicon
* minify
* hash
* cache
* showErrors
* chunks
* chunksSortMode
* excludeChunks
配置中的title
webpack.config.js
module.exports = {
......
plugins: [
new htmlWebpackPlugin({
title: "My App",
filename: "app.html",
template: "./src/index.html"
})
]
}
src/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <title>Document</title> -->
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
页面效果
2.2-mini-css-extract-plugin CSS样式抽离
把所有样式包括css、less都打包到一个css文件 common.css中,然后再 link 进页面。
npm install --save-dev clean-webpack-plugin
webpack.config.js
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
new MiniCssExtractPlugin({
//filename: "[name][chunkhash:8].css"
filename: "css/[name].css"
});
npx webpack
三 、sourceMap
源代码与打包后的代码的映射关系,通过sourceMap定位到源代码。
在dev模式中,默认开启,关闭的话 可以在设置为mode:“production”
- eval:速度最快,使用eval包裹模块代码
- source-map:产生
.map
文件 - cheap:较快,不包含列信息
Moudle:第三方模块,包含loader的sourcemap
inline:将.map
作为DataURI嵌入,不生成单独的.map
文件
配置推荐:
devtool:"cheap-module-eval-source-map",// 开发环境配置
//线上不不推荐开启
devtool:"cheap-module-source-map", // 线上⽣生成配置
mode:"development"
mode:"production"
- 定位的报错是构建之后的bundle文件,不是源文件,不能帮助快速定位错误
- 那么打包完成之后我们开发的时候如何调试代码呢?
- 我们可以通过配置devtool生成map,来使调试变得更简单。
- map其实就是源文件和打包后生成文件的一种映射。
mode: "production",
devtool:"source-map",
mode: "production",
devtool:"inline-source-map",
.map文件没有了
打开 bundle文件main.js,可以看到base64,这一串就是source map,
四、webpack-dev-server 开发服务器
为什么要用webpack-dev-server
- 在开发中,我们都可以发现仅仅使用Webpack以及它的命令行工具来进行开发调试的效率并不高,
- 每次编写好代码之后,我们需要执行npm run build命令更新js文件,然后再刷新页面,才能看到更新效果。
- webpack-dev-server正好解决了这个问题,是一款便捷的本地开发工具。
webpack 5 与 webpack-dev-server 3兼容性问题
报错:Error: Cannot find module ‘webpack-cli/bin/config-yargs’
webpack-cli 4.5.0 和 webpack-dev-server 3.11.2 不兼容
解决方法
卸载webpack-cli4.5.0,webpack-cli的版本降为3.3.12
npm uninstall webpack-cli
npm i [email protected] -D
1.package.json
"scripts": {
"server": "webpack-dev-server",
},
2.webpack.config.js
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true,
port: 8080,
},
plugins: [
new htmlWebpackPlugin({
title: "My App",
filename: "index.html",
template: "./src/index.html"
})
],
app.html 改为 index.html
3.
npm run server
修改代码直接看到效果,浏览器端帮我们刷新,提升开发效率
五、完整代码
webpack.config.js
const path = require("path");
// const htmlWebpackPlugin = require('html-webpack-plugin');
const htmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./src/index.js",
mode: "development",
// mode: "production",
output: {
clean: true,
path: path.resolve(__dirname, "./dist"),
filename: "[name].js"
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
//
//
/**
* 1.在webpack中需要处理css必须先安装如下两个loader
* npm install --save-dev css-loader style-loader
*
* 2. 要处理less和添加浏览器前缀需要下载如下插件和loader
* npm install less less-loader --save-dev
*
* postcss-loader autoprefixer postcss 处理浏览器兼容,添加浏览器前缀
* npm install --save-dev postcss-loader autoprefixer postcss
*
*
* 3.如下配置
* postcss-loader 放在 css-loader 之前
*
*
* 4.新建postcss.config.js
*
*/
{
test: /\.less$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
modules: true,//启用/禁用CSS模块及其配置,默认不开启
},
},
{
loader: "postcss-loader",
},
"less-loader"],
},
{
test: /\.(png|jpe?g|gif)$/i,
loader: 'url-loader', // file-loader 替换为 url-loader
options: {
name:"[name]_[hash:6].[ext]",
outputPath:"images/",
//推荐使用 url-loader 因为 url-loader 支持 limit
//推荐小体积的图片资源转成 base64
//图标库 iconfont 适合
//logo 不适合 因为转成base64,字符串长度太长,增加js的体积
//低于指定的限制时,可以返回一个 DataURL。
limit: 210 * 1024, //单位是字节 1024 = 1kb
},
},
]
},
// devtool:"source-map",
devServer: {
/**
* contentBase:告诉服务器内容的来源。仅在需要提供静态文件时才进行配置
*
* 当开启webpack-dev-server的时候,服务器的目录指向 dist
*
* 可以是相对路径
* contentBase:"./dist"
*
* contentBase: path.join(__dirname, 'public'),
*
*
* contentBase: [
* path.join(__dirname, 'public'),
* path.join(__dirname, 'assets'),
* ]
*/
// contentBase: path.join(__dirname, 'dist'),
contentBase:"./dist",
/**
* open :告诉dev-server在服务器启动后打开true浏览器。
*
* open: true, 打开默认浏览器
*
* open: 'Google Chrome',
*
*/
open:true,
compress: true,
//port 指定端口号
port: 8080,
},
plugins: [
new htmlWebpackPlugin({
title: "My App",
filename: "index.html",
template: "./src/index.html"
})
],
}
postcss.config.js
const autoprefixer = require("autoprefixer");
module.exports = {
plugins: [
// postcss 使用 autoprefixer 添加前缀的标准
/**
* last 2 versions 兼容最近的两个版本
* ios 14 13
*
*
* >1%
* 全球浏览器的市场份额 大于1%的浏览器
*/
autoprefixer({
overrideBrowserslist: ["last 2 versions", ">1%"],
})
],
}
src/css/index.css
body{
background:red;
}
src/css/index.less
html{
body{
background: blue;
.ele{
display: flex;//css3的属性 https://caniuse.com/ 使用caniuse检测
background-color: #fff;
}
}
}
src/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <title>Document</title> -->
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
src/index.js
import "./css/index.css";
//------------ less-------------------
import css from "./css/index.less";
let ele = `<div class=${
css.ele}>css module</div>`;
document.write(ele);
//----------------img-----------------------------------
import pic from "./images/tu.jpg";
// 图片、txt、word等资源文件
var img = new Image();
//图片路径 pic
img.src = pic;
var root = document.getElementById("root");
root.append(img);
//---------------sourceMap---------------------------------------
//故意写错
console.log("css")