学习视频:https://yk2012.github.io/sgg_webpack5/project/vue-cli.html
1、webpack本身功能较少,只能处理js资源,一旦遇到css等其他资源会报错
2、基本使用:
//js/count.js
export default function (a,b) {
console.log(a+b);
}
//js/sum.js
export default function(...arg) {
return arg.reduce((x,y) => x+y,0);
}
//src/main.js
import count from "../js/sum"
import sum from "../js/sum"
console.log(count(1,2));
console.log(sum(1,2,3,4,5));
src/main.js
,直接在vscode中使用Live Server打开,控制台报错。(原因:浏览器不能识别ES6的模块化)npm init
创建 package.json 文件,将main属性,修改为正确的入口js文件路径npx webpack ./src/main.js --mode=development
命令去打包,默认打包文件输出到根目录到dist文件夹里面。其中mode
取值为development
或者production
,前者是在开发模式中打包编译,编译成浏览器能够识别的语法;后者是在生产环境下打包,会对代码进行压缩(命令中加上./src/main.js
是要指明要打包的是哪一个文件 )//webpack.config.js
const path = require("path")//nodejs的核心模块,专门用来处理路径问题
module.exports = {
//入口
entry: "./src/main.js",
//出口
output: {
//js文件的输出路径,其他文件如图片,需要在配置图片loader那边,通过gererator.name属性去配置
//--dirname 是nodejs的变量,代表当前文件的文件夹目录
//下面两句意思是,打包出来的所有文件及目录都放到 dist 目录下面,main.js 文件放到 dist/static/js 下面
//这里的“dist”可以改为“dist/static/js”,下面的filename改为main.js,但是这样的话,打包出来的所有资源(如image、fonts)都会放到 “dist/static/js” 下面,
path: path.resolve(__dirname, "dist"),
//文件名
//filename: "main.js"
filename: "static/js/main.js" //输出到dist/js/main.js中
},
//加载器
module: {
rules: [
//loader的配置
]
},
//插件
plugins: [
//plugin的配置
],
//模式
mode: "development"
}
使用该代码可以直接使用 npx webpack
打包,不需要在命令中指定入口文件。
注:代码、文件名不可输入,否则报错
npm install --save-dev css-loader
webpack仅支持处理js、json资源,如果 main.js 里面引入css,打包会报错,这就需要对应的loader去处理css资源。
//webpack.config.js
//加载器
module: {
rules: [
//loader的配置
{
test: /\.css$/i, //使用正则匹配.css后缀的文件
//执行顺序:从右到左(从上到下)
//loader: "", //使用loader属性,只能配置一个loader
use:[ //使用user属性,可以配置多个loader
"style-loader", //将js中的css通过创建style标签的方式,添加到html中
"css-loader" //将css资源编译成commonjs的模块到js中
]
}
]
},
import "./css/index.css"
npx webpack
$ npm install less less-loader --save-dev
//webpack.config.js
//加载器
module: {
rules: [
//loader的配置
{
test: /\.css$/i, //使用正则匹配.css后缀的文件
//执行顺序:从右到左(从上到下)
use:[
"style-loader", //将js中的css通过创建style标签的方式,添加到html中
"css-loader" //将css资源编译成commonjs的模块到js中
]
},
{
test: /\.less$/,
use: [
"style-loader",
"css-loader",
"less-loader" //将less编译成css文件
]
}
]
},
$ npm install sass-loader sass webpack --save-dev
//webpack.config.js
{
test: /\.s[ac]ss$/i, //这里要匹配sass和scss
use: [
// 将 JS 字符串生成为 style 节点
'style-loader',
// 将 CSS 转化成 CommonJS 模块
'css-loader',
// 将 Sass 编译成 CSS
'sass-loader',
],
},
$ npm install stylus stylus-loader --save-dev
//webpack.config.js
{
test: /\.styl$/,
use: [
"style-loader",
"css-loader",
"stylus-loader" // 将 Stylus 文件编译为 CSS
],
},
webpack4的时候需要用url-loader去处理图片资源,webpack5只需要配置type: asset
,其内部将使用url-loader去处理图片,不需要单独配置(当前使用5.72.0版本,不在webpage.config.js 中处理,打包出来的文件也将图片打包出来了,没有影响,教程评论提示不处理,部署上线可能存在问题,待验证)
css、sass、scss等资源中使用图片时,直接引入,在webpage.config.js中增加如下配置:
//webpack.config.js
{
test: /\.(png|jpe?g|gif|webp|svg|jpg)$/, //匹配多种后缀的图片
type: "asset",
parser: {
dataUrlCondition: {
//小于10kb的图片转化为base64
//优点:减少请求数量。缺点:体积会变大
maxSize: 10 * 1024 //10kb
}
}
}
上述代码中,小于10kb的图片,会被转化成base64,代码里直接引入base64的地址;大于64kb则直接复制新的图片至输入目录。
//webpack.config.js
output: {
//js文件的输出路径
//--dirname 是nodejs的变量,代表当前文件的文件夹目录
//下面两句意思是,打包出来的所有文件及目录都放到 dist 目录下面,main.js 文件放到 dist/static/js 下面
//这里的“dist”可以改为“dist/static/js”,下面的filename改为main.js,但是这样的话,打包出来的所有资源(如image、fonts)都会放到 “dist/static/js” 下面,
path: path.resolve(__dirname, "dist"),
//文件名
filename: "static/js/main.js"
},
/
前面是路径,后面是图片名称,下面代码表示,所有图片,均输出到static/images目录下吗,名称为 hash.ext//webpack.config.js
{
test: /\.(png|jpe?g|gif|webp|svg|jpg)$/, //匹配多种后缀的图片
type: "asset", //asset 默认会把文件转成base64
parser: {
dataUrlCondition: {
//小于10kb的图片转化为base64
//优点:减少请求数量。缺点:体积会变大
maxSize: 10 * 1024 //10kb
}
},
generator: {
//输出图片目录及名称
//hash是原文件名,也叫图片id,是根据文件内容生成的,是唯一的
//hash后面加 :10 表示取hash的前10位字符,这样就缩短了文件名,缩小的问文件体积
//ext是文件扩展名
//query是文件查询的参数,可写可不写
filename: "static/images/[hash:10][ext][query]"
}
}
在出口的配置中,设置clean: true
//webpack.config.js
//出口
output: {
//js文件的输出路径
//--dirname 是nodejs的变量,代表当前文件的文件夹目录
path: path.resolve(__dirname, "dist"),
//文件名
filename: "js/main.js",
//自动清空上次打包的内容
//执行:在打包前,将path整个目录内容清空,在进行打包输出
clean: true
},
以 iconfont 为例:
<span class="iconfont icon-wodekanjia">span>
import "./css/iconfont.css"
//webpack.config.js
//加载器
module: {
rules: [
//loader的配置
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource", //asset/resource 不会把文件转成base64
generator: {
filename: "static/fonts/[hash][ext][query]"
}
}
]
},
注:音视频这种的其他资源,也可以通过type:"asset/resource"
处理,只需要将后缀加到 test 属性里面,然后 generator.filename 里面写上对应的路径/文件名即可。
webpack 对 js 的处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器中运行,所以我们希望做一些兼容性处理。
其次,开发者,团队对代码格式有严格要求的,我们不能肉眼去检测代码格式,需要使用专业的工具来检测。
流程是:先完成 Eslint 检测代码格式无误后,再由 Babel 做代码兼容性处理。
javascript编译器。
主要用于将ES6语法编写的代码转换为后向后兼容的javascript语法,以便能够运行在当前和旧版本的浏览器或其他环境。
配置文件有多种写法
babel.config.*
新建文件,位于项目根目录babel.config,js
babel.config.json
babelrc.*
新建文件,位于根目录.babelrc
.babelrc.js
.babelrc.json
packge.json
和babel
:不需要创建文件,在原有文件基础上写Babel 会查找和自动读取他们,所以以上配置文件只需存在一个即可。
$ npm install -D babel-loader @babel/core @babel/preset-env webpack
以babel.config.js
配置文件为例:
module.exports = {
presets: [],
}
1、presets预设
就是一组Babel插件,扩展Babel功能
@babel/preset-env
:一个智能预设,允许开发者使用最新的Javascript。@babel/preset-react
:一个用来编译 React jsx 语法设置的预设@babel/preset-typescript
:一个用来编译TypeScript的语法预设//webpack.config.js
{
test: /\.js$/,
exclude: /(node_modules)/, //不处理node_modules目录下的文件
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
或者将上述代码中的options去掉,新增babel.config.js
文件,内容为:
module.exports = {
presets: ['@babel/preset-env']
}
上面的代码,是将打包出来的main.js文件,提前根据设置的输出路径,手动在 index.html 里面通过标签引入,才能正常使用 main.js 的代码,这样比较麻烦,如果是多个文件,还要手动去一一引入。所以这里用插件去处理:
$ npm install --save-dev html-webpack-plugin
//webpack.config.js
//插件
plugins: [
//plugin的配置
new HtmlWebpackPlugin({
//模版:以public/index.html文件为基础,创建新的html文件,
//该文件是在原文件的基础上,新增script标签,script否认路径是打包出来的js路径
//新的html文件的特点:
//1、机构和原来的一直。
//2:自动引入打包输出的资源。
//3:引入的资源是带有 defer 属性的。
//defer是一部加载js,不阻塞dom解析,dom解析完成后执行js,多个defer会按顺序执行
template: path.resolve(__dirname, "public/index.html"),
})
],
原html文件:
打包输出的新的html文件:
$ npm install -D webpack-dev-server
注:如果是mac电脑,且在 vscode 的终端下载成功,但是查询 webpack -v
仍然显示 webpack-dev-server not installed
的情况下,可以试一下在 mac 的终端去执行该命令。
vscode终端下载完以后,查询版本显示:
mac终端下载完以后,查询版本显示:
//webpack.config.js
//模式
mode: "development",
//开发服务器:不会输出资源,在内存中编译打包
devServer: {
host: "127.0.0.1",//启动服务器域名
open: true, //启动服务器端口号
port: 8000 //是否自动打开浏览器
},
启动命令npx webpack serve
或者在 package.json 的 scripts 里面配置命令"serve": "webpack-dev-server --mode development",
,然后使用 npm run serve
启动。
以上功能相关代码见链接: https://pan.baidu.com/s/1cZuSpx1Le2xYDKTHNEe1ZQ?pwd=6pgi 提取码: 6pgi
webpack.comfig.js
文件复制两份到 config 里面,分别命名webpack.dev.js
、webpack.prod.js
webpack.dev.js
的配置"development"
devServer
选项npx webpack serve --config ./config/webpack.dev.js
webpack.prod.js
的配置path: path.resolve(__dirname, "../dist"),
output.clean=true
在打包输出目录前,先删除上一次打包的目录production
devServer
选项npx webpack --config ./config/webpack.prod.js
可以修改 packge.json 中的scripts配置,简化启动命令:
"scripts": {
"start": "npm run dev", //这里实际执行的是下一行的命令
"dev": "webpack serve --config ./config/webpack.dev.js",
"build": "webpack --config ./config/webpack.prod.js"
},
其中,start 配置,可以使用 npm run start
或者npm start
启动,dev和build只能由 npm run XXX
启动。
css文件在此前是被打包到 js 文件中的,是通过js运行时,动态生成的 style标签
这样文件过大的话,会出现闪屏现象,用户体验不好
所以应该时单独的css文件,通过 link 标签加载性能才好(外链引入)
使用 mini-css-extract-plugin
$ npm install --save-dev mini-css-extract-plugin
修改 webpack.prod.js 文件:
//webpack.prod.js
//1、引入相关loader
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //引入插件
//2、将 module.ruls 中原来的 style-loader 替换为 MiniCssExtractPlugin.loader
//加载器
module: {
rules: [
{
test: /\.css$/i, //使用正则匹配.css后缀的文件
//执行顺序:从右到左(从上到下)
use:[
// "style-loader", //将js中的css通过创建style标签的方式,添加到html中
MiniCssExtractPlugin.loader, //将css提取成单独的文件
"css-loader" //将css资源编译成commonjs的模块到js中
]
},
{
test: /\.less$/,
use: [
// "style-loader", //将js中的css通过创建style标签的方式,添加到html中
MiniCssExtractPlugin.loader, //将css提取成单独的文件
"css-loader",
"less-loader" //将less编译成css文件
]
},
}
}
//3、将插件调用
plugins: [
new MiniCssExtractPlugin({
filename: "static/css/main.css"//指定文件路径及名称,不指定默认输出到 dist/main.css
})
]
提取前的引入:
提取后的引入:
部分低版本浏览器无法正确读取 css3 样式,这里可以自动处理其兼容性问题。
$ npm i postcss-loader postcss postcss-preset-env -D
//webpack.prod.js
//加载器
module: {
rules: [
//loader的配置
{
test: /\.css$/i, //使用正则匹配.css后缀的文件
//执行顺序:从右到左(从上到下)
use:[
// "style-loader", //将js中的css通过创建style标签的方式,添加到html中
MiniCssExtractPlugin.loader, //将css提取成单独的文件
"css-loader", //将css资源编译成commonjs的模块到js中
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env",
{
browsers: "last 2 versions" //兼容浏览器最新的两个版本
}
]
}
}
}
]
},
{
test: /\.less$/,
use: [
// "style-loader", //将js中的css通过创建style标签的方式,添加到html中
MiniCssExtractPlugin.loader, //将css提取成单独的文件
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env"
]
}
}
},
"less-loader" //将less编译成css文件
]
}
]
},
"browserslist": [
"last 2 version",
"> 1%",
"not dead"
]
代码中是针对市面上 99% 的浏览器(不包括IE这种已经遗弃的浏览器)的最新的两个版本去做兼容处理。
打包后的css如下:
将样式loader公共的内容提取出来
//webpack.prod.js
function getStyleLoader(pre){
return [
// "style-loader", //将js中的css通过创建style标签的方式,添加到html中
MiniCssExtractPlugin.loader, //将css提取成单独的文件
"css-loader", //将css资源编译成commonjs的模块到js中
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env"
]
}
}
},
pre
].filter(Boolean)
}
//module.ruls里面调整
{
test: /\.css$/i, //使用正则匹配.css后缀的文件
//执行顺序:从右到左(从上到下)
use: getStyleLoader(),
// use: [
// // "style-loader", //将js中的css通过创建style标签的方式,添加到html中
// MiniCssExtractPlugin.loader, //将css提取成单独的文件
// "css-loader",
// {
// loader: "postcss-loader",
// options: {
// postcssOptions: {
// plugins: [
// "postcss-preset-env"
// ]
// }
// }
// }
// ]
},
{
test: /\.less$/,
use: getStyleLoader("less-loader"),
// use: [
// // "style-loader", //将js中的css通过创建style标签的方式,添加到html中
// MiniCssExtractPlugin.loader, //将css提取成单独的文件
// "css-loader",
// {
// loader: "postcss-loader",
// options: {
// postcssOptions: {
// plugins: [
// "postcss-preset-env"
// ]
// }
// }
// },
// "less-loader" //将less编译成css文件
// ]
},
$ npm install css-minimizer-webpack-plugin --save-dev
//1、引入插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
//2、使用插件
plugins: [
new CssMinimizerPlugin(), //压缩css文件
]
webpack
直接打包输出webpack serve
期待开发服务器,内存编译打包,没有输出相关代码:链接: https://pan.baidu.com/s/17w2z0vOYoYgvlCTF–2Lpg?pwd=j0kd 提取码: j0kd