文章目录
webpack-note
webpack功能
- 将多个文件合并(打包),减少http请求,提高效率
- 对代码进行编译,消除浏览器的兼容性
- 对代码进行压缩,减少文件体积,提高加载速度,降低带宽的流量消耗
- 检测代码质量,提高开发效率
- 针对不同环境,提供不同的打包策略
安装环境
npm install webpack webpack-cli -D
npx webpack ./src/index.js --output-path ./dist --mode=development
初始环境配置
在根目录下新建webpack.config.js
拥有以下基本属性
const {resolve}=require('path')
module.exports={
//模式development,production
mode:'development',
//入口文件
entry:'./src/index.js',
//出口文件
output:{
//如果不指定输出目录,那么默认是dirst
//输出目录必须是绝对路径
path:resolve(__dirname,'output')
//指定输出的文件名称
filename:'bundle.js'
},
//模块配置
module:{
rules:[
//支配多个规则
]
},
//开发服务器(虚拟服务器)!!!!
devServer:{}
//插件配置
plugins:[]
}
匹配css,less,sass等
匹配css文件
-
npm i style-loader css-loader -D
-
module:{ rules:[ test:/\.css$/i, use:[ //use规则从下到上调用 //style-loader负责把css内容的js代码挂载到页面的style标签中 'style-loader', //css-loader负责遍历src的所有css文件,将css打包到输出目录 'css-loader' ] ] }
-
npx webpack
匹配less文件和sass文件和上面类似
MiniCssExtractPlugin
将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件
npm install --save-dev mini-css-extract-plugin
1.安装插件
2.在webpack.config.js中
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
plugins: [new MiniCssExtractPlugin({
filename:'css/[name].css'
})],
module: {
rules: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
};
3.在js文件中
import './src/style.css'
4.npx webpack
CssMinimizerWebpackPlugin
优化和压缩 CSS
npm install css-minimizer-webpack-plugin --save-dev
1.安装插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /.s?css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
],
},
//如果在开发者模式下想要压缩css文件需添加下面参数
optimization: {
minimizer: true
},
plugins: [new MiniCssExtractPlugin()],
};
3.npx webpack
stylelint
帮助你在样式代码中避免错误并强制规范
npm install stylelint@13.13.1 stylelint-config-standard@22.0.0 stylelint-webpack-plugin@2.1.1 -D
1.在package.json添加配置
{
"stylelint": {
"extends": "stylelint-config-standard"
},
}
2.在webpack.config.json中
const StylelintPlugin=require('stylelint-webpack-plugin')
module.exports = {
plugins: [new StylelintPlugin({
//指定那些格式文件进行css校验
files:['src/css/*.{css,less,sass,scss}'],
//尽可能自动修复不合规范的格式
fix:true
})],
};
3.npx webpack
postcss-loader
使用 PostCSS
处理 CSS 的 loader,兼容个平台css
npm install postcss-loader autoprefixer -D
1.安装插件
2.创建.browerslistrc
# 注释是这样写的,以#号开头
last 1 version #最后的一个版本
> 1% #代表全球超过1%使用的浏览器
3.创建根目录postcss.config.js
module.exports={
plugins:[
require('autoprefixer')
// 'postcss-preset-env'
]
}
4.在webpack.config.js中
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
plugins: [new MiniCssExtractPlugin({
filename:'css/[name].css'
})],
module: {
rules: [
{
test: /\.css$/i,
//postcss-loader要加在css-loader后(逻辑上是前)
//也就是要先处理postcss-loader再处理css-loader
use: [MiniCssExtractPlugin.loader, "css-loader","postcss-loader"],
},
],
},
};
5.npx webpack
HtmlWebpackPlugin
可以让该插件为你生成一个 HTML 文件,使用 lodash 模板提供模板,或者使用你自己的 loader。
npm install --save-dev html-webpack-plugin
1.安装插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
entry: 'index.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'index_bundle.js',
},
plugins: [new HtmlWebpackPlugin({
//指定模板
template:'./src/index.html',
//文件名
filename:'index.html',
//标题
title:'xxx',
//如果在开发者模式下也想压缩html文件,可以使用minify
minify:{
collapseWhitespace: true,
keepClosingSlash: true,
removeComments: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
}
})],
};
3.在html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= HtmlWebpackPlugin.options.title %></title>
</head>
<body>
</body>
</html>
CopyWebpackPlugin
将已存在的单个文件或整个目录复制到生成目录。
npm install copy-webpack-plugin --save-dev
1.安装插件
2.目录结构
D:\webpackDemo
├─package.json
├─webpack.config.js
├─ouput
├─node_modules
├─src
├─public
├─favicon.ico
├─index.js
3.webpack.config.js
const CopyWebpackPlugin=require('copy-webpack-plugin')
module.exports = {
plugins: [new CopyWebpackPlugin({
patterns:[
{
// 从src的public
from:'./src/public',
// 到output的public
to:'public'
}
]
})],
};
4.npx webpack
clean-webpack-plugin
一个 webpack 插件,用于删除/清理您的构建文件夹。
npm install --save-dev clean-webpack-plugin
1.安装插件
2.在webpack.config中
//注意只能使用解构的方式
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
plugins: [new CleanWebpackPlugin()],
};
3.npx webpack
babel-loader
此 package 允许你使用 Babel 和 webpack 转译 JavaScript
文件,使之兼容es6+基础语法。
npm install babel-loader @babel/core @babel/preset-env -D
1.安装插件
2.webpack.config.js中
module.exports = {
module:{
rules:[
{
test:/\.m?js$/i,
//针对src的所有文件,在内部进行转换语法,src的js代码不变
//除了node_module目录里的文件,其他目录都要进行转换
exclude:/node_module/,
use:{
loader:'babel-loader',
options:{
presets:[
'@babel/preset-env'
]
}
}
}
]
}
};
3.npx webpack
@babel/polyfill
兼容js更高阶的语法,要在js es6+基本语法配置完整基础上,也就是上面的配置也要进行完善,但是会把其规范内的全部转义,体积大不推荐
npm install @babel/polyfill -D
1.安装插件
2.在index.js中
import '@babel/polyfill'
3.npx webpack
core-js
按需转义js高阶语法,也要在js es6+基本语法配置完整基础上
npm install core-js -D
1.安装插件
2.webpack.config.js
module.exports = {
module:{
rules:[
{
test:/\.m?js$/i,
//针对src的所有文件,在内部进行转换语法,src的js代码不变
//除了node_module目录里的文件,其他目录都要进行转换
exclude:/node_module/,
use:{
loader:'babel-loader',
options:{
presets:[
'@babel/preset-env',
{
//按需加载
useBuiltIns:'usage',
//指定core.js版本
//和package.json一致
corejs:{
version:3
}
}
]
}
}
}
]
}
};
3.注意:index.js里的import '@babel/polyfill’要删掉
eslint
对js文件进行校验
npm install eslint eslint-config-airbnb-base eslint-webpack-plugin eslint-plugin-import -D
eslint:对js进行格式校验
eslint-config-airbnb-base:包含格式校验规则
eslint-webpack-plugin:webpack插件
eslint-plugin-import:读取eslint配置项配置
1.在package.json中
{
"eslintConfig": {
"extends": [
"airbnb-base"
],
"rules": {
"no-undef": "off",
"no-console": "off",
"no-unused-vars": "off"
}
}
}
2.在webpack.config.js中
const EsLintPLugin=require('eslint-webpack-plugin')
module.exports = {
plugins: [new EsLintPLugin({
//指定要校验的文件后缀
extension:['js','json'],
exclude:'/node_modules/',
//尽可能校验
fix:true
})],
};
file-loader
将文件发送到输出目录
npm install file-loader --save-dev
1.index.js
import img from './file.png';
2.webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader',
},
],
type:'javascript/auto'
},
],
},
};
3.npx webpack
url-loader
webpack 的加载器,它将文件转换为 base64 URI
npm install url-loader --save-dev
1.index.js
import img from './file.png';
2.style.css
body{
background:url(./img/file.jpg)
}
3.webpack.config.js(css里的font 文件也可加载)
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'url-loader',
options:{
//限制大小,小于这个大小,图片会被转成base64
limit:8*1024,
name:"[name].[ext]",
//启用commonjs语法,一般加上
esModule:false
}
},
],
type:'javascript/auto'
},
],
},
};
4.注意:一般有问题的话最好再安装以下file-loader
5.npx webpack
asset
webpack5自带的,使用他来加载资源文件,而无需其他loader,加载js,css文件里的资源
1.webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
parser:{
dataUrlCondition:{
maxSize:8*1024
}
},
generator:{
//存放在指定的输出目录的文件夹,并默认名称
filename:"image/[name][ext]"
}
type:'asset'
},
],
},
};
module.exports = {
module: {
rules: [
{
test: /\.(eot|svg|ttf|woff|woff2)$/i,
parser:{
dataUrlCondition:{
maxSize:8*1024
}
},
generator:{
//存放在指定的输出目录的文件夹,并默认名称
filename:"fonts/[name][ext]"
}
type:'asset'
},
],
},
};
html-loader
将 HTML 导出为字符串。当编译器需要时,将压缩 HTML 字符串。
也可使html文件中的一些资源压缩
npm install --save-dev html-loader
1.安装插件
2.webpack.config.js中
module.exports = {
module: {
rules: [
{
test: /\.(htm|html)$/i,
use:{
options:{
esModule:false
}
}
},
],
},
};
webpack-dev-server
为你提供了一个基本的 web server,并且具有 live reloading(实时重新加载) 功能。
npm install --save-dev webpack-dev-server
1.安装插件
2.webpack.config.js中
module.exports={
//开发服务器
devServer:{
//加载的内容的路径
static:resolve(__dirname,'output'),
//启用gzip能够以75%的压缩率来压缩资源
compress:true,
//端口号
port:9999,
//启动热加载(自动更新)
hot:false,
liveReload:true,
//配置代理 重要!!!
proxy:{
'/api':{
//请求的host
//http://localhost:9999/api/users==>https://api.github.com/api/users
// http://api.github.com/api/users=>https://api.github.com/users
target:'https://api.github.com',
pathRewrite:{
'^/api':''
}
},
changeOrigin:true
}
},
//配置目标
target:'web'
}