目录
零、webpack的作用
1. 概念
2. 打包
3. 图解
一、webpack的使用前提
二、项目初始化
1. 创建webpack文件夹,进入文件夹后初始化
2. 安装webpack (-D 安装开发依赖)
3. 创建文件夹src
4. src下创建js 文件夹
5. js 文件夹创建math.js
6. js 文件夹创建format.js
7. src下创建index.js
8. 以上所说的目录结构如此
三、JavaScript的打包
1. 修改package.json
2. 打包(后续所有的打包,都是这个命令,就不再写了哈~~)
3. 为了看到效果,在最外层下创建index.html,运行即可
四、webpack的打包
0. 打包流程
第一步:创建package.json文件,用于管理项目的信息、库依赖等
第二步:安装局部的webpack
第三步:使用局部的webpack
第四步:在package.json中创建scripts脚本
第五步:执行即可
1. 默认打包
2. 设定配置文件
3. 指定配置文件名称
五、loader的配置
1. 概念
2. 配置
3. 栗子
六、CSS的打包
1. 在src下创建css文件夹,并在其中创建style.css
2. 在index.js中导入
3. 下载所需CSS的loader
4. 在webpack.config.js文件中进行配置
七、less|sass的配置
1. 在src下的css文件夹中创建text.less
2. 在index.js中导入
3. 下载less的loader
4. 在webpack.config.js文件中进行配置
八、PostCSS工具配置
1. 下载postcss-loader
2. 下载所需要的插件
3. 在webpack.config.js文件中进行配置
4. 已经添加成功
5. 优化一下,可以把postcss的配置专门写到一个文件中
九、图片资源的打包(webpack5之前版本)
1. 安装filer-loader,url-loader
2. 在webpack.config.js中进行配置
3. 在src下创建img文件夹,往里加入测试图片text.png
4. 在css文件夹中创建image.css
5. 在js文件夹中创建element.js
6. 在index.js中导入
7. 打包一下即可
编辑
8. 优化,打包后的文件位置和文件名不太优雅
十、图片资源的打包(webpack5之后版本)
十一、打包字体文件
1. 在src下创建font文件夹
2. 在element.js文件中,加入新的代码
3. 使用的类名为
4. 在webpack.config.js中进行配置
十二、babel
1. 概念
01 - 什么是babel
02 - 为什么需要babel呢
03 - babel的底层原理
2. 使用
01 - 下载babel-loader和babel-core
02 - 下载对应的插件
03 - 在src文件夹的js文件夹夹创建es.js
04 - 在index.js中导入
05 - 在webpack.config.js中进行配置
06 - 查看效果
07 - 优化
08 - 再次优化 ,babel的配置文件
webpack是一个静态的模块化打包工具,为现代的javaScript应用程序
我们可以编写左边的各种类型的代码,但是浏览器不能直接识别,所以需要打包工具对代码进行打包,生成可以被浏览器直接识别的静态资源(右边)
webpack是如何打包的呢
因为webpack的运行时依赖Node环境,所以需要安装Node。
下载 Node.js
注:webpack 依赖 node ,node 支持 common.js,所以配置webpack时,都是用的common.js
node虽然可以支持ES module,但是需要配置,比较麻烦
npm init -y
npm install webpack webpack-cli -D
// webpack在执行时是依赖webpack-cli的,如果没有安装就会报错
// webpack-cli : 使得可以在命令行中使用webpack
//ES6的导出
export function sum(num1,num2){
return num1 + num2
}
// CommonJs的导出
const priceFormat = function(){
return '$99.88'
}
module.exports = {
priceFormat
}
import { sum } from './js/math';
const { priceFormat } = require('./js/format');
console.log(sum(20, 30));
console.log(priceFormat());
"scripts": {
"build":"webpack"
},
npm run build
// 引用打包后的js文件
npm init -y
npm install webpack webpack-cli -D
npx webpack
"scripts": {
"build": "webpack"
},
npm run build
在通常情况下,webpack需要打包的项目是非常复杂的,并且需要一系列的配置来满足要求,默认配置必然是不可以的,可以在根目录下创建一个 webpack.config.js 文件,来作为webpack的配置文件
入口:需要打包的文件都要放在入口处,没放进来的不会被打包
出口:经过打包后的文件所放的地方
const path = require('path'); // 需要使用 Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
// 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
path: path.resolve(__dirname, './dist'),
// 打包后的js的文件名
filename: 'boundle.js'
}
};
如果配置文件并不是webpack.config.js的名字,而是其他的名字,需要手动配置
// 也可在 package.json 中进行配置
"scripts": {
"build": "webpack --config wk.config.js"
},
weboack 默认就可以打包 js 文件,但是不支持打包其他文件
这就需要配置各种loader了
在 webpack.config.js 文件中写明配置信息
module.rules的配置如下 :
module: {
rules: [
// 方式一 :
{
test: /\.css$/,
// 如果loader只有一个
loader: 'css-loader'
},
// 方式二 :
{
test: /\.css$/,
// 如果有多个loader,但是不用配置
use: ['style-loader', 'css-loader']
},
// 方式三 :
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
// 如果有需要配置的loader
{
// 使用的loader名称
loader: 'postcss-loader',
// 配置的属性
options: {
postcssOptions: {
plugins: ['autoprefixer']
}
}
}
]
}
]
}
body{
background-color: skyblue;
/* 下面测试postcss用 */
user-select: none;
}
import './css/style.css';
loader : 可以用于对模块的源代码进行转换
因为webpack默认只能打包js,如果需要打包其他模块(例如css),需要下载对应loader
css-loader : 负责将.css文件进行解析,但并不会讲解析后的css插入到页面中
style-loader : 完成页面插入css操作
npm install css-loader style-loader -D
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
// 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
path: path.resolve(__dirname, './dist'),
// 打包后的js的文件名
filename: 'boundle.js'
},
// 配置模块
module: {
// 规则
rules: [
{
// 用正则表达式来进行匹配,匹配css文件
test: /\.css$/,
// 使用的loader。注:这里执行顺序是从右往左走|从下往上,先解析,再插入
use: ['style-loader', 'css-loader']
}
]
}
};
前提是下载了less|scss哦,以下已less为栗子,sass下载对应的包即可
npm install less -D
@textColor:blue;
body{
color: @textColor;
}
小tip : 如果使用vscode,可以安装插件 Easy LESS ,当保存less文件内容时,会自动生成对应的css文件,方便观看,不下载亦可
import './css/text.less'
npm install less-loader -D
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.css$/, // 用正则表达式来进行匹配,匹配css文件
use: ['style-loader', 'css-loader'] // 使用的loader
},
{
test: /\.less$/, // 用正则表达式来进行匹配,匹配less文件
use: ['style-loader', 'css-loader', 'less-loader'] // 使用的loader
}
// -------css和less的配置可以合并,如下-------
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'less-loader'] // 使用的loader
}
]
}
};
PostCSS :
使用PostCSS :
npm install postcss-loader -D
autoprefixer : 自动添加浏览器前缀
postcss-preset-env : 将现代的css特性转为大多数浏览器可识别的css,自动添加浏览器前缀
所以,直接用下面辣个插件即可
npm install postcss-preset-env -D
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: [
'style-loader',
'css-loader',
// 使用postcss
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [require('postcss-preset-env')]
}
}
},
'less-loader' // 先把less转换,然后再用这个插件会好点
]
}
]
}
};
在目录下新建postcss.config.js文件
module.exports = {
plugins: [require('postcss-preset-env')]
// plugins: ['postcss-preset-env'] 也可以不写 require
};
那么 webpack.config.js只要这么写即可
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'] // 使用的loader
}
]
}
};
注:这里说的是webpack5之前的版本所使用的 , 否则可能报错
webpack5中file-loader和url-loader都不怎么使用了
要处理jpg、png等格式的图片,也需要有对应的loader
file-loader : 作用是帮助我们处理import\require()方式引入的文件资源,并放到我们输出的文件夹中,不管大小都输出文件
url-loader : 和file-loader工作方式是相似的,不过可以将较小的图片转成base64的URI
两个使用其中一个即可
npm install file-loader url-loader -D
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
},
{
test: /\.(png|jpe?g|gif|svg)$/i, // 用正则表达式来进行匹配,匹配以这些后缀名的图片
use: [
{
loader: 'file-loader',
options: {
// 高版本的file-loader不这样配置的话,img的src为[object Module]
esModule: false
}
},
/// -----------------使用其中一个即可
{
loader: 'url-loader',
options: {
// 高版本的file-loader不这样配置的话,img的src为[object Module]
esModule: false
}
}
]
}
]
}
};
.div-dom{
width: 100%;
height: 500px;
background: url('../img/text.png') ;
}
// 导入css样式
import '../css/image.css';
import imgUrl from '../img/text.png';
// 创建一个div元素 , 设置背景图片
const divDom = document.createElement('div');
// 赋值一个class
divDom.className = 'div-dom';
// 加入到body中
document.body.appendChild(divDom);
// 创建一个img元素 , 设置src
const imgDom = document.createElement('img');
// 注意,不能这样赋值,这样相当于赋值了个字符串,到时候页面会从相对路径去找图片,是找不到的
// imgDom.src = '../img/text.png';
// 赋值src,相当于导入一个模块
imgDom.src = imgUrl;
// 加入到body中
document.body.appendChild(imgDom);
import './js/element';
file-loader打包结果如下
如果使用url-loader打包的,可能没有生成图片,小图片会在boundle.js中以base64形式存在,望周知
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
},
{
test: /\.(png|jpe?g|gif|svg)$/i, // 用正则表达式来进行匹配,匹配以这些后缀名的图片
use: [
{
loader: 'file-loader',
options: {
// 高版本的file-loader不这样配置的话,img的src为[object Module]
esModule: false,
// 打包后会有个img文件夹
outputPath:'img',
// 保留名字,加上6位hash值,保留扩展名
name:"[name]__[hash:6].[ext]"
}
}
//----------使用一个即可
{
loader: 'url-loader',
options: {
// 高版本的file-loader不这样配置的话,img的src为[object Module]
esModule: false,
// 设置当小于100kb的图片打包成base64,大于的打包成图片输出到img文件夹中
limit: 100 * 1024,
// 打包后会有个img文件夹
outputPath: 'img',
// 保留名字,加上6位hash值,保留扩展名
name: '[name]__[hash:6].[ext]'
}
}
]
}
]
}
};
webpack5之前 : 加载这些资源需要使用一些loader,比如url-loader、file-loader
webpack5之后 : 直接使用资源模块类型( asset module type ),来替代上面的loader
你会发现更简单啦,不用下载loader
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
},
{
test: /\.(png|jpe?g|gif|svg)$/i, // 用正则表达式来进行匹配,匹配以这些后缀名的图片
// 自动选择
type: 'asset',
parser: {
// 数据url的条件配置
dataUrlCondition: {
// 超过100kb的图片打包,小于的弄成bast64
maxSize: 100 * 1024
}
},
// 生成
generator: {
// 文件夹名称
outputPath: 'img',
// 文件名称
// name : 指向 => 原来的图片名称
// hash : 指向 => webpack生成的hash值,是唯一的,可以截取
// ext : 指向 => 扩展名
filename: '[name]__[hash:8][ext]',
// 以上这两个属性可以合在一起
filename: 'img/[name]__[hash:8][ext]'
}
}
]
}
};
首先得现有字体文件,我是在阿里矢量图标库中下载的 iconfont-阿里巴巴矢量图标库
把选中的图标添加到自己的项目,下载下来即可
// 导入字体的css
import '../font/iconfont.css';
const iDom = document.createElement('i');
// 使用下载的字体图标,注意使用方法
iDom.className = 'iconfont icon-icon_tianjia';
document.body.appendChild(iDom);
const path = require('path'); // Node内置模块
module.exports = {
// 入口
entry: './src/index.js',
// 出口
output: {
path: path.resolve(__dirname, './dist'), // 因为这里需要绝对路径,__dirname获取到的是当前文件所在路径,所以拼接一下
filename: 'boundle.js' // 打包后的js的文件名
},
// 配置模块
module: {
// 规则
rules: [
{
test: /\.(css|less)$/, // 用正则表达式来进行匹配,匹配css|less文件
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
},
{
test: /\.(png|jpe?g|gif|svg)$/i, // 用正则表达式来进行匹配,匹配以这些后缀名的图片
// 自动选择
type: 'asset',
parser: {
// 数据url的条件配置
dataUrlCondition: {
// 超过100kb的图片打包,小于的弄成bast64
maxSize: 100 * 1024
}
},
// 生成
generator: {
filename: 'img/[name]__[hash:8][ext]'
}
},
{
test: /\.(eot|ttf|woff2?)$/i, // 用正则表达式来进行匹配,匹配以这些后缀名的字体文件
type: 'asset/resource',
// 生成
generator: {
filename: 'font/[name]__[hash:8][ext]'
}
}
]
}
};
babel的工作流程:解析阶段、转换阶段、生成阶段
具体一点
babel可以用来转换,但是是通过具体的babel插件来完成的,所以我们不仅要下载babel,也需要下载你所需要的对应的插件
npm install babel-loader @babel/core -D
@babel/plugin-transform-arrow-functions : 箭头函数转换插件
@babel/plugin-transform-block-scoping : 作用域转化插件 (const、let 关键字转换为 var)
npm install @babel/plugin-transform-arrow-functions -D
npm install @babel/plugin-transform-block-scoping -D
随便乱写点ES6新增的,如cosnt、剪头函数等
const message = 'hello world';
const names = [123, 321];
names.forEach((item) => console.log(item));
console.log(message);
import './js/es';
tip : 因为现在代码越来越多啦,全弄上来怕你们找不到在哪里,所以就先截图,然后在把代码放进去了哈~
// js文件
{
test: /\.js$/,
use: [
{
// 使用loader
loader: 'babel-loader',
options: {
// 使用的插件
plugins: ['@babel/plugin-transform-arrow-functions', '@babel/plugin-transform-block-scoping']
}
}
]
}
因为这两个插件都是很常用的,还有一些其他常用的插件,如果我们每次都一个个去下载未免太累了,可以直接给webpack提供一个preset,webpack会根据预设来加载对应的插件列表,并传递给babel
常见的预设有 : env、react、TypeScript
@babel/preset-env : 里面自带了ES6转换相关的插件
npm install @babel/preset-env -D
所以代码就可以修改成这样啦
// js文件
{
test: /\.js$/,
use: [
{
// 使用loader
loader: 'babel-loader',
options: {
// 使用的插件
// plugins: ['@babel/plugin-transform-arrow-functions', '@babel/plugin-transform-block-scoping']
presets: ['@babel/preset-env']
}
}
]
}
tip : 有多种后缀名,区别就是文件里的格式不一样,这里以.js后缀名为例子
module.exports = {
presets: ['@babel/preset-env']
};
// js文件
{
test: /\.js$/,
use: ['babel-loader']
}