1.webpack
1 webpack5 安装与配置
1.1 全局安装 npm i webpack webpack-cli -g
1.2 查看版本 npx webpack -v
1.3 打包 npx webpack
1.4 打包并显示详细过程 npx webpack --stats detailed
1.5 查看指定webpack配置 npx webpack --help
1.6 设置入口文件(mode:production)npx webpack --entry ./src/index.js
1.7 创建webpack.config.js并基础配置
const path = require('path');
module.exports = {
module.exports ={
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './dist')
},
mode: 'node'
}
}
1.8 文件目录
2 path.join( ) 与 path.resolve( ) 的区别
path.join( ):拼接路径,保持路径之间只有一个“ / ”;
path.resolve( ): 参数从右往左读取并拼接,一旦遇到绝对路径就停止拼接(以“/”或盘符为开头的路径,就会被认作是绝对路径),保证返回一个绝对路径。
3 插件
3.1 官方网站:webpack.org/plugins
Community 社区插件
Webpack 官方插件
Webpack Contrib webpack官方插件
3.2 安装和使用html-webpack-plugin插件
安装:npm i html-webpack-plugin -D
使用:
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugin: [
new HtmlWebpackPlugin({
// html模板文件
template: './index.html',
// 打包生成的html文件名
filename: 'app.html',
// script标签的位置
inject: 'body'
})
]
}
3.2 打包前清理dist文件夹
module.exports = {
output: {
clean: true,
}
}
4 mode
4.1 调试环境模式
development:开发环境
production:生产环境
none:无
4.2 编译方式
在dist/bundle.js文件中,通过eval把压缩成字符串的js代码进行编译
5 devtool
source maps功能,能把编译前的文件映射到浏览器中,更方便快捷找到对应的错误代码行数。
module.exports = {
devtool: 'inline-source-map'
}
6 watch mode
6.1 使用:npx webpack --watch
6.2 功能:每次修改文件后保存,都会触发重新编译打包
7 webpack-dev-server
7.1 安装: npm i webpack-dev-server -D
7.2 配置:
module.exports = {
devServer: {
// 将dist目录下的文件作为web服务器的根目录
static: './dist'
}
}
7.3 使用:npx webpack-dev-server
7.4 注意点:
开启了Hot Module热更新模块
开启了Live Reloading实时加载
不会生成物理的dist打包文件,而是在内存中保留了编译文件,查看本地最新打包文件仍需npx webpack
8 资源模块
8.1 资源模块类型
asset/resource 发送一个单独的文件并导出对应的URL
asset/inline 会导出一个资源的DataURL
asset/source 会导出资源的源代码
asset 依据资源文件大小,在resource和inline之间自动选择
8.2 resource资源
module.exports = {
rules: [
{
test: /.png$/,
type: 'asset/resource'
}
],
output: {
// resource资源存放路径,contenthash文件内容生成的hash值,ext扩展名
assetModuleFilename: 'images/[conetenthash][ext]'
},
// 和assetModuleFilename功能一样,但generator优先级更高
generator: {
filename: 'images/[contenthash][ext]'
}
}
import imgsrc from './assets/img1.png';
const img = document.createElement('img');
img.src = imgsrc;
document.body.appendChild(img);
8.2 inline资源
module.exports = {
rules: [
{
test: /.svg$/,
type: 'asset/inline'
}
],
}
import logoSrc from './assets/webpack_logo.svg'
const img2 = document.createElement('img');
img2.src = logoSrc;
img2.style.cssText = 'width:200px; height:200px';
document.body.appendChild(img2);
8.3 source资源
module.exports = {
rules: [
{
test: /.txt$/,
type: 'asset/source'
}
],
}
import exampleTxt from './assets/example.txt';
const block = document.createElement('div');
block.style.cssText = 'width: 200px; height: 200px';
document.body.appendChild('block');
8.4 asset 通用资源
module.exports = {
rules: [
{
test: /.jpg$/,
type: 'asset',
parse: {
// 不超过4M,都会被编译成inline资源-base64
// 默认是不超过8k
dataUrlCondition: {
maxSize: 4 * 1024 * 1024;
}
}
}
],
}
9 样式文件加载
9.1 说明:让webpack能够解析除js和json以外其它文件的类型
9.2 安装:npm i css-loader style-loader less-loader -D
npm mini-css-extract-plugin css-minimizerPlugin -D
9.3 使用
module.exports = {
rules: [
{
test: /.css$/,
// 逆序读取,先打包,再通过内联方式插入style标签,引入几个样式文件就有几个style标签
use: ['style-loader', 'css-loader']
}
],
}
module.exports = {
rules: [
{
test: /.css$/,
// 逆序读取,先把less编译为css打包
use: ['style-loader', 'css-loader', 'less-loader']
}
],
}
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
module.exports = {
plugins: [
new MiniCssExtractPlugin({
filename: 'style/[contenthash].css'
})
]
rules: [
{
test: /.(css|less)$/,
// 逆序读取, 最后把多个样式文件合并为一个main.css文件
use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
}
],
}
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
module.exports = {
mode: 'production',
// 放优化的插件,在生产环境中才会生效
optimization: {
minimizer: [
new CssMinimizerPlugin()
]
}
}
10 图片文件加载(在css中)
.block-bg{
background-image: url('./assets/webpack_logo.png');
}
block.classList.add('block-bg');
11 字体文件加载
module.exports = {
rules: [
{
test: /.(woff|woff2|eot|ttf|otf)$/,
type: 'asset/resource'
}
],
}
@font-face {
font-family: 'iconfont';
src: url('./assers/Mefstruture.ttf');
}
.icon {
font-family: 'iconfont';
font-size: 30px;
}
const spanEle = document.createElement('span');
spanEle.innerHTML = 'iconfont';
spanEle.classList.add('icon');
document.body.appendChild(spanEle);
12 加载数据文件(json, csv, tsv, xml等)
12.1 安装插件 npm i csv-loader xml-loader -D
12.2 使用
module.exports = {
rules: [
{
test: /.(csv|tsv)$/,
use: 'csv-loader'
},
{
test: /.xml$/,
use: 'xml-loader'
},
],
}
<? xml version="1.0" encoding="UTF-8" ?>
<node>
<to>Mary</to>
<to>Mike</to>
<from>John</from>
<heading>reminder</heading>
<body>Call Cind on Tuesday</body>
</node>
to, from, heading, body
Mary, John, Reminder, Call Cindy on Thuesday
Zoe, Bill, Reminder, Buy orange juice,
Antumn, Lindsey, Letter, I miss you
import Data from './assets/data.xml';
import Notes from './assets/data.csv';
console.log(Data); //对象
console.log(Notes); //数组
13 加载数据文件(yaml, toml, json5等)
13.1 安装 npm i toml yaml json5 -D
13.2 使用
title = "TOML Example"
# 2层
[ownerA]
name = "Tom Preston-Werner"
organization = "Github"
bio = "Github Cofounder $ CEO\nLikes tater tots and beer."
dob = "1979-05-27T07:32:00.000Z"
# 多层
[ownerB.a]
name = "Tom Preston-Werner"
organization = "Github"
bio = "Github Cofounder $ CEO\nLikes tater tots and beer."
dob = "1979-05-27T07:32:00.000Z"
[ownerB.b]
bio = "Github Cofounder $ CEO\nLikes tater tots and beer."
dob = "1979-05-27T07:32:00.000Z"
# 数组
[[ownerC]]
name = "Tom Preston-Werner"
organization = "Github"
[[ownerC]]
bio = "Github Cofounder $ CEO\nLikes tater tots and beer."
dob = "1979-05-27T07:32:00.000Z"
title: YAML Example
# 2层
owmnerA:
name: Tom Preston-Werner
organization: Github
bio: |-
Github Cofounder $ CEO
Likes tater tots and beer.
dob: 1979-05-27T07:32:00.000Z
# 多层
ownerB:
name:
username: 张三
# 数组
ownerC:
- a: 1
b: 2
- a: 3
b: 4
{
title: "JSON5 Example",
ownerA: {
name: "Tom Preston-Werner",
organization: "Github",
bio: "Github Cofounder & CEO\n\
Likes tater tots and beer",
dob: "1979-05-27T07:32:00.000Z",
},
ownerB: ["Tom Preston-Werner", "Github"],
}
const toml = require('toml');
const yaml = require('yaml');
const json5 = require('json5');
module.exports = {
rules: [
{
test: /.toml$/,
type: 'json',
parser: {
parse: toml.parse,
}
},
{
test: /.yaml$/,
type:'json',
parser:{
parse: yaml.parse,
}
},
{
test: /.json5$/,
type:'json',
parser:{
parse: json5.parse,
}
},
],
}
import toml from './assets/data.toml';
import yaml from './assets/data.yaml';
import json5 from './assets/data.json5';
console.log(toml);
console.log(yaml);
console.log(json5);