webpack
遇到的问题:
- 如何全局引入less
vue-cli里面的globalVar不知道为啥,我引用不了,只能使用这个。
webpack使用的插件
- eslint-webpack-plugin(实现eslint校验)
- html-webpack-plugin(自动在html中生成main.js文件)
- mini-css-extract-plugin(是为了防止闪屏,简而言之就是css文件的解析不会在js文件之后再解析)
- css-minimizer-webpack-plugin(是为了解压css文件)
- webpack-parallel-uglify-plugin(提高打包速度的插件)
- webpack-bundle-analyzer(实现每段内容所加载的时间)
基础篇
*webpack常用的配置
*development模式下的配置
*production模式下的配置
高级篇
*devtool(实现编译之后也还能看到原代码)
*oneOf
*include/exclude
*cache
*Thead
*babel中辅助代码
我们平时使用的es6,promise函数等操作,有时候浏览器并不能识别,这时候通过webpack打包工具解析成浏览器可以识别的东西。
- 通常面对小图片的时候,我们可以将其转化为base64,减少网络请求。(快了很多) 写在background-image下,转化为base64
- 在vue项目中配置webpack的时候,首先是在vue.config.js中配置webpack,同时在配置之前,首先应该添加configureWebpack,然后在按照webpack文档来依次配置。
module.exports = {
// 配置webpack
configureWebpack: {
module: {
rules: [
{
test: /\.png$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 4 * 1024 // 4kb
}
}
}
]
}
}
}
- 通过babel将es6语法打包直接转换为可以兼容浏览器的语法。
development模式下的配置
webpack常用的配置
webpack只可以解析js,json文件。
入口地方
- entry(需要解析需要解析的内容,将es6语法转化为浏览器可以解析的内容)
输出地方
- output(1.path:解析目标的文件夹;2.filename:存放js文件的地方;3.clean:每次解析后自动更新文件夹里面的内容。
加载器
- module(rules(数组规则):(1.test:需要测试的文件后缀名是什么。2.use:需要用到的是什么包(执行是从右到左)。
插件
- plugins(需要用到的插件是什么.)
模式
- mode(开发的模式什么,一个是development(开发),一个是production(生产))
服务器
- devServer(服务器的配置,vue在这里可以配置跨域的问题,同时也可以设置自动打开的功能。)
代码部分
//development模式下配置的部分配置项。
// serve启动devServer配置,实现自动更新,--config是文件夹名字
// npx webpack serve --config 文件名是啥
const path = require("path");
// eslint语法插件的引入
const ESLintPlugin = require("eslint-webpack-plugin");
// 自动打包生成html文件(解决js文件更新的问题)
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
// 入口(相对路径)
entry: "./src/js/main.js",
// 输出
output: {
// 输出路径(绝对路径)(文件名默认dist)
path:undefined,
// js文件夹中放js文件
filename: "js/main.js",
//images文件夹中放图片路径(保留10位长度图片)
// assetModuleFilename:'images/[hash:10][ext][query]',
// 自动清空上次打包结果
clean: true,
},
// 加载器(实现对除了js,json文件外的所有文件进行编译,比如css等)
module: {
rules: [
// css转换
{
test: /\.css$/,
// 执行顺序是从右到左
use: ["style-loader", "css-loader"],
},
// less转换
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
// 当图片小于10kb的时候转化为base64
{
test: /\.(png|jpe?g|bmp|gif)/,
type: "asset", //会转base64
parser: {
dataUrlCondition: {
maxSize: 4 * 1024, // 4kb
},
},
//生成文件的地方
generator: {
filename: "static/images/[hash][ext][query]",
},
},
// 把这些后缀名放到一个指定的文件夹里面
{
test: /\.(ttf|woff2|woff)$/,
type: "asset/resource",
//生成文件的地方
generator: {
filename: "static/fonts/[hash][ext][query]",
},
},
],
},
// 插件
plugins: [
//都是相对路径
new ESLintPlugin({
// 指定需要校验的地方
context: path.resolve(__dirname, "./src"),
}),
//自动添加js文件
new HtmlWebpackPlugin({
template: "./public/index.html",
}),
],
//服务器
devServer:{
host:'localhost',
port:'8080',
open:true
},
// 开发模式(开发模式:development,生产模式:production)
mode: "development",
};
production模式
- 文件压缩(压缩css文件)
- css样式的兼容性(需要兼容的内容写在"browserslist"数组中)
- 小图片转换为base64
- 安装打包加速的插件
- html和js文件是自动压缩
//development模式下配置的部分配置项。
// serve启动devServer配置,实现自动更新,--config是文件夹名字
// npx webpack serve --config 文件名是啥
const path = require("path");
// eslint语法插件的引入
const ESLintPlugin = require("eslint-webpack-plugin");
// 自动打包生成html文件(解决js文件更新的问题)
const HtmlWebpackPlugin = require("html-webpack-plugin");
// 每次解析都是先是js然后才是css或者less文件,这时候可以使用新的插件,实现各忙各的同时加载。
//实现防止闪屏
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
//压缩文件
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
module.exports = {
// 入口(相对路径)
entry: "./src/js/main.js",
// 输出
output: {
// 输出路径(绝对路径)(文件名默认dist)
path: path.resolve(__dirname, "../dist"),
// js文件夹中放js文件
filename: "js/bundle.js",
//images文件夹中放图片路径(保留10位长度图片)
// assetModuleFilename:'images/[hash:10][ext][query]',
// 自动清空上次打包结果
clean: true,
},
// 加载器(实现对除了js,json文件外的所有文件进行编译,比如css等)
module: {
rules: [
// css转换
{
test: /\.css$/,
// 执行顺序是从右到左
//原先是style.loader
use: [
//实现css文件解析与js同步。
MiniCssExtractPlugin.loader,
"css-loader",
//解决css兼容性的问题
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
],
},
// less转换
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
"less-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
],
},
// 当图片小于10kb的时候转化为base64
{
test: /\.(png|jpe?g|bmp|gif)/,
type: "asset", //会转base64
parser: {
dataUrlCondition: {
maxSize: 4 * 1024, // 4kb
},
},
//生成文件的地方
generator: {
filename: "static/images/[hash][ext][query]",
},
},
// 把这些后缀名放到一个指定的文件夹里面
{
test: /\.(ttf|woff2|woff)$/,
type: "asset/resource",
//生成文件的地方
generator: {
filename: "static/fonts/[hash][ext][query]",
},
},
],
},
// 插件
plugins: [
//都是相对路径
new ESLintPlugin({
// 指定需要校验的地方
context: path.resolve(__dirname, "./src"),
}),
//自动添加js文件
new HtmlWebpackPlugin({
template: "./public/index.html",
}),
//实现css与js隔离开,各自加载各自的.
new MiniCssExtractPlugin({
filename: "static/css/main.css",
}),
],
// 开发模式(开发模式:development,生产模式:production)
mode: "production",
};
devtool
这样设置的话,可以直接看到编译之前错误的代码位置,缺点就是生产模式下,速度太慢,尽量别用。
//使得错误的显示地方不是编译之后的位置,而是原先自己代码的位置
//(development模式下)
devtool:'cheap-module-source-map'
// (production模式下)
// devtool:'source-map'
oneOf
比如寻找后缀名是css,还是less的时候,我们会都遍历一遍,如果通过这个的话,找到一个后缀名的时候,就停止该文件的寻找,直接进行下一个文件的查找。
module:{
rules:[
{
//每一个文件只能被一个loader匹配,匹配到就不再匹配后面的了。
oneof:[
{
test:/\.css$/,
use:['style-loader','css-loader'],
generator:{
filename:'css/main.css'
}
},
{
test:/\.less$/,
use:['style-loader','css-loader','less-loader'],
generator:{
filename:'less/main.less'
}
},
{
test:/\.js$/,
use:['babel-loader']
}
]
}
]
},
include/exclude
我们在babel编译js文件的时候,并没有排除node_module文件,也会一并带入,而node_module文件是我们引入的包,也就是并不需要编译他,所以排除他,就可以提高我们的打包速度。
eslint当中也可以排除这个。
{
test:/\.js$/,
use:['babel-loader'],
//js文件下写。
//两个只需要写一个就可以,否则报错。
//exclude:/node_modules/,//排除node_modules下的文件,其他文件都处理
include:path.resolve(__dirname,'./src'), //只处理src里面的文件,其他文件不处理
}
cache
`我们在打包的时候,可以对之前编译的内容进行保存,这样下次就需要再进行这个内容的编译。`
eslint当中也可以用这个。
{
test:/\.js$/,
use:['babel-loader'],
// build中常用。
options:{
// 开启babel缓存
cacheDirectory:true,
// 关闭缓存文件压缩
cacheCompression:false
}
}
Thead
简而言之就是之前是一个打包东西,但是现在通过这个可以进行多人的进行该内容的打包编译,缺点就是你需要多付钱,但是项目大的时候这个很有用。
- 先获取自己cpu内核数量
- 然后安排干活
- 最后开始干活
1.
// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;
//下载包
npm i thread-loader -D
2.
{
test: /\.js$/,
use: [
{
loader: "thread-loader", // 开启多进程
options: {
workers: threads, // 数量
},
},
{
loader: "babel-loader",
options: {
cacheDirectory: true, // 开启babel编译缓存
},
},
],
}
3.
optimization: {
minimize: true,
minimizer: [
// css压缩也可以写到optimization.minimizer里面,效果一样的
new CssMinimizerPlugin(),
// 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
new TerserPlugin({
parallel: threads // 开启多进程
})
],
},