本文代码执行环境:node 10 以上,webpack 4 以上
复制代码
webpack 官网css
官网的定义:vue
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。
当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),
其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。
复制代码
大白话理一下:node
1)看看你的项目webpack
.vue,.js,.css/less/scss/sass
,图片,字体图标……node_modules
2)试想一下web
这样的数量的文件直接如果上传到服务器,得传多久?npm
浏览器挨个读取这么多数量的js文件,而后挨个分析,挨个结合这么多数量的css文件,最后组装呈如今用户面前,用户得等多久?跨域
ES6/7/8等高级语法浏览器不认识,怎么办?浏览器
……缓存
3)而后,你忽然发现这些问题webpack都轻松搞定了。如图所示 sass
这张图中,webpack作了大量工做
node_modules
体积庞大,只要你告诉webpack,它就会智能忽略一些你没用到的部分,加快打包速度针对上边列举的痛点/问题,贴心的webpack一样解决了
经过上边的一堆文字,此时你的心中应该明白了webpack是干什么的,它有什么用。世上任何概念的定义,都是从其性质,适用范围,做用来下的。看到这里的你,脑中已经有了webpack的概念吧?
开始配置前,你须要在根目录建立一个 webpack.config.js
文件
这两个的配置只须要注意两点:出入口数量对应,出入口的路径
数量一致:一入口 VS 一出口,多入口vs 多出口
出入口路径:入口:相对路径;出口:绝对路径
为保证路径准确,须要用到node内置的 path模块,直接require便可
//关于path的用法,小可爱们自行百度
const path = require('path')
// webpack的配置文件遵循着CommonJS规范。什么是ommonJS规范?小可爱们自行百度
module.exports = {
entry: './src/main.js',
output: {
// path.resolve() : 该方法解析当前相对路径的绝对路径
// path.join():用于路径拼接
// output 必须是绝对路径,不然报错
// 方法一:path: path.resolve(__dirname, './dist/'),
// 方法二:path: path.join(__dirname, './dist/'),
filename: 'bundle.js' //指定打包后的文件名
},
}
复制代码
webpack默认只处理js文件,其余非js文件,就须要loaders
出马
(1)注意loaders
的执行顺序:从下到上,从右到左
在平时配置的时候要在查清楚各个loaders的使用先后规则,不然会报错
(2)能够手动干预它们的执行顺序吗?
能够,在use后再加个enforce属性进行配置便可
enforce 可选值:pre:提早;post:后置
(3)webpack 全部类型loaders
的执行顺序:pre > inline > normal > post
inline 指的是在模块中使用
import
等语法导入,进行单独处理的状况,具体小可爱们自行查看官网/百度
(4)通用的配置
无高级语法的状况下
loaders
在webpack的低版本中的写法与如今不一样,4,5版本的写法一致,记住如下写法便可
module
与出入口平级:
module : [ rules : [ {test:// , use:[]/''} ]
复制代码
下面的代码中url-loader
用于处理,归类图片,打包后项目中的图片都会集中放在配置的文件夹下,这里体现了webpack的压缩,归类功能
先npm装一下包,而后再配置
配置exclude: /node_modules/
忽略该文件夹的解析,校验和转译,配置后将大大加快打包速度!
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js' //指定打包后的文件名
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
{
test: /\.s(a|c)ss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
},
// url-loader 基于file-loader 两个功能差很少,只是url-loader 比后者多了些可设置的options
{
test: /\.(jpg|jpeg|png|bmp|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 5 * 1024, //此大小范围内的图片转换成base64,节省请求开销
outputPath: 'images', //dist下建立images文件夹,统一放图片
name: '[name]-[hash:4].[ext]' // 图片文件名+hash值取4位数,ext:原后缀名
}
}
},
{
test: /\.(woff|woff2|eot|svg|ttf)$/,
use: 'url-loader'
},
{
test: /\.js$/,
use: {
loader: 'babel-loader',
// options: {
// presets: ['@babel/env'],
// plugins: [
// '@babel/plugin-proposal-class-properties',
// '@babel/plugin-transform-runtime'
// ]
// }
},
exclude: /node_modules/,
}
]
},
}
复制代码
(5)不可忽视的 babel
高级语法的状况下
babel 的主要做用用于转译,将高级语法转换成浏览器识别的语法
随着项目的不断扩大,你会发现你不知不觉中用了不少 babel 家族的loader和插件,这个时候官方建议咱们在根目录下建立一个.babelrc
文件,专门用来配置babel 家族
有个特别须要注意的点:
配置完babel-loader
后,项目能够转换ES6诸如class定义类这样的语法,可是原型新增的方法[].inculdes()这种,babel 默认是没法转换的,须要装一个补丁polyfill
npm i @babel/polyfill -S
复制代码
在入口处配置
entry: ['@babel/polyfill', './src/main.js'],
复制代码
或者,在使用新方法的地方引入:
import '@babel/polyfill'
复制代码
webpack 官方说5.x之后将取消这个补丁,粗略看了一下更新好像没有移除,辛苦小可爱们给我科普一下,这个补丁后来怎么样了
loader作不到的事,插件作!
步骤:
这一块,实在不知不知道还要讲啥,就上图示范一下配置位置吧
plugins 与出入口平级
const path = require('path')
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'bundle.js' //指定打包后的文件名
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
{
test: /\.s(a|c)ss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
},
// url-loader 基于file-loader 两个功能差很少,只是url-loader 比后者多了些可设置的options
{
test: /\.(jpg|jpeg|png|bmp|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 5 * 1024, //此大小范围内的图片转换成base64,节省请求开销
outputPath: 'images', //dist下建立images文件夹,统一放图片
name: '[name]-[hash:4].[ext]' // 图片文件名+hash值取4位数,ext:原后缀名
}
}
},
{
test: /\.(woff|woff2|eot|svg|ttf)$/,
use: 'url-loader'
},
{
test: /\.js$/,
use: {
loader: 'babel-loader',
// options: {
// presets: ['@babel/env'],
// plugins: [
// '@babel/plugin-proposal-class-properties',
// '@babel/plugin-transform-runtime'
// ]
// }
},
exclude: /node_modules/,
}
]
},
plugins: [
//如下插件是举例:
new CleanWebpackPlugin(),
new CopyWebpackPlugin([{
from: path.join(__dirname, 'assets'),
to: 'assets'
}]),
],
}
复制代码
特地将整段代码贴上,让小可爱们有个直观的认识。
其实就是各类loader和插件的组合
我太饿了 ,我先去吃饭了,后续补充