这是我参与第四届青训营笔记创作活动的第八天
前言
暑假的学习计划里面老早就装了打包工具——重点了解关于Webpack的知识,然后其他三个比较热门的打包工具暂时简单认识一下。好巧不巧,青训营的课程刚好就有关于打包工具的内容,而且在Webpack这里还是范文杰老师!始于师兄的推荐,震撼于文杰老师关于Webpack的文章与小册,最后在听课期间完全信服。冲着这,怎么着也得一直支持同潮汕老乡的范文杰老师。
这里请允许我先贴一下老师的Webpack专栏链接:精通Webpack核心原理。 不过对我现在的我来说,尝试看了两篇,真的熬不住啊,内容太厉害了我还是脚踏实地从入门开始吧。
图源范文杰老师
为什么需要打包工具?
开发时,我们会使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 css 预处理器等语法进行开发。这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法,才能运行。所以我们需要打包工具帮我们做完这些事。除此之外,打包工具还能压缩代码、做兼容性处理、提升代码性能等。
常见的打包工具
- Grunt
- Gulp
- Parcel
- Webpack
- Rollup
- Vite
目前市面上最流量的是 Webpack,所以我们会先整理Webpack相关知识,随后整理Vite, esbuild以及parcel。
Webpack
Webpack是本质上是一种前端资源编译、打包工具,它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去,输出的文件就是编译好的文件,就可以在浏览器段运行了,我们将 Webpack 输出的文件叫做 bundle。它支持Babel, Eslint, TS, CoffeScript, Less, Sass, 支持模块化处理css、图片等资源文件,支持HMR+开发服务器,支持持续监听、持续构建,支持代码分离,支持Tree-shaking,支持Sourcemap...
初步了解webpack
首先搞一个项目文件大概列表出来
webpack_code # 项目根目录(所有指令必须在这个目录运行)
└── src # 项目源码目录
├── js # js文件目录
│ ├── 文件1.js
│ └── 文件2.js
└── main.js # 项目主文件
安装
打开终端,来到项目根目录。运行以下指令:
首先,初始化package.json
npm init -y
此时会生成一个基础的 package.json 文件。
注意 package.json 中 name 字段不能叫做 webpack, 否则下一步会报错。
接着,下载依赖
npm i webpack webpack-cli -D
编辑配置文件
webpack.config.js文件
module.exports={
entry:'main.js',//入口文件(主文件)
output:{
filename:"[name].js",
path:path.join(__dirname,"./dist"),//输出路径
},
module:{
rules:[{
test:/\.less$/i,//配对.less结尾文件
use:['style-loader','css-loader','less-loader']
}]
}
}
其实现在不必过多纠结,后面就知道这些是干嘛的了。为了简单用一下webpack,我们再创建几个文件,比如:
count.js
export default function count(x,y){
return x-y;
}
sum.js
export default function sum(...args){
return args.reduce((p,c)=>p+c,0)
}
main.js
import count from "./js/count";
import sum from "./js/sum";
console.log(count(2,1),sum(1,2,3,4));
执行编译命令
npx webpack
这里其实还分两种模式
- 开发模式
npx webpack ./src/main.js --mode=development
- 生产模式
npx webpack ./src/main.js --mode=production
这里的npx webpack: 是用来运行本地安装 Webpack 包的。./src/main.js: 指定 Webpack 从 main.js 文件开始打包,不但会打包 main.js,还会将其依赖也一起打包进来。--mode=xxx:指定模式(环境)。
5 大核心概念及核心流程
- entry(入口)
指示 Webpack 从哪个文件开始打包
- output(输出)
指示 Webpack 打包完的文件输出到哪里去,如何命名等
- loader(加载器)
webpack 本身只能处理 js、json 等资源,其他资源需要借助 loader,Webpack 才能解析
- plugins(插件)
扩展 Webpack 的功能
- mode(模式)
主要由两种模式:
- 开发模式:development
- 生产模式:production
而且其实其中存在递归调用2、3,直到所有资源处理完毕。
观察输出文件
默认 Webpack 会将文件打包输出到 dist 目录下,我们查看 dist 目录下文件情况就好了。
使用Webpack
关于 Webpack的使用方法,基本都围绕“配置”展开,而这些配置大致可划分为两类:
- 流程类:作用于流程中某个 or 若干个环节,直接影响打包效果的配置项
- 工具类:主流程之外,提供更多工程化能力的配置项。
配置总览
处理样式资源
处理 Css 资源
1. 下载包
npm i css-loader style-loader -D
注意:需要下载两个 loader
2. 功能介绍
css-loader:负责将 Css 文件编译成 Webpack 能识别的模块style-loader:会动态创建一个 Style 标签,里面放置 Webpack 中 Css 模块内容
此时样式就会以 Style 标签的形式在页面上生效
3. 配置
4. 添加 Css 资源
首先随便搞一个css文件,比如src/css/index.css
然后在src/main.js引入
再随便写个html例如public/index.html并引入打包文件
最后运行指令npx webpack,打开 index.html 页面查看效果。
处理Less资源
同理可得 下载-->配置-->引入-->应用
1. 下载包
npm i less-loader -D
less-loader:负责将 Less 文件编译成 Css 文件
2. 配置
接下来的跟处理css流程一样,相信大家都会!
处理 Sass 和 Scss 资源
1. 下载包
npm i sass-loader sass -D
注意:需要下载两个
sass-loader:负责将 Sass 文件编译成 css 文件sass:sass-loader依赖sass进行编译
2. 配置
接下来同上
处理 Styl 资源
1. 下载包
npm i stylus-loader -D
stylus-loader:负责将 Styl 文件编译成 Css 文件
2. 配置
后续同上
处理图片资源
过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理。现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源。
1. 配置
接着就是添加图片资源并使用
2. 输出资源情况
此时如果查看 dist 目录的话,会发现多了三张图片资源。因为 Webpack 会将所有打包好的资源输出到 dist 目录下。
但是为什么样式资源没有呢?
因为经过 style-loader 的处理,样式资源打包到 main.js 里面去了,所以没有额外输出出来。
3. 对图片资源进行优化
我们还可以优化,将小于某个大小的图片转化成 data URI 形式(Base64 格式)
- 优点:减少请求数量
- 缺点:体积变得更大
此时输出的图片文件就只有两张,有一张图片以 data URI 形式内置到 js 中了 (注意:需要将上次打包生成的文件清空,再重新打包才有效果)
问题1
- Loader 有什么作用?为什么这里需要用到css-loader、style-loader
- 与旧时代-在HTML 文件中维护css 相比,这种方式会有什么优劣处?
- 有没有接触过 LessSassStylus 这一类CSS 预编译框架?如何在Webpack接 跳入这些工具?
参考资料:
最后留下一点问题,咱明天再见!最后的最后,谢谢大家这么厉害还来看我,如果发现问题或者需要补充的点麻烦大家通过评论告诉我。博取众长,共同进步!