02-Webpack打包常见资源
码路教育 7/26/2022
# 1. 打包CSS
打包非JS文件,我们需要安装一个loader来处理此文件
- 打包css时,可以将css文件也看成是一个模块,我们是通过import来加载这个模块的
- 在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能
- loader 可以用于对模块的源代码进行转换,对于加载css文件来说,我们需要一个可以读取css文件的loader
- 使用css-loader来读取css文件,安装:npm install css-loader -D
css-loader的使用方案
- 内联方式(了解),使用较少,不方便管理
- 在引入的样式前加上使用的loader,并且使用!分割;
- import "css-loader!../css/out.css"
- 配置方式(重点掌握)
loader配置
- module.rules中允许我们配置多个loader
- 配置形式管理loader,方便后期的维护,同时也让你对各个Loader有一个全局的概览
- test属性:用于对 resource(资源)进行匹配的,通常会设置成正则表达式
- use属性:对应的值时一个数组
- use: [ 'css-loader' ])是 loader 属性的简写方式(如:use: [ { loader: 'css-loader'} ]
认识style-loader
通过css-loader来加载css文件了, 但是发现这个css在我们的代码中并没有生效(页面没有效果),因为css-loader只是负责将.css文件进行解析,并不会将解析之后的css插入到页面中,我们希望再完成插入style的操作,那么我们还需要另外一个loader,就是style-loader
- 安装style-loader npm install style-loader -D
配置style-loader
- 在配置文件中,添加style-loader
- 因为loader的执行顺序是从右向左(或者说从下到上,或者说从后到前的),所以我们需要将style-loader写到css-loader的前面
- 重新执行编译npm run build,可以发现打包后的css已经生效了
# 2. 打包Less
在我们开发中,我们可能会使用less、sass、stylus的预处理器来编写css样式,效率会更高
less-loader处理 less文件
- less-loader需要使用less工具来转化less
- 安装:npm i less less-loader -D
- 使用less-loader,来自动使用less工具转换less到css
# 3. PostCSS工具
什么是PostCSS呢
- PostCSS是一个通过JavaScript来转换样式的工具
- 这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置
- 实现这些功能,我们需要借助于PostCSS对应的插件
使用PostCSS
- 第一步:查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader
- 第二步:选择可以添加你需要的PostCSS相关的插件
在webpack中使用postcss就是使用postcss-loader来处理的
- 安装postcss-loader npm install postcss-loader -D
- 修改加载css的loader,postcss需要有对应的插件才会起效果,所以我们需要配置它的plugin
- 安装添加前缀的插件 npm install autoprefixer -D
单独配置文件管理
- 在根目录下创建postcss.config.js
- 将这些配置信息放到一个单独的文件中进行管理
postcss-preset-env
- 在配置postcss-loader时,我们配置插件并不需要使用autoprefixer
- postcss-preset-env也是一个postcss的插件,将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境添加所需的polyfill
- 会自动帮助我们添加autoprefixer(所以相当于已经内置了autoprefixer)
- 安装:npm install postcss-preset-env -D
# 4. 打包图片
- 在webpack5之前,加载这些资源我们需要使用一些loader,比如raw-loader 、url-loader、file-loader
- 在webpack5开始,我们可以直接使用资源模块类型(asset module type),来替代上面的这些loader
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader
- asset/resource 发送一个单独的文件并导出 URL,之前通过使用 file-loader 实现;
- asset/inline 导出一个资源的 data URI,之前通过使用 url-loader 实现;
- asset/source 导出资源的源代码,之前通过使用 raw-loader 实现
- asset 在导出一个 data URI 和发送一个单独的文件之间自动选择,之前通过使用 url-loader,并且配置资源体积限制实现
asset module type的使用
- 加载图片,我们可以使用下面的方式:
{
test:/\.(png|svg|jpg|jpeg|gif)$/i,
type:"asset/resource"
}
1
2
3
4
2
3
4
自定义文件的输出路径和文件名
- 方式一:修改output,添加assetModuleFilename属性;
- 方式二:在Rule中,添加一个generator属性,并且设置filename;
最常用的placeholder
- [ext]: 处理文件的扩展名
- [name]:处理文件的名称;
- [hash]:文件的内容,使用MD4的散列函数处理,生成的一个128位的hash值(32个十六进制)
# 5. 资源模块类型的limit
开发中将小的图片进行转换,大的图片直接使用图片
- 因为小的图片转换base64之后可以和页面一起被请求,减少不必要的请求过程;
- 大的图片也进行转换,反而会影响页面的请求速度
实现步骤
- 步骤一:将type修改为asset;
- 步骤二:添加一个parser属性,并且制定dataUrl的条件,添加maxSize属性;
# 6. babel打包JS高级语法
- 开发中,我们想要使用ES6+的语法,想要使用TypeScript,开发React项目,它们都是离不开Babel的;
- 学习Babel对于我们前端开发来说,非常重要
Babel到底是什么
- Babel是一个工具链,主要用于旧浏览器或者环境中将ECMAScript 2015+代码转换为向后兼容版本的JavaScript;
- 包括:语法转换、源代码转换等;
Babel命令行使用
- babel本身可以作为一个独立的工具(和postcss一样),可以单独使用
- 在命令行尝试使用babel,需要安装如下库
- @babel/core:babel的核心代码,必须安装, @babel/cli:可以让我们在命令行使用babel
- npm install @babel/cli @babel/core -D
- 使用babel来处理我们的源代码
- npx babel src --out-dir dist
插件的使用
- 转换箭头函数,那么我们就可以使用箭头函数转换相关的插件
- npm install @babel/plugin-transform-arrow-functions -D
- npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions
let/const转成var
- 使用 plugin-transform-block-scoping 来进行转化
- npm install @babel/plugin-transform-block-scoping -D
- npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions
Babel的预设preset
- 如果要转换的内容过多,一个个设置是比较麻烦的,我们可以使用预设(preset)
- 预设说白了,就是插件的集合
- 安装:npm install @babel/preset-env -D
- 使用:npx babel src --out-dir dist --presets=@babel/preset-env
babel-loader
- 在实际开发中,我们通常会在构建工具中通过配置babel来对其进行使用的,比如在webpack中
- 安装依赖:npm install babel-loader -D (之前已经安装了@babel/core,那么不需要再次安装)
- 配置规则,在加载js文件时,使用我们的babel
babel-preset
- 一个个去安装使用插件,那么需要手动来管理大量的babel插件,我们可以直接给webpack提供一个preset,webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel。
- 常见的预设有三个:env,react,TypeScript
- 安装preset-env:npm install @babel/preset-env
# 7. 打包vue代码
要使用vue,需要安装vue
- npm i vue@next
安装vue-loader, @vue/compiler-sfc
- npm i vue-loader
- npm i @vue/compiler-sfc