webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。
1.入门
npm i webpack
npm i webpack-cli
npx webpack “./src/main.js” –mode development
基本的webpack.config.js文件
1 | const path = require('path'); |
1 | { |
2.资源的处理
1.处理css资源
npm i css-loader style-loader -D
1 | const path = require('path'); |
2.处理less资源
npm i less less-loader –save-dev
1 | module: { |
3.处理sass资源
npm i sass sass-loader -D
1 | { |
4.处理图片资源
将图片资源转为base64
1 | { |
5.修改打包输出的文件目录
1.修改js的输出目录
1 | output: { |
2.修改图片的输出目录
1 | { |
6.自动清空上次打包的内容
1 | output: { |
7.处理Html资源
npm i –save-dev html-webpack-plugin
1 | new HtmlWebpackPlugin({ |
8.搭建开发服务器
npm i webpack-dev-server -D
1 | devServer: { |
3.eslint
1.基本配置
1.parserOptions 解析选项
2.rules 具体规则
- off 或0 关闭规则
- warn 或 1 使用警告级别的错误
- error 或 2 使用错误级别的错误
3.extends继承
2.入门
npm i eslint-webpack-plugin –save-dev
npm i eslint –save-dev
- 创建
.eslintrc.js
文件
1 | module.exports = { |
- 创建
.eslintignore
文件
1 | dist //忽略dist文件夹 |
4.babel
将es6转为向后兼容的js代码
1 | npm i -D babel-loader @babel/core @babel/preset-env |
1 | { |
或者将OPtions写到babel.config.js
- 创建
babel.config.js
文件
1 | module.exports = () => ({ |
生产模式的配置
优化代码的性能
优化代码的打包速度
mode: “production”,
5.优化
1.将css打包成单独文件
npm i –save-dev mini-css-extract-plugin
1 | { |
指定输出文件目录
1 | new MiniCssExtractPlugin({ |
2.css兼容性处理
npm i postcss-loader postcss postcss-preset-env -D
1 | { |
在package.json中加入
1 | "browserslist":[ |
3.封装样式Loader函数
1 | function GetStyleLoader(pre) { |
1 | { |
4.css压缩
npm i css-minimizer-webpack-plugin –save-dev
1 | new CssMinimizerPlugin() |
5.sourceMap源代码映射
当我们在开发过程中,可能会出现错误,但是当我们在浏览器调试时会发现,报错的位置是打包后的位置,因此我们需要sourceMap定位源代码错误的位置,更方便开发
1 | devtool: "eval-cheap-module-source-map" ///开发环境使用 |
6.提升打包速度
1 | devServer: { |
7.OneOf
每个文件只能被其中一个Loader(配置)处理
1 | module: { |
8.Include/Exclude
Exclude 排除,除了指定的都处理
Include 制定 处理制定的
1 | { |
9.Bable和Eslint的缓存
Bable
1 | { |
Eslint
1 | new ESLintWebpackPlugin( |
10.多进程打包
npm i thread-loader -D
1 | const os = require('os') |
1 | test: /\.js$/, |
1 | new ESLintWebpackPlugin( |
压缩js
1 | const TerserWebpackPlugin = require('terser-webpack-plugin') |
更改压缩插件的位置
1 | optimization:{ |
11.减少图片体积
npm i image-minimizer-webpack-plugin imagemin -D
无损压缩
npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo –save-dev
1 | const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin"); |
12.进一步解决兼容性问题
coreJs npm i core.js
babel.config.js
1 | module.exports = function(api) { |
13.PWD
npm install workbox-webpack-plugin –save-dev
1 | const WorkboxPlugin = require('workbox-webpack-plugin'); |
注册 Service Worker
npx SW registered
启动服务
1 | npm i server -g |
6.CodeSplit
1.CodeSplit
添加多入口
1 | const path = require('path'); |
1 | const path = require('path'); |
动态导入(Dynamic Imports)
通过模块的内联函数调用来分离代码。例如,使用import()
函数:
1 | import(/* webpackChunkName: 'subPageA' */'./subPageA').then(function(res){ |
防止依赖重复
1 | const path = require('path'); |
2.SplitChunksPlugin
1 | const path = require('path'); |
3.preload、prefetch
npm i –save-dev @vue/preload-webpack-plugin
1 | const PreLoadWebpackPlugin = require('@vue/preload-webpack-plugin'); |
7.typeScript
npm install –save-dev typescript ts-loader
tsconfig.js
1 | { |
webpack.config.js
1 | const path = require('path'); |
8.react-cli
1.webpack.dev.js
基本配置
1 | const path = require("path") |
.eslintrc.js
1 | module.exports = { |
babel.config.js
1 | module.exports = { |
npm i eslint-webpack-plugin html-webpack-plugin css-loader postcss-loader style-loader less-loader postcss-preset-env sass stylus-loader sass-loader -D
npm i -D babel-loader @babel/core babel-preset-react-app eslint-config-react-app -D
npm i webpack-dev-server webpack webpack-cli -D
npm i react react-dom
2.解决启动后报错的问题
1 | Error: [BABEL] D:\MyTest\cli\src\index.js: Using `babel-preset-react-app` requires that you specify `NODE_ENV` or `BABEL_ENV` environment variables. Valid values are "development", "test", and "production". Instead, received: undefined. (While processing: "D:\\MyTest\\cli\\node_modules\\babel-preset-react-app\\index.js") |
npm i –save-dev cross-env
设置启动脚本为 “serve”: “cross-env NODE_ENV=production webpack serve –config ./config/webpack.dev.js”,
1 | //在webpack.config.js中配置 |
3.更新局部代码
npm i -D @pmmmwh/react-refresh-webpack-plugin react-refresh
1 | const ReactRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin') |
4.解决路由报错问题
在我们使用react-router-dom的时候会出现这样的问题
Cannot GET /about
1 | devServer:{ |
5.生产模式
1 | const path = require("path") |
npm i css-minimizer-webpack-plugin mini-css-extract-plugin terser-webpack-plugin -D
6.图标的解析
npm i copy-webpack-plugin -D
1 | const CopyWebpackPlugin = require('copy-webpack-plugin'); |
7.合并配置
webpack.config.js
1 | const path = require("path") |
8.优化
npm i antd
1 | //webpack.config.js |
分开打包cacheGroups
1 | optimization: { |
1 | module.exports = { |
9.VueCli
1.vue-loader
npm install -D vue-loader vue-template-compiler
npm i eslint-webpack-plugin html-webpack-plugin vue-style-loader css-loader postcss-loader sass less-loader sass-loader stylus-loader babel-loader postcss-preset-env webpack webpack-cli webpack-dev-server cross-env -D
1 | // webpack.config.js |
.eslintrc.js
1 | module.exports = { |
babel.config.js
1 | module.exports = { |
npm i @babel/eslint-parser eslint-plugin-vue -D
2.给vue赋值全局变量
1 | const {DefinePlugin} = require("webpack") |
3.整体开发模式下vue的配置
1 | const path = require("path") |
4.生产模式配置
1 | const path = require("path") |
npm i mini-css-extract-plugin css-minimizer-webpack-plugin terser-webpack-plugin copy-webpack-plugin html-webpack-plugin -D
5.合并配置
webpack.config.js
1 | const path = require("path") |
6.element-plus的使用
npm i element-plus
1 | //全部引入 |
按需导入
npm install -D unplugin-vue-components unplugin-auto-import
npm i unplugin-vue-components@0.25.2 -D npm install unplugin-auto-import@0.16.1
1 | // webpack.config.js |
按需导入的使用
1 | <template> |
7.使用路径别名
1 | resolve: { |
8.优化
1 | splitChunks: { |
1 | module.exports = { |
最后的完整配置
1 | const path = require("path") |
10.原理分析
1.构建Loader
npm i html-webpack-plugin webpack webpack-cli -D
1 | const path = require("path") |
定义loader文件
1 | //loaders/test-loaders.js |
在rules中配置
1 | //webpack.config.js |
输出结果
let arr = [1,2,3,4] ===>该文件为mian.js中的文件
1 | /* |
2.同步loader
1 | module.exports = function(content,map,meta){ |
3.异步loader
1 | module.exports = function(content,map,meta){ |
4.raw loader
1 | //<Buffer 6c 65 74 20 61 72 72 20 3d 20 5b 31 2c 32 2c 33 2c 34 5d 0d 0a>' |
5.pitch loader
优先执行pitch内的方法
1 | module.exports = function(content){ |
6.自定义loader
清除所有的console.log()语句
1 | module.exports = function(content){ |
schema.json
1 | { |
banner-loader.js
1 | const schema = require("./schema.json") |
webpack.config.js
1 | { |
7.file-loader
file-loader.js
1 | const loaderUtils = require("loader-utils") |
webpack.config.js
1 | { |
8.style.lodaer
1 | module.exports.pitch = function(remainingRequest){ |
11.plugin
1.自定义plugin
1 | class TestPlugin{ |
2.hooks的创建
1 | apply(compile){ |
1 | class TestPlugin { |
3.在文件前添加注释的plugin
1 | class BannerPlugin{ |
传递参数
1 | new BannerPlugin({ |
4.clean-plugins
清空输出目录的资源
1 | class CleanPlugin{ |
5.AnalyzeWebpackPlugin
分析包的大小
1 | class AnalyzePlugin{ |
6.inlinePlugin
将runtime文件内联到html文件
1 | const HtmlWebpackPlugin = require("safe-require")("html-webpack-plugin") |